LinuxベースのWiFiメッシュネットワークへのデバイスの接続を維持し、ステータス情報(GPS、バッテリー寿命など)を定期的に送信するAndroidアプリを開発中です。メッシュ上のどこかにある既知のサーバー。私は一般的に* nixにかなり慣れていないので、このプロジェクトは大規模な学習曲線であり、ネットワーキングに関しては、かなり頭を悩ませていると思います。更新パケットトラフィックを取得してサーバーに戻る方法を一貫して見つけ、誰かが私を正しい方向に向けることができることを期待するいくつかの問題。
メッシュノードのそれぞれは、3つのネットワークインターフェイスを備えた小さなLinuxコンピューターです。
ap0
hostapd
によって管理されるWiFiアクセスポイントインターフェース。 IPアドレスは192.168.0.1
に設定され、接続された携帯電話にはdhcpd
を介して同じサブネット上のIPが自動的に割り当てられます。
mesh0
メッシュノードを相互に接続するWiFi802.11sメッシュインターフェース。それぞれが10.0.0.0
ネットワークのメンバーです。
eth0
標準イーサネットポート、割り当てられたIP 192.168.1.101
。メッシュノードの1つだけがこのインターフェースを使用し、サーバーマシン(192.168.1.1
)を含むネットワークに接続します。
わかりやすくするために、ネットワークの構造のモックアップを次に示します。
これまでのところ、私が達成できたのは、ノードが相互にpingを実行することだけです。ワイヤレスデバイスは、自身のネットワーク(アクセスポイントサブネット)の外部を認識できません。また、イーサネットに接続されたノード以外はサーバーにpingを実行できません。これらすべてを設定するスクリプトは次のようになります(主にグーグル検索からまとめられています):
ifconfig wlan0 down
iw dev wlan0 del
iw phy phy0 interface add ap0 type managed
ip link set dev ap0 address 60:60:60:60:60:01 #this is different for each unit
ifconfig mesh0 up
ifconfig mesh0 10.0.0.1
ifconfig ap0 192.168.0.1 up
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o mesh0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i mesh0 -o eth0 -j ACCEPT
802.11sを使用すると、「メッシュ」上のすべてのデバイスが「レイヤー2」レベルで相互に認識できます。有線ネットワークでは、すべてのデバイスが同じネットワークスイッチに物理的に接続されている場合と同じです。それらがすべて同じIPアドレス範囲などを使用している限り、それらはすべて互いに「ping」できます。
この時点で、2つの無関係で接続されていないネットワークがあります。1つは10.x.x.x
を使用し、もう1つは192.168.x.x
を使用します。
これらを接続しようとすると、すべての10.x
デバイスに「ゲートウェイ」アドレス(つまり、実際の宛先がわからないパケットを送信する場所)を通知する必要があります...この場合彼らはゲートウェイを10.0.0.1
にしたいと考えています。また、「ゲートウェイ」ボックスに静的ルートが必要です。これにより、これらのパケットが「送信」されるネットワークインターフェイスが認識されます。また、他のサブネットが他のインターフェイスから「出て行く」ための静的ルートも必要であることがわかるでしょう。 MASQとRELATEDの両方が有効になっているため、発信トラフィックが機能していれば、「リターントラフィック」にそれほど問題はありません。