ブログ

Armadillo Base OS:ネットワークを直列に接続した機器を相互通信させるためのルーティングを行う

at_takuma.fukuda
2023年5月31日 18時32分

複数の機器を直列のネットワークに接続して通信させるための方法をご紹介します。 機器同士がIP通信を行う場合、それぞれの機器同士が直接繋がっていなくても同じネットワークセグメント内であれば通信が可能です。 また、異なるネットワークセグメントの機器と通信する場合も、セグメントを中継する機器がパケットを転送することで通信が可能となります。


問題は、下記のようなセグメントの異なるネットワークが複数連なったものです。

同じセグメントか異なるセグメントを区別するだけでは、対象の機器に到達する経路を判断出来ません。

例えば、B'がC'と通信をしようとした場合に、B'→B→C→C'という経路を通る必要があります。 B'はBにしか繋がっていないのでBにパケットを送信すれば良いですが、Bは受け取ったパケットを適切に転送しなければなりません。
この時、BからはAとCしか見えておおらず、C'宛てのパケットをどちらの方向に転送すれば良いのか分かりません。
そこで、この記事では適切な経路選択やパケット転送を行えるようにする手段をご説明します。

概要

Linuxのネットワークに関する機能・設定を使って、経路選択・パケット転送を有効にします。

  • IPフォワードを有効にする
    複数のネットワークインタフェース間でパケットの転送を行うというものです。
    この設定が有効になっていなければパケットを中継・転送することは出来ません。
  • Proxy ARPを有効にする
    Proxy ARPとはARP要求に対して代理で応答を行う機能です。
    ARPとはAddress Resolution Protocolの略で、簡単に言えばIPアドレスからMACアドレスを調べるためのものです。
    ARPは同一セグメントのネットワークに対してブロードキャストで送信されます。
    つまりこの図で言えば、Bから発信されたARPはAとCにしか届かず、その先の機器には届きません。
    この時、Cが代理でARPに応答することでBはCを宛先として認識します。
    これ以降、BからC'宛てに送られるパケットはC宛てに送られ、CがC'へ転送するというものとなります。
  • スタティックルーティングを行う
    スタティックルーティングは、宛先ネットワークへのルートを予め設定しておくものです。
    具体的には、特定の宛先に対してネクストホップ(次に転送される先)を指定します。

Armadillo Base OS製品における設定

Armadillo Base OS製品(Armadillo-IoT G4/Armadillo-IoT A6E/Armadillo-X2)を使って、具体的な設定方法をご説明します。

機器構成

先ほどの図のB・B'・C・C'を実際の機器に置き換えて動作を確認します。 今回は下記のような機器およびネットワークの構成で確認を行いました。

  • Aramdillo-X2
    IPアドレス:192.168.2.10/24
  • Armaidllo-IoT A6E
    IPアドレス:192.168.2.1/24、192.168.11.1/24
  • Armadillo-IoT G4
    IPアドレス:192.168.11.10/24、192.168.1.1/24
  • iPhone
    192.168.1.12/24

Armadillo-IoT G4とArmadillo-IoT A6Eにそれぞれ下記の設定を行います。

IPフォワードとProxy ARPの有効化

IPフォワードとProxy ARPを有効にします。
sysctl の設定ファイルを以下の内容で作成し /etc/sysctl.d/ 下に配置します。
ファイル名は任意ですが、拡張子は .conf としてください。ここでは router.conf としています。

[armadillo ~]# vi /etc/sysctl.d/router.conf
 
ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 1
 
 
[armadillo ~]# persist_file  /etc/sysctl.d/router.conf
[armadillo ~]# rc-service sysctl restart

スタティックルーティング

ipコマンド

スタティックルーティングは、ipコマンドで行う事が出来ます。

Armadillo-IoT G4からArmadillo-X2へパケットを送信・転送できるようにするには、 以下のように192.168.2.XのIPアドレスのネットワークへのネクストホップを192.168.11.1として設定します。
192.168.11.1はArmadillo-IoT G4のmlan0のデフォルトゲートウェイなので、
mlan0に対してパケットが転送されます。

[armadillo ~]# ip route add 192.168.2.0/24 via 192.168.11.1

Armadillo-IoT A6EからiPhoneへパケットを送信・転送できるようにするには、
192.168.1.XのIPアドレスのネットワークへのネクストホップを192.168.11.1として設定します。
IPアドレス192.168.11.1が設定されたネットワークインタフェースbr0にパケットが転送されます。

[armadillo ~]# ip route add 192.168.1.0/24 via 192.168.11.1

設定自動化

上記でコマンド入力による設定をご紹介しましたが、この設定は電源OFFやrebootを行うと初期化されてしまうので、
都度自動的に設定を行うようにしておきたいです。
コマンドを実行するスクリプトファイルを作成し、このスクリプトをopen rcで自動実行するようにします。

スクリプトファイルを作成します。

[armadillo ~]# vi /sbin/static-routes
(Armadillo-IoT G4の場合)
ip route add 192.168.2.0/24 via 192.168.11.1
(Armadillo-IoT A6Eの場合)
ip route add 192.168.1.0/24 via 192.168.11.1
 
[armadillo ~]# chomod +x /sbin/static-routes
[armadillo ~]# persist_file /sbin/static-routes

Open RCで自動実行されるよう定義ファイルを作成して登録します。

[armadillo ~]# vi /etc/init.d/static-routes
 
#!/sbin/openrc-run
 
name="static-routes"
description="Static Routes"
 
start() {
 /sbin/static-routes
}
 
 
[armadillo ~]# persist_file /etc/init.d/static-routes
[armadillo ~]# rc-update add static-routes
 * service static-routes added to runlevel default
[armadillo ~]# rc-service static-routes start
[armadillo ~]# persist_file /etc/runlevels/default/static-routes

これで起動時に自動的にスタティックルーティングが設定されるようになります。

ネットワークを構成するそれぞれの機器に以上の設定を施すことで、相互に通信を行う事が可能となります。
動作確認として、以下を実行しそれぞれ問題居ないことを確認しました。

  • iPhoneからArmadillo-X2へのping導通
  • Armadillo-X2からiPhoneへのping導通
  • Armadillo-X2にUSBカメラを接続、RTSPサーバを動作させてiPhoneで画像を表示することができること

注意点1

ここからさらにネットワークを連ねていく場合は、さらにそのネットワークへのスタティックルーティングと、経路上の機器の設定が必要になります。

例えば、Armadillo-X2にUSBドングルなどを追加して別の無線ネットワーク(192.168.3.0/24)を使って他の機器(192.168.3.10)に接続出来るようにする場合、

Armadillo-IoT G4では下記のようにルーティングを行います。

[armadillo ~]# ip route add 192.168.2.0/24 via 192.168.11.1
[armadillo ~]# ip route add 192.168.3.0/24 via 192.168.11.1

Armadillo-IoT A6Eでも下記のようにルーティングを行います。

[armadillo ~]# ip route add 192.168.1.0/24 via 192.168.11.1
[armadillo ~]# ip route add 192.168.3.0/24 via 192.168.2.1

Armadillo-X2ではIPフォワードとProxy ARPを有効にした上で、下記のようにルーティングする必要があります。

[armadillo ~]# ip route add 192.168.11.0/24 via 192.168.2.1
[armadillo ~]# ip route add 192.168.1.0/24 via 192.168.2.1

注意点(各ネットワークのIPアドレスがセグメント分けされていない場合)

ここまでの例では、それぞれのネットワークのセグメントが異なることをわかりやすくするためにIPアドレスのセグメントを分けていました。
実際にはこれらのネットワークで同じセグメントのIPアドレスを使用することもあるかと存じます。

  • Aramdillo-X2
    IPアドレス:192.168.1.6/24
  • Armaidllo-IoT A6E
    IPアドレス:192.168.1.4/24、192.168.1.5/24
  • Armadillo-IoT G4
    IPアドレス:192.168.1.1/24、192.168.1.3/24
  • iPhone
    192.168.1.2/24

IPアドレスが同じセグメントに設定されていても、物理的に分割されているためとなりあった機器以外にはARPが届かないため、Proxy ARPの設定は必要です。
また、スタティックルーティングについてもより厳密に設定する必要があります。
例えば、Armadillo-IoT G4には以下のように設定する必要があります。

[armadillo ~]# ip route add 192.168.1.2 via 192.168.1.1
[armadillo ~]# ip route add 192.168.1.6 via 192.168.1.3

宛先をより厳密に個別のIPアドレスの指定として、さらにネクストホップはそこにたどり着く経路に繋がるインタフェースに設定したデフォルトゲートウェイのアドレスとします。