投稿日

ルーター配下の IoT デバイスとクラウドとで NAT なし双方向通信を実現する方法

こんにちは、Customer Reliability Engineer (CRE) の三國です。

このブログでは SORACOM Discovery 2023 で発表された 「SIM ベースルーティング機能」を使ってどのようなネットワーク構成ができるようになったのか、手順を踏まえて紹介します。

ネットワーク構成

今回ご紹介する構成は以下のとおりです。

  • IoT SIM: SORACOM Air for セルラー plan-D D300MB
  • IoT Device (IoT デバイス) :  Rapsberry Pi
  • Router (ルーター) : RUT240
  • 接続先の Cloud network: Amazon VPC
  • Gate Peer および Server (サーバー) : Amazon Elastic Compute Cloud (EC2)

ポイントは大きく 3 つあります。

  1. ルーター配下の IoT デバイスとサーバーとで双方向通信ができる
  2. IoT デバイスやサーバーが増えても多対多の双方向通信ができる
  3. IoT デバイスとサーバー間で送信元 IP アドレスを維持したまま (NAT なしに) 双方向通信ができる

特に 1 については、多くのユーザー様よりご要望をいただいておりました。今まではルーターでのポートフォワーディングが必要といった制約があったのですが、SIM ベースルーティングの登場によって制約が大きく緩和されました。

なお、前提として VPG や Gate Peer といった SORACOM の用語については以下のドキュメントを参照してください。AWS の用語についての解説は、当ブログでは割愛します。

また、今回は AWS と接続した構成手順を紹介していますが、SORACOM Door で Azure VPN Gateway などへ繋いだ場合も同様な構成が可能です。その他にも様々な構成が可能であり、今回紹介する構成が最適ではない場合もあります。ネットワーク設計について相談したい場合は IoT 導入相談会を是非ご利用ください。

手順概要

手順は大きく 6 ステップです。

  1. ルーターと IoT デバイス を 設定する (IoT デバイス から VPG へ疎通できる)
  2. SORACOM Canal を設定する (IoT デバイス から Gate Peer へ疎通できる)
  3. SORACOM Gate C2D を設定する (Gate Peer とルーターで双方向通信できる)
  4. SIM ベースルーティングを設定する (Gate Peer から IoT デバイス で双方向通信できる)
  5. SORACOM Junction Redirection を設定する (IoT デバイス とサーバーで双方向通信できる)
  6. ルーターの NAT を無効化する (IoT デバイス とサーバーで NAT なしに双方向通信できる)

現時点では、今回のようなネットワークを構成するにはルーター・Gate Peer に幾らかの設定が必要になります。主なポイントを紹介します。

注意

●ルーターや Gate Peer の設定については、デバイスや OS に依存する部分もあります。Priority サポートプランを利用すると、これらの SORACOM 外の設定でお困りの場合にベストエフォートで支援できます。

●ルーターによっては今回の構成をサポートしていない場合もあるので注意してください。

●今回実施する各コマンドはルーティングや転送設定の永続化をしません(再起動後は再設定が必要です)。永続化が必要な場合はカーネルモジュールの読み込みや sysctl といった、それぞれの設定について手順を確認してください。

ステップ 1. ルーターと IoT デバイス を 設定する (IoT デバイス から VPG へ疎通できる)

以下の手順で設定します。

操作前の確認ポイント

●SORACOM Webコンソール上での操作は 日本カバレッジ で行ってください。

●お手元のグローバルカバレッジのSIMをご利用の場合は グローバルカバレッジ で行ってください。

  1. VPG Type-F を作成する (参考: https://users.soracom.io/ja-jp/docs/vpg/create-vpg/)
  2. ルーターの SIM を VPG へ所属させる (参考: https://users.soracom.io/ja-jp/docs/vpg/use-vpg/)
  3. ルーターにAPN などを設定して SORACOM へ繋げる (参考: https://users.soracom.io/ja-jp/guides/devices/rut240/setup/)
  4. IoT デバイスをルーターへ繋げる

注意点は以下のとおりです。

  • 必要に応じて、IoT デバイスへはルーターから固定 IP アドレスを割り当てておく
  • VPG のデバイスサブネット IP アドレスレンジはデフォルトで 10.128.0.0/9 であるが、LAN やクラウド側のネットワークと重複する場合は変更する

上記が完了すると、IoT デバイスから VPG へ疎通できるようになります。以下のような方法で確認してください。

確認 1. セッション履歴に作成した VPG の名前がある

SORACOM ユーザーコンソールにてセッション履歴に作成した VPG の名前があることを確認します。名前がない場合は上記の手順 2 ができているか確認してください。

確認 2. IoT デバイスから VPG へ ping が通る

以下のコマンドで PING 用のエンドポイント (pong.soracom.io) へ疎通できることを確認します。疎通できない場合は上記の手順 3 および手順 4 ができているか確認してください。

ping pong.soracom.io -c 4

ステップ 2. SORACOM Canal を設定する (IoT デバイス から Gate Peer へ疎通できる)

以下の手順で設定します。

  1. VPC と EC2 (Gate Peer) を作成する (参考ドキュメント: https://users.soracom.io/ja-jp/docs/canal/peering/)
  2. VPG と VPC を SORACOM Canal で繋ぐ (参考ドキュメント: 同上)

注意点は以下のとおりです。

  • Gate Peer には Ubuntu または Amazon Linux 2 を使用すること
  • VPC のピアリング設定、ルーティングテーブル
  • 確認パートの疎通で使うプロトコル (たとえば ICMP) もセキュリティーグループで許可すること

上記が完了すると、IoT デバイスから Gate Peer へ疎通できるようになります。この段階ではまだ Gate Peer から IoT デバイスへの疎通はできません。以下のような方法で確認してください。

確認: IoT デバイスから Gate Peer へ ping が通る

以下のコマンドで Gate Peer へ疎通できることを確認します。172.16.1.11 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の各手順ができているか確認してください。

ping 172.16.1.11 -c 4

ステップ 3. SORACOM Gate C2D を設定する (Gate Peer とルーターで双方向通信できる)

以下の手順で設定します。

  1. SORACOM Gate C2D を設定する (参考: https://users.soracom.io/ja-jp/docs/gate/cloud-to-device/)

注意点は以下のとおりです。

  • Gate Peer に割り当てたセキュリティーグループにて SORACOM からの VXLAN 用の通信 UDP Port 4789 を許可すること
  • VPG 設定画面で Gate Peer を設定したときに表示されたスクリプトを使うこと
    • Amazon Linux 2 の場合は、スクリプト中の eth0 を enX0 へ置き換えること

上記が完了すると、Gate Peer からルーターへ疎通できるようになります。この段階ではまだ Gate Peer から IoT デバイスへの疎通はできません。以下のような方法で確認してください。

確認 1. Gate Peer からルーターへ疎通できる

ルーターへ取り付けた SIM の IP アドレスへ疎通できることを確認します。10.128.128.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 1 ができているか確認してください。また、ルーターによっては WAN からの PING を拒否する場合もあるので、ルーターの説明書を確認してください。

ping 10.128.128.10 -c 4

確認 2. ルーターから Gate Peer へ疎通できる

もしルーターから PING を送ることができるのであれば、Gate Peer の VXLAN インターフェースへ疎通できることを確認します。10.128.128.11 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 1 ができているか確認してください。

ping 10.128.128.11 -c 4

確認 3. IoT デバイスから Gate Peer へ疎通できる

IoT デバイスから Gate Peer の VXLAN インターフェースへ疎通できることを確認します。10.128.128.11 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 1 ができているか確認してください。

ping 10.128.128.11 -c 4

解説

SORACOM Canal を設定したステップ 2 において Gate Peer でパケットをキャプチャすると、送信元が 100.67.xx.xx のような IP アドレスとの通信を確認できます。これはつまりSIMからクラウドへの通信が VPG で NAT されていることを示しています。
一方で、ステップ 3 の確認 1~3 の際に Gate Peer で VXLAN インターフェース vxlan0 をパケットキャプチャすると 10.128.128.11 や 10.128.128.10 といった IP アドレスを確認できます。つまり、Gate Peer とルーターは同じ IP アドレスレンジ 10.128.0.0/9 内で通信しているように見えます。ステップ 3 のように、クラウド上の Gate Peer と SIM を取り付けたデバイスとを VXLAN を用いて同じ L2 ネットワークへ所属させるのが SORACOM Gate です。詳細は以下のドキュメントをご参照ください。

ステップ 4. SIM ベースルーティングを設定する (Gate Peer と IoT デバイス で双方向通信できる)

以下の手順で設定します。

  1. ルーターの IP 転送を設定する (参考: https://users.soracom.io/ja-jp/docs/vpg/sim-based-routing/)
  2. VPG の SIM ベースルーティングを設定する (参考: 同上)
    1. 上記手順のステップ3では宛先ネットワークに 192.168.1.0/24 を指定してください。
  3. Gate Peer のルーティングでルーターの LAN 宛のネクストホップを VXLAN インタフェース にする

手順 1 については、RUT240 以外のルーターを使っている場合はルーターのドキュメントを確認してください。

手順 3 については、たとえば以下のようなコマンドをサーバーで実行します。 10.195.17.94 と 10.195.17.100  は今回の構成例の IP アドレスです。自身の環境の IP アドレスは VPG 詳細画面の「デバイス LAN 設定」タブ > 「VPG の Gate Peer 一覧」 > 「デバイスサブネット内 IP アドレス」にあるアドレスです。

sudo ip route add 192.168.1.0/24 nexthop via 10.195.17.94 weight 1 nexthop via 10.195.17.100 weight 1 dev vxlan0

上記が完了すると、Gate Peer と IoT デバイス で双方向通信できるようになります。以下のような方法で確認してください。

確認 1. Gate Peer から IoT デバイスへ疎通できる

IoT デバイスへ疎通できることを確認します。192.168.1.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の各手順ができているか確認してください。

ping 192.168.1.10 -c 4

確認 2. IoT デバイスから Gate Peer へ疎通できる

IoT デバイスから Gate Peer の VXLAN インターフェースへ疎通できることを確認します。10.128.128.11 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の各手順ができているか確認してください。

ping 10.128.128.11 -c 4

解説

このステップでは Cloud network から LAN 向けの通信をルーターへ向けるように Gate Peer と VPG のルーティングを設定し、ルーターも WAN から LAN 向けの通信を転送できるように設定しました。

ステップ 5. SORACOM Junction Redirection を設定する (IoT デバイス とサーバーで双方向通信できる)

以下の手順で設定します。今回のブログで最も手順が多いパートですので、1つずつ作業していきましょう。クラウド側のネットワークを設定する必要があります。

  1. VPG の Junction Redirection を有効化する (参考: https://users.soracom.io/ja-jp/docs/junction/use-redirection/)
  2. Gate Peer の EC2 管理画面で送信元 / 送信先チェックを無効化する (参考: https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck)
  3. Gate Peer で転送設定を有効にする
  4. サーバー (EC2) を作成する
  5. サーバーの所属するサブネットのルーティングテーブルにてデバイスサブネットとルーターの LAN の宛先を Gate Peer にする

手順 3 は以下のコマンドを Gate Peer で実施します。

sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo sysctl -p

手順 5 は AWS の場合、以下の画像のようなルーティングテーブルになります。設定する IP アドレスレンジは自身の環境へ置き換えてください。

DestinationTarget
172.16.0.0/16local
100.67.xx.xx/27Peering Connection (VPG との Peering Connection)
192.168.1.0/24Network Interface (Gate Peer の ENI)
10.128.0.0/9Network Interface (Gate Peer の ENI)

注意点は以下のとおりです。

  • 手順 4 で作成するサーバーが用いるセキュリティグループにて ルーター配下の LAN の CIDR (今回の例では 192.168.1.0/24) からの通信を許可すること
  • このステップで行った設定により、Gate Peer は VPG 以外から通信が来た場合も転送ができるため、意図した通信だけ許可すること

上記が完了すると、サーバーと IoT デバイス で双方向通信できるようになります。以下のような方法で確認してください。

確認 1. IoT デバイスからサーバーへ疎通できる

IoT デバイスからサーバーへ疎通できることを確認します。172.16.1.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 1 から手順 5 ができているか確認してください。

ping 172.16.1.10 -c 4

確認 2.サーバーから IoT デバイスへ疎通できる

EC2 から IoT デバイスへ疎通できることを確認します。192.168.1.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 4 から手順 5 ができているか確認してください。

ping 192.168.1.10 -c 4

解説

このステップでは LAN から Cloud network 向けの通信を Gate Peer へ向けるように Junction Redirection を設定しました。また、Gate Peer の転送設定により、LAN から Cloud network 向けの通信を転送できるようにしました。加えて、サーバーから LAN へ向かうためのルーティングを設定しました。 Gate Peer の転送設定ではデフォルトで送信元・送信先の IP アドレスを保持していますが、ルーターでは NAT しています。最後のステップではルーターの NAT を無効化します。

ステップ 6. ルーターの NAT を無効化する (IoT デバイス とサーバーで NAT なしに双方向通信できる)

  1. [設定手順] ルーターの設定にて、LAN から WAN 宛の通信で NAT を無効化する
  2. [設定手順] ルーターの設定にて、WAN から LAN 宛の通信で NAT を無効化する

RUT240 の場合、コンソールから Network > FIREWALL > ZONES の MASQUERADING をすべて OFF にします。

上記が完了すると、EC2 と IoT デバイス で NAT なしに双方向通信できるようになります。以下のような方法で確認してください。

確認1. 送信元 IP アドレスを保持したまま IoT デバイスからサーバーへ疎通できる

サーバーでパケットをキャプチャすることで送信元を確認してください。Amazon Linux 2 ではない場合は enX0 をデバイス名に置き換えてください。

sudo tcpdump -i enX0 -n icmp

サーバーでパケットキャプチャしたまま、IoT デバイスからサーバーへ疎通できることを確認します。172.16.1.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 1 から手順 4 ができているか確認してください。

ping 172.16.1.10 -c 4

確認2. 送信元 IP アドレスを保持したままサーバーから IoT デバイスへ疎通できる

IoT デバイスでパケットをキャプチャすることで送信元を確認してください。

sudo tcpdump -i eth0 -n icmp

IoT デバイスでパケットキャプチャしたまま、サーバーから IoT デバイスへ疎通できることを確認します。192.168.1.10 は今回の構成例の IP アドレスなので、自身の環境に置き換えてください。疎通できない場合は上記の手順 5 および手順 6 ができているか確認してください。

ping 192.168.1.10 -c 4

(参考) 費用の目安

2023 年 11 月 15 日現在の料金において、以下のような費用が発生します。実際の費用については各サービスの見積ツールなどを利用して確認してください。

初期費用

総額: 30,360 円 + Raspberry Pi の費用

※金額は税込・送料別です

月額のランニング費用

総額: 約 44,750 円~ (データ通信量によって変動します)

※金額は税込・送料別です

まとめ

ネットワーク間で通信をしたい際、通信要件によっては NAT が課題になることもあります。SORACOM は SORACOM Gate でクラウド・デバイス間の NAT を解決し、SORACOM Jucntion Redirection と SIM ベースルーティングで更に広い範囲の NAT を解決できるようにしました。柔軟なネットワーク構成でお客様の要件を満たせれば幸いです。

― ソラコム三國 (mick)