CANDY Pi Lite+ Dで固定IPアドレスSIMイプシムを使う

[CANDY LINE様](https://www.candy-line.io/)のラズベリーパイ向け3G/4G LTE両対応の通信ボード「[CANDY Pi Lite+ D](https://www.candy-line.io/%E8%A3%BD%E5%93%81%E4%B8%80%E8%A6%A7/%E3%81%94%E8%B3%BC%E5%85%A5#candy-pi-lite-plus-d)」で、グローバルIPアドレス固定割当の格安SIM[イプシム](https://ipsim.net/)を使ってみます。同じソフトウェアで動作する「CANDY Pi Lite LTE」や「CANDY Pi Lite 3G」でも同じです。
![CANDYPiLite+_1.jpg](https://qiita-image-store.s3.amazonaws.com/0/211762/645b17af-2373-48b0-ef73-621e86c68a75.jpeg)

#何ができるの？
有線LAN・無線LANが無い環境でも、外部からラズパイを制御できます。

##ポイント

- ラズパイに直接グローバルIPアドレスが割り当てられます → APNを設定するだけ！
- Internet側からラズパイに接続可能です → ufwで必要な通信のみ許可します

※デフォルトの状態で使うと危険です。必ずufwやiptablesの設定を行いましょう。
※CANDY LINE提供のOSイメージを用いる場合は、予めufwが有効になっています。

##準備するもの
![ipsim.jpg](https://qiita-image-store.s3.amazonaws.com/0/211762/4af8b5df-1f10-8140-90e7-4e0576b2f48b.jpeg)

- Raspberry Pi 3 Model B
- ラズベリーパイ向け3G/4G LTE両対応の通信ボード「[CANDY Pi Lite+ D](https://www.candy-line.io/%E8%A3%BD%E5%93%81%E4%B8%80%E8%A6%A7/%E3%81%94%E8%B3%BC%E5%85%A5#candy-pi-lite-plus-d)」
- 通信用USBケーブル A to micro B（いわゆるmicro USBケーブル）
- 適当な容量のmicroSDカード（[OSイメージアップデート v3.0.0](https://forums.candy-line.io/t/os-v3-0-0/142)）、ACアダプタ、ケーブルなど
- 固定IPアドレスMVNO「[イプシム](https://ipsim.net/)」nano SIM
- モニタ・キーボード（または設定用PC＋DHCPが有効な有線LAN）

#開封から接続まで
##セットアップ（約15分）
![CANDYPiLite+_2.jpg](https://qiita-image-store.s3.amazonaws.com/0/211762/3da8e387-eeae-713e-de22-be4c07d621e4.jpeg)

1. microSDカードに[OSイメージアップデート v3.0.0](https://forums.candy-line.io/t/os-v3-0-0/142)を[書き込み](https://candy-line.tumblr.com/post/167761781228/candy-pi-lite-os-image-etcher)ます。sshで接続できるよう、`/boot/ssh`の空ファイルも作成しておきます。
2. CANDY Pi Lite+ Dを[組み立て](https://candy-line.gitbooks.io/candy-pi-lite/content/setup/assemble-plus.html)、イプシムのSIMカードを取り付け[^1]ます。せっかくなので、高速通信が可能となるUSB拡張ボードも[取り付け](https://candy-line.gitbooks.io/candy-pi-lite/content/setup/usb.html)ましょう。[^2]
3. ラズパイにモニタ・キーボードを接続します。なお、DHCPの割当状態が確認できる場合は、代わりに有線LANに接続し、ラズパイに割り当てられたIPアドレスを確認してください（ssh接続で作業できますので、モニタ・キーボードは不要です）。
4. 起動します。

[^1]: nano SIMです。
[^2]: ラズパイ純正ケースでもなんとか入りました。当然蓋は閉まりませんが…。

##初期設定（約1分）

1. ラズパイにコンソールまたはsshでログインします。

1. イプシムのAPNを設定します。
    イプシムのAPNはOSイメージにプリセットされていないので、手動で[APN情報](https://ipsim.net/support.html)を[設定](https://candy-line.gitbooks.io/candy-pi-lite/content/configuration/apn.html)します。[^3]

    ```
sudo vi /boot/apn
```

	```text:/boot/apn
	{
	  "apn": "4gn.jp",
	  "user": "sim@with",
	  "password": "sim"
	}
	```

1. いったん電源をOFFにします。

    ```
sudo shutdown -h now
```

[^3]: OSイメージを書き込んだPC等で直接`/boot/apn`ファイルを生成しても構いません。（改行コードに注意）

##接続確認（約3分）

1. 電源をON、CANDY Pi Lite+のグリーンLEDが
    `《ゆっくり点滅》→《はやい点滅》→《点灯または点滅》`
    と変化することを確認します。またその後オレンジLEDが
    [《0.4秒間隔で点滅》](https://candy-line.gitbooks.io/candy-pi-lite/content/configuration/led.html)
    することを確認します。

1. candy-pi-lite サービス

	```text:candy-pi-lite
	$ sudo systemctl status candy-pi-lite
	● candy-pi-lite.service - CANDY Pi Lite Service, version:4.0.0
	   Loaded: loaded (/lib/systemd/system/candy-pi-lite.service; enabled; vendor preset: enabled)
	   Active: active (running) since Mon 2018-05-14 19:00:02 JST; 1 weeks 0 days ago
	 Main PID: 415 (bash)
	   CGroup: /system.slice/candy-pi-lite.service
	           ├─ 415 bash /opt/candy-line/candy-pi-lite/start_systemd.sh
	           ├─ 823 bash /opt/candy-line/candy-pi-lite/start_systemd.sh
	           ├─ 836 pppd /dev/QWS.EC25.MODEM 460800 user sim@with password sim connect ''chat -s  ABORT "NO CARRIER" ABORT "ERROR" ABORT "NO DIALTONE" ABORT "BUSY" ABORT "NO ANSWER" "" AT
	           └─1035 python /opt/candy-line/candy-pi-lite/server_main.py /dev/QWS.EC25.AT 460800 ppp0

	 5月 21 19:06:41 raspberrypi pppd[836]: Connect: ppp0 <--> /dev/QWS.EC25.MODEM
	 5月 21 19:06:42 raspberrypi pppd[836]: CHAP authentication succeeded
	 5月 21 19:06:42 raspberrypi pppd[836]: CHAP authentication succeeded
	 5月 21 19:06:45 raspberrypi pppd[836]: Could not determine remote IP address: defaulting to 10.64.64.64
	 5月 21 19:06:45 raspberrypi pppd[836]: local  IP address XXX.XXX.XXX.XXX
	 5月 21 19:06:45 raspberrypi pppd[836]: remote IP address 10.64.64.64
	 5月 21 19:06:45 raspberrypi pppd[836]: primary   DNS address 118.238.xxx.xxx
	 5月 21 19:06:45 raspberrypi pppd[836]: secondary DNS address 118.238.xxx.xxx
	 5月 21 19:06:46 raspberrypi server_main.<module>[1035]: [NOTICE] <candy-pi-lite> serial_port:/dev/QWS.EC25.AT (460800 bps), nic:ppp0
	 5月 21 19:06:46 raspberrypi server_main.__init__[1035]: [NOTICE] <candy-pi-lite> RESTART_SCHEDULE_CRON=>[] is ignored
```

1. candyコマンド[^4]

	```text:sim
	$ sudo candy sim show
	{
	  "msisdn": "08000000000", 
	  "state": "SIM_STATE_READY", 
	  "imsi": "440100000000000"
	}
```

	```text:network
	$ sudo candy network show
	{
	  "operator": "NTT DOCOMO NTT DOCOMO", 
	  "rssi": "-51", 
	  "network": "N/A", 
	  "rssiDesc": "OR_MORE", 
	  "registration": {
	    "cs": "Registered", 
	    "ps": "Registered"
	  }
	}
```

	```text:modem
	$ sudo candy modem show
	{
	  "counter": {
	    "rx": "3728", 
	    "tx": "4758"
	  }, 
	  "datetime": "18/05/21,10:10:26", 
	  "functionality": "Full", 
	  "imei": "000000000000000", 
	  "timezone": 9.0, 
	  "model": "EC25", 
	  "revision": "EC25JFAR06A04M4G_DCM", 
	  "manufacturer": "Quectel"
	}
```

[^4]: 検証ではSMS対応SIMを用いたため、データ専用SIMの場合とは一部の出力が異なるかもしれません。

1. ifconfigコマンド

	```text:ifconfig
	$ ifconfig -a
	eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
	        ether b8:27:eb:xx:xx:xx  txqueuelen 1000  (イーサネット)
	        RX packets 0  bytes 0 (0.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 0  bytes 0 (0.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

	lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
	        inet 127.0.0.1  netmask 255.0.0.0
	        inet6 ::1  prefixlen 128  scopeid 0x10<host>
	        loop  txqueuelen 1000  (ローカルループバック)
	        RX packets 0  bytes 0 (0.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 0  bytes 0 (0.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

	ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
	        inet XXX.XXX.XXX.XXX  netmask 255.255.255.255  destination 10.64.64.64
	        ppp  txqueuelen 3  (Point-to-Pointプロトコル)
	        RX packets 20  bytes 664 (664.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 7  bytes 148 (148.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

	wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
	        ether b8:27:eb:xx:xx:xx  txqueuelen 1000  (イーサネット)
	        RX packets 0  bytes 0 (0.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 0  bytes 0 (0.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

	wwan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
	        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (イーサネット)
	        RX packets 0  bytes 0 (0.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 2  bytes 180 (180.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
	```

    →ppp0にグローバルIPアドレス(XXX.XXX.XXX.XXX)が割り当てられていることを確認します。

1. netstatコマンド

    ```text:netstat
$ netstat -nr
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ   MSS Window  irtt インタフェース
0.0.0.0         0.0.0.0         0.0.0.0         U         0 0          0 ppp0
10.64.64.64     0.0.0.0         255.255.255.255 UH        0 0          0 ppp0
```

    →まぁ、PPPですからね。

#実際に接続してみる

##ラズパイからInternetに接続

- pingなどで実際の接続や名前解決を確認します。

##Internet側からラズパイに接続

1. 接続元のグローバルIPアドレス(YYY.YYY.YYY.YYY)を確認し、ufwに許可設定を追加します。

    ```
sudo ufw insert 1 allow from YYY.YYY.YYY.YYY to XXX.XXX.XXX.XXX port 22 proto tcp
```

1. ufwのstatusを確認します。

	```text:ufw
	$ sudo ufw status numbered
	Status: active

	     To                         Action      From
	     --                         ------      ----
	[ 1] XXX.XXX.XXX.XXX 22/tcp     ALLOW IN    YYY.YYY.YYY.YYY           
	[ 2] Anywhere on ppp0           DENY IN     Anywhere                  
	[ 3] Anywhere on wwan0          DENY IN     Anywhere                  
	[ 4] Anywhere on eth0           ALLOW IN    Anywhere                  
	[ 5] Anywhere on wlan0          ALLOW IN    Anywhere                  
	[ 6] Anywhere on usb0           ALLOW IN    Anywhere                  
	[ 7] Anywhere (v6) on ppp0      DENY IN     Anywhere (v6)             
	[ 8] Anywhere (v6) on wwan0     DENY IN     Anywhere (v6)             
	[ 9] Anywhere (v6) on eth0      ALLOW IN    Anywhere (v6)             
	[10] Anywhere (v6) on wlan0     ALLOW IN    Anywhere (v6)             
	[11] Anywhere (v6) on usb0      ALLOW IN    Anywhere (v6)             
	```

1. 実際に手元のPCからInternet経由でラズパイに接続してみます。
    LTE通信のため3G通信よりレイテンシが低く、sshは問題なく使えました。

1. 後は、ufwに必要な許可設定を追加します。

##ラズパイからラズパイに接続

- 同一構成を2つ以上用意すると、ラズパイ⇔ラズパイ間の接続も可能です。

#最後に
CANDY LINE製のOSイメージを使うと、予めufwがインストールされている上、WAN側（固定IPアドレス側）はデフォルトでping応答以外は無効となっているため、比較的安全にInternet側からラズパイを制御可能な環境が出来上がります。ping応答も無効にしたい場合は[こちら](https://candy-line.gitbooks.io/candy-pi-lite/content/configuration/ufw-icmp.html)を参考にしてください。
アンテナの固定方法を考える必要はありますが、~~USBドングルで苦労した身としては~~簡単にLTE高速通信に対応できるのは魅力的ですね！