4GPiで固定IPアドレスSIMイプシムを使う

[メカトラックス様](https://mechatrax.com/)のラズベリーパイ用4G(LTE)通信モジュール「[4GPi](https://mechatrax.com/products/4gpi/)」で、グローバルIPアドレス固定割当の格安SIM[イプシム](https://ipsim.net/)を使ってみます。
![4GPi.JPG](https://qiita-image-store.s3.amazonaws.com/0/211762/d328fc2a-c19e-bb48-1ac1-fec4d017a0b8.jpeg)

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

##ポイント

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

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

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

- Raspberry Pi 3 Model B+など
- ラズベリーパイ用4G(LTE)通信モジュール「[4GPi](https://mechatrax.com/products/4gpi/)」
- 適当な容量のmicroSDカード([4gpi-stretch-lite-20181029](https://github.com/mechatrax/4gpi/tree/master/os))
- 固定IPアドレスMVNO「[イプシム](https://ipsim.net/)」標準SIM
- モニタ・キーボード（または設定用PC＋DHCPが有効な有線LAN）、ACアダプタ、ケーブルなど

##4GPiと3GPiの違い
|  | 4GPi | 3GPi |
|:--|:-:|:-:|
| 通信方式 | 4G(LTE)専用 | 3G専用 |
| 対応キャリア | docomo/au/SoftBank | docomo/SoftBank |
| ACアダプタ | 別途用意[^1] | 付属 |
| 環境構築済みmicroSD | 別途用意 | 付属 |
| 付属アンテナ | 2本 | 1本 |

[^1]: 今回は5V/2.4AのACアダプタを用いてRaspberry Pi 3 Model B（B+ではありません）のmicro USBへの給電だけでも動作しましたが、メカトラックスさんによると4GPi用のACアダプタ（[12V/2A/内径2.1mm](https://www.switch-science.com/catalog/4074/)）や[slee-Pi](https://mechatrax.com/products/slee-pi/)の使用を推奨とのことです。4GPi側にACアダプタを接続すると、Raspberry Pi側にも給電できます。（Raspberry Piのmicro USBへの給電が不要になります）

#開封から接続まで

##セットアップ（約15分）
![4GPi_SIM.jpg](https://qiita-image-store.s3.amazonaws.com/0/211762/84f4c308-b104-a7ba-233a-c0938637bb1a.jpeg)

1. microSDカードにOSイメージ([4gpi-stretch-lite-20181029](https://github.com/mechatrax/4gpi/tree/master/os))を書き込みます。
1. Raspberry Piに4GPiを取り付け、4GPiにイプシムのSIMカードを取り付けます。
1. Raspberry Piにモニタ・キーボードを接続します。なお、DHCPの割当状態が確認できる場合は、代わりに有線LANに接続し、Raspberry Piに割り当てられたIPアドレスを確認してください（ssh接続で作業できますので、モニタ・キーボードは不要です）。
1. 起動します。

##初期設定（約1分）

1. Raspberry Piにコンソールまたはsshでログインします。
    ID・初期パスワードは[配布元](https://github.com/mechatrax/4gpi/tree/master/os)を参照してください。

1. イプシムのAPNを設定します。
    プリセットはされていないので、イプシムの[APN情報](https://ipsim.net/support.html)を[設定](https://github.com/mechatrax/4gpi/wiki/%E3%81%9D%E3%81%AE%E4%BB%96#%E6%8E%A5%E7%B6%9A%E8%A8%AD%E5%AE%9A)します。

    ```
sudo nmcli con add type gsm ifname "*" con-name ipsim.net apn 4gn.jp user sim@with password sim
```

##接続確認（約3分）
![4GPI_LED.jpg](https://qiita-image-store.s3.amazonaws.com/0/211762/25641019-09f7-c88b-b22a-600ca318851d.jpeg)

1. 4GPiの青色LED
	`《高速点滅》`

1. 4GPiパッケージコマンド [4gpi-networkmanager](https://github.com/mechatrax/4gpi-networkmanager/)

    ```text:4gpi-nm-helper
$ 4gpi-nm-helper show default all
4gn.jp sim@with sim
```

    →APN情報が正しいことを確認します。

1. nmcliコマンド

    ```text:nmcli(1)
$ nmcli con
NAME                UUID                                  TYPE            DEVICE
ipsim.net           8bb407b2-3054-42e2-b3e7-************  gsm             cdc-wdm0
Wired connection 1  d0840652-664f-39d5-9623-************  802-3-ethernet  --
```

    ```text:nmcli(2)
$ nmcli dev status
DEVICE    TYPE      STATE        CONNECTION
cdc-wdm0  gsm       connected    ipsim.net
eth0      ethernet  unavailable  --
wlan0     wifi      unavailable  --
lo        loopback  unmanaged    --
```

    →DEVICEにcdc-wdm0が表示されること、STATEがconnectedになっていることを確認します。

1. ifconfigコマンド

	```text:ifconfig
	$ ifconfig -a
	eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
	        ether b8:27:eb:xx:xx:xx  txqueuelen 1000  (Ethernet)
	        RX packets 2672  bytes 215165 (210.1 KiB)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 1169  bytes 268537 (262.2 KiB)
	        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  (Local Loopback)
	        RX packets 18  bytes 882 (882.0 B)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 18  bytes 882 (882.0 B)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

	wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
	        ether ce:12:0f:96:95:60  txqueuelen 1000  (Ethernet)
	        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=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1500
	        inet XXX.XXX.XXX.70  netmask 255.255.255.252  destination XXX.XXX.XXX.70
	        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)
	        RX packets 485  bytes 34644 (33.8 KiB)
	        RX errors 0  dropped 0  overruns 0  frame 0
	        TX packets 333  bytes 31991 (31.2 KiB)
	        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
	```

    →wwan0にイプシムのグローバルIPアドレス（今回のSIMの場合はXXX.XXX.XXX.70）が割り当てられていることを確認します。ppp0ではありません。[^2]

[^2]: raspberrypi-kernelの更新でwwanが使用できるようになったとのことです。

1. netstatコマンド

    ```text:netstat
$ netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         XXX.XXX.XXX.69  0.0.0.0         UG        0 0          0 wwan0
XXX.XXX.XXX.68  0.0.0.0         255.255.255.252 U         0 0          0 wwan0
```

    →今回のSIMの場合はIPアドレスがキリのいい位置[^3]だっため/30扱いになっているようです。（/29以下になる場合もあると思います）

[^3]: IPアドレスの第4オクテットが.70で、/30の「中」に収まるため。


#実際に接続してみる

##Raspberry Piからインターネットに接続

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

##インターネット側からRaspberry Piに接続

1. ufwのデフォルト状態を確認します。ppp0とwwan0は、INが全拒否となっています。[^4]

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

	     To                         Action      From
	     --                         ------      ----
	[ 1] Anywhere on ppp0           DENY IN     Anywhere
	[ 2] Anywhere on wwan0          DENY IN     Anywhere
	[ 3] Anywhere (v6) on ppp0      DENY IN     Anywhere (v6)
	[ 4] Anywhere (v6) on wwan0     DENY IN     Anywhere (v6)
	```

[^4]: /etc/default/ufwが`DEFAULT_INPUT_POLICY="ACCEPT"`に変更されているので注意しましょう。

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

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

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

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

	     To                         Action      From
	     --                         ------      ----
	[ 1] XXX.XXX.XXX.70 22/tcp      ALLOW IN    YYY.YYY.YYY.YYY
	[ 2] Anywhere on ppp0           DENY IN     Anywhere
	[ 3] Anywhere on wwan0          DENY IN     Anywhere
	[ 4] Anywhere (v6) on ppp0      DENY IN     Anywhere (v6)
	[ 5] Anywhere (v6) on wwan0     DENY IN     Anywhere (v6)
	```

1. 実際に手元のPCからインターネット経由でRaspberry Piにssh接続してみます。
    LTE通信のため、3G通信と比較して圧倒的に高速・低レイテンシで使えるようになりました！

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

##Raspberry PiからRaspberry Piに接続

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

#最後に
メカトラックス提供のOSイメージを使うと、ufwがインストール済みで、WAN側（固定IPアドレス側）はデフォルトでping応答以外は無効となっているため、比較的安全にインターネット側からRaspberry Piを制御可能な環境が出来上がります。ping応答も無効にしたい場合は、[以前の3GPiの投稿](https://qiita.com/ipsim_net/items/9305190478d4f2361389#%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E7%B4%8410%E5%88%86)を参考にしてください。
3GPiより高速な通信が可能になったことはもちろん、何よりも低レイテンシが嬉しいですね！