SORACOM × YAMAHA ルーターでアレコレ

この記事は[SORACOM Advent Calendar 2019](https://qiita.com/advent-calendar/2019/soracom)の22日目の記事です。

逸般の誤家庭用ルーターとして定番の YAMAHA さんのルーター RTX-1200 と SORACOM でできる事をいろいろ試してみました。

# RTX-1200 で SORACOM Air を使う

## モデムの入手
RTX-1200 で SORACOM Air の接続を行うためには、USB モデムを使うのが良いでしょう。
現行の製品だと [NCXX UX302NC-R](https://soracom.jp/products/module/ux302nc-r/) が LTE の接続も出来ておすすめです(SORACOMのユーザコンソールからも発注できます)。
うちでは、昔懐かしい富士ソフトさんの[FS01BU](https://www.fsi.co.jp/mobile/plusF/products/FS01BU.html)を使っています。
その他の製品は、[こちらのページ](http://www.rtpro.yamaha.co.jp/RT/docs/mobile-internet/#cellphones)に対応表がありますので、なんとかして入手してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/3936e1c8-5e9e-f6af-3d35-0de91754be29.png)

## モデムの設定
Web UI からであれば、ルーター機能→インターフェースから、 PPP(モバイル)インターフェースを追加、で下記のようなメニューが出てきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/4e2dd768-b099-ad34-a95d-525d2a7904cd.png)

残念ながら SORACOM は選択肢にないようなので、適当に選び、次の画面で APN 設定を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/eb01d032-6bf1-7138-acb5-47fca531d48a.png)

もし、コマンドラインから設定する場合には、下記のようになります。

```
pp select 100
 description pp SORACOM
 pp bind usb1
 pp keepalive interval 60 retry-interval=60 count=5
 pp always-on on
 pp auth accept pap chap
 pp auth myname sora sora
 ppp ipcp ipaddress on
 ppp ipcp msext on
 ppp ipv6cp use off
 ip pp nat descriptor 1000
 mobile auto connect on
 mobile disconnect time off
 mobile disconnect input time off
 mobile disconnect output time off
 mobile access-point name soracom.io cid=1
 mobile access limit length off
 mobile access limit time off
 pp enable 100
```

下記のようなコマンドで接続状況が確認できます。

```
> show status pp 100
PP[100]:
Description:PRV/MOBILE/0:SORACOM
Mobile device is Online.
Connecting to soracom.io
outgoing side,
14 hours 38 minutes 22 seconds  connection.
Received:    1355 times [219977 octets]
Transmitted: 1416 times [169130 octets]
Time total: 1 day 21 hours 59 minutes 5 seconds
Received total:    12511 times [3820830 octets]
Transmitted total: 11500 times [1819576 octets]
Alert: None
Discard Received: 0 time [0 octet]
Discard Transmit: 0 time [0 octet]
FCS error: 0  total: 0
    rx discard: 0  queue length: 0/20
    tx discard: 29  error: 0
PPP Configure Options
    LCP Local: Magic-Number ACCM PFC, Remote: CHAP Magic-Number ACCM PFC
    IPCP Local: IP-Address Primary-DNS(100.127.0.53) Secondary-DNS(100.127.1.53
), Remote:
    PP IP Address Local: 10.145.79.159, Remote: Unnumbered
    CCP: None
```

のようになります。

また、SORACOM の各種サービスを使う場合には、下記のように `100.127.0.0/16` を SORACOM 経由にしておく必要があります。

```
ip route 100.127.0.0/16 gateway pp 100
```

# SORACOM Napter を使ってリモートから設定を行う
リモートから接続を行うためには、ポート転送の設定が必要となります。

## 下準備
下記のようにコンソールの設定と SSH と HTTP 用の転送設定を入れておきます。

```
# console prompt "RTX "
RTX # console character ascii
RTX # nat descriptor masquerade static 1000 22 192.168.100.1 tcp 22
RTX # nat descriptor masquerade static 1000 80 192.168.100.1 tcp 80
```

## SSH での接続
SSH で接続を行うためには、SSH を有効にする必要があります。アクセス管理 → SSH・SFTP の設定から、SSH を有効にします。
アクセス元には LAN のアドレスと Napter 用に `192.168.100.1-192.168.1.254 100.127.10.16`  を許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/577634fb-cc82-0019-1144-f0139aed1046.png)

設定ができたら、SORACOM のユーザーコンソールで、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/03880218-36ef-d8de-6056-90e834bff3ea.png)
のように、TLS をオフでアクセス許可を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/c70da34e-0054-e9e5-a253-c8c09559f8b8.png)
表示されている SSH 用のコマンドの user 部分を読み替えて、SSH コマンドを実行します。

```
$ ssh -p 33368 moto@18.177.98.46
The authenticity of host '[18.177.98.46]:33368 ([18.177.98.46]:33368)' can't be established.
RSA key fingerprint is SHA256:bDybM0KoJgjgkpgfaYYejxkcOeL1fJ3UZV/XFpsk9ew.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[18.177.98.46]:33368' (RSA) to the list of known hosts.
moto@18.177.98.46's password:


RTX1200 Rev.10.01.75 (Fri Feb 16 13:38:37 2018)
  Copyright (c) 1994-2018 Yamaha Corporation. All Rights Reserved.
  Copyright (c) 1991-1997 Regents of the University of California.
  Copyright (c) 1995-2004 Jean-loup Gailly and Mark Adler.
  Copyright (c) 1998-2000 Tokyo Institute of Technology.
  Copyright (c) 2000 Japan Advanced Institute of Science and Technology, HOKURIKU.
  Copyright (c) 2002 RSA Security Inc. All rights reserved.
  Copyright (c) 1997-2010 University of Cambridge. All rights reserved.
  Copyright (C) 1997 - 2002, Makoto Matsumoto and Takuji Nishimura, All rights reserved.
  Copyright (c) 1995 Tatu Ylonen , Espoo, Finland All rights reserved.
  Copyright (c) 1998-2004 The OpenSSL Project.  All rights reserved.
  Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) All rights reserved.
  Copyright (c) 2006 Digital Arts Inc. All Rights Reserved.
  Copyright (C) 1994-2012 Lua.org, PUC-Rio.
  Copyright (c) 1988-1992 Carnegie Mellon University All Rights Reserved.
  Copyright (C) 2004-2007 Diego Nehab. All rights reserved.
  Copyright (c) 2005 JSON.org
00:a0:de:6a:de:8e, 00:a0:de:6a:de:8f, 00:a0:de:6a:de:90
Memory 128Mbytes, 3LAN, 1BRI
>
```

無事にログインすることができました！

## Web GUI の接続
アクセス管理 → GUI の設定で、同様に `192.168.100.1-192.168.100.254 100.127.10.16` を許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/8af62676-49e1-e1a7-afa9-e7ae0074f257.png)
次に SORACOM ユーザーコンソールで TLS オン、ポート 80 番でアクセス許可します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/47c98953-e27e-0fc1-f26b-9d1205c772ec.png)
表示されたアドレスにアクセスしてみるとログインを求められるので、パスワードを入れて
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/1c9fb068-8f0b-ee1f-6eec-35f55d30ffa4.png)
ログインすることが出来ました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/1c077646-b68e-2028-22f3-705e77508460.png)

# RTX-1200 の稼働状況をモニタリングする (Harvest/Lagoon)
Lua スクリプトと Harvest を使って RTX-1200 の稼働状況を記録し、さらに Lagoon でダッシュボードを作ってみましょう。

## 設定
### SORACOM Harvest を有効にしておきます。
グループ設定で Harvest を ON にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/b78b3777-a372-175e-96ed-4c95f10a2947.png)

### スクリプトの設置

次にスクリプト(`harvest.lua`)をダウンロードします
https://gist.github.com/j3tm0t0/a3a47b48befee1e64df9b69a4b16b015

- WAN 接続のためのインターフェースが LAN2 以外の場合は、適宜変更してください
- デフォルトでは毎秒のトラフィックを計測し、１分間の最大トラフィックと平均のトラフィックを記録するようにしています

Lua スクリプトをアップロードするには、tftp や sftp を使います。

```:下準備
RTX # make directory /lua
RTX # tftp any
RTX # sftpd host any
```

> 設定が終わったら `tftp none` / `sftpd none` を実行して tftp や sftp が使えないようにしておきましょう

```:tftp
$ cat upload.sh
#!/bin/bash
password=hogehoge # Administrator パスワード
router=192.168.100.1
if [ "$2" = "" ]
then
    echo $0 [file to upload] [path to upload]
    exit
fi
echo put $1 $2/$1/$password | tftp $router
$ ./upload.sh harvest.lua /lua
Sent 4828 bytes in 0.1 seconds
```

```:sftp
$ sftp 192.168.100.1
moto@192.168.100.1's password: (注意: ここでは、administrator パスワードを入れる必要があります！)
Connected to 192.168.100.1.
sftp> cd lua
sftp> put harvest.lua
Uploading harvest.lua to /lua/harvest.lua
harvest.lua                                                100% 4669   453.2KB/s   00:00
sftp>
```

### 実行
まずはルータのコンソールからテストで１回実行してみましょう。

```:テスト実行
RTX # lua /lua/harvest.lua
```

SIM 一覧から、SIM を選択し「操作」から「データを確認」を選びます。自動更新を ON にしておきましょう。

１分後に Harvest にデータが届いたら、送信されたデータが表示されると思います。これを毎分実行するようにしてみましょう。

```:スケジュール設定
RTX # schedule at 1 */* *:* * lua /lua/harvest.lua
```

しばらくするとこのようなグラフが記録されます。

![Harvest](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/9d0f91a5-df61-9a71-2f69-9157d3369566.png)

### Lagoon でダッシュボードを作る

このままでは少し見づらいので、SORACOM Lagoon を設定してダッシュボードを作ってみました。

![Lagoon](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/bff4ea9e-bbca-584f-a5c1-d29107ae3e5a.png)

#### 設定のポイント

- down_max / down_avg を 表示＞系列のオーバーライド＞系列固有のオーバーライドで、Y軸を反転する (マイナス方向にする)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/40e1e95e-3c71-f785-6daf-d2b1a2d50ccf.png)
- temp を 表示＞系列のオーバーライド＞で Y-Axis を 2(右側) にする (その他の項目は % なので、右側の軸を温度℃として独立させる)

- SORACOM Lagoon のより詳しい使い方については、下記のリンクを参照ください
https://dev.soracom.io/jp/lagoon/what-is-lagoon/
https://dev.soracom.io/jp/start/lagoon-dashboards/
https://dev.soracom.io/jp/start/lagoon-panel/

# Dynamic DNS を設定する (Funk)
外出時や海外にいる時に、自宅に VPN 接続して安全にインターネットを利用したい場合があります。そういった際の接続先として固定 IP アドレスが使えれば良いのですが、現在使っている契約では固定 IP アドレスの契約がありませんでした。そこで、DDNS (Dynamic DNS) を利用して接続先のホスト名が常にルータの IP アドレスとなるようにします。

RTX-1200 では標準で NetVolante の DDNS 機能が使えますが、Route53 で管理しているドメインの hostname としてルータのアドレスが引けるようにしたかったので、Lambda で更新をしようと思いましたが、RTX-1200 の Lua では HTTPS が利用できません。そのため、API Gateway + Lambda という構成は取れません。
そこで SORACOM Funk と AWS Lambda を使って実装してみたいと思います。

```:構成
RTX-1200 (Lua) -(http post)-> http://funk.soraocm.io -> Lambda -> Route53
```

## 設定

スクリプトは[こちら](https://gist.github.com/j3tm0t0/ce85fafe4f36736767b6f2b4654627f5) からダウンロードします。
- `lambda_function.py` Lambda に設置するスクリプト
- `ddns.lua` RTX 側のスクリプト

### IAM 設定
[AWS IAM コンソール](https://console.aws.amazon.com/iam/home?#/users$new?step=details)から、Funk で使用する IAM ユーザを作成します。
- ユーザ名: 任意 (funk-rtx など)
- アクセスの種類: プログラムによるアクセス

アクセス権限には、下記のようなポリシーを作成して指定しておきます

```JSON:IAMuserPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:InvokeFunction",
            "Resource": "*"
        }
    ]
}
```

作成が完了した際に表示される「アクセスキー ID」と「シークレットアクセスキー」をメモしておきます（または .csv ファイルをダウンロードしておきます）。

### Lambda 設定
AWS Lambda コンソールから関数の作成で「一から作成」を選び、関数名(`update_route53`など)とランタイム(`Python3.8`)を指定します。
Role の設定として `AWSLambdaBasicExecutionRole` と 下記のようなポリシーを持つ Role を作成します (`AmazonRoute53FullAccess` でも動作します)。

```JSON:LambdaPolicy
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "route53:ChangeResourceRecordSets",
            "Resource": "*"
        }
    ]
}
```

関数が作成されたら `lambda_function.py` の内容をペーストして「保存」を押します。
最後に Function の右上に表示されている ARN をコピーしておきます。

> 例) `arn:aws:lambda:ap-northeast-1:123412341234:function:update_route53`

### SORACOM Funk 設定
グループ設定を開きます
- Funk 設定を ON にして `AWS Lambda` を選択
- 関数の ARN に先ほどコピーした ARN を入れる

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/02d103b6-ce57-56ed-a5e5-b4bac2248984.png)

- 「認証情報を新規作成する...」を選び、作成しておいた IAM ユーザの情報を入れ「登録」を押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/30051/bd286126-035c-696f-fbb6-891183dbaccc.png)

最後に「保存」を押せば設定は完了です。

### Lua スクリプトの設置

ダウンロードした ddns.lua ファイルの先頭の設定を編集します。

```lua:ddns.lua
-- 設定項目
wan_if = "pp 1"
hosted_zone_id = "Z1234567890ABC"
name = "ddns.example.com"

(以下略)
```

先ほどと同じ手順で `/lua/ddns.lua` にアップロードします。

```:tftp
$ ./upload.sh ddns.lua /lua/
Sent 1271 bytes in 0.1 seconds
```

または

```:sftp
$ sftp 192.168.100.1
moto@192.168.100.1's password: (Administratorのパスワード)
Connected to 192.168.100.1.
sftp> put ddns.lua /lua/
Uploading ddns.lua to /lua/ddns.lua
ddns.lua                                                       100% 1225   278.3KB/s   00:00
```

## 実行
先ほどと同様に、コマンドラインから実行してみましょう。

```
RTX # lua /lua/ddns.lua
```

```
RTX # show log reverse
2019/12/22 16:35:26: 200:"OK"
```

と表示されていれば、正常に実行されました。

```
$ host ddns.example.com
ddns.example.com has address xxx.xxx.xxx.xxx
```

DNS レコードが正しくアップデートされました！
これをスケジュール実行しておけば、IP アドレスが変わっても自動的に更新されます。

```
RTX # schedule at 2 */* *:00 * lua /lua/ddns.lua
```

# 最後に
駆け足で色々なサービスと連携させてみましたが Napter 経由での設定は特に便利だと思います。
インターネット回線故障時などのためにバックアップ回線としてモバイル回線を設定されている人もいらっしゃると思いますが、何かあった時のためにぜひ Napter のための設定を入れておくことをお勧めします！