2つのイーサネットポートを備えた組み込みシステムがあります。これら2つのポートは、Linuxシステムの2つの異なるイーサネットポートに接続されています。 Linuxボックスには、WANに接続された3番目のポートもあります。
設定は次のとおりです
_________________
eth0 ---- USB2ETH adapter-------(ethusb0)------------------| |
(IP: 192.168.2.50) (IP: 192.168.2.1) | Linux |
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0) | Box |-------ethext0----WAN
| |
eth1----USB2ETH adapter--------(ethusb1)-------------------|_________________|
(IP: 192.168.3.50) (IP: 192.168.3.1)
(Netmask: 255.255.255.0) (Netmask: 255.255.255.0)
両方のインターフェイスは異なるドメインにありますが、上記のように同じネットマスクを持ちます。
ethusb0 と ethusb1 は dhcp サーバーを実行します。それに応じて/etc/dhcp/dhcpd.confを更新し、eth0とeth1にIPアドレスを割り当てました。
Linuxシステムでは、ethusb0からethext0にパケットを受け入れて転送するようにiptablesを設定しました。
sudo iptables --policy FORWARD ACCEPT
sudo iptables -A FORWARD -i ethusb0 -o ethext0 -j ACCEPT
sudo iptables -A FORWARD -i ethext0 -o ethusb0 -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -A POSTROUTING -o ethext0 -j MASQUERADE
ethusb1にも同様のiptables設定があります。
Linuxシステムでは、dns-nameserversを追加して、ethusb0とethusb1の/etc/network/interfacesも更新しました。サーバーアドレスが192.0.3.3であるとします。
これで、組み込みシステムの両方のポートでDNSサーバーをpingできます。サーバー名に対してnslookupを実行すると、ほとんど成功します。
ethusb0とethext0wiresharkを監視しましたが、nslookupリクエストとレスポンスを見ることができます。要求はethusb0で受信され、ethext0に転送され、ethext0からethusb0に応答されます。
また、iptablesでこれらのインターフェイスの転送統計カウンタを確認して再確認しました。
質問:
今よくある質問に進みます。時々nslookupは失敗します。クエリパケットは ethusb0 で受信されますが、ethext0 には転送されません。これはWiresharkおよびiptablesの統計を監視することによって確認された。ただし、次のnslookupクエリは正常に動作します。
さらに調査した結果、組み込みシステム側から出てくるnslookupクエリフレームで異常な現象が発見されました。 eth0から送信されたフレームのMACアドレスはeth0ですが、IPアドレスはeth1です。そのようなフレームに対してのみ転送ルールが違反されます。
まず、クエリパケットに一致しないMACアドレスとIPアドレスが含まれている理由を理解または理解できません。通常、パケットを送受信するために同じインターフェイスが選択されます。インターフェイス(例:eth0)を閉じて開くと、他のインターフェイスが選択されます。
第二に、パケットが転送されない理由がわかりません。私はLinuxシステムがこれらのパケットを破棄することを可能にする一種のMAC対IPアドレス解決があると思う。ただし、iptablesはドロップされたパケット数を報告しません。
私は同じことを確認しました nslookupに特定のインターフェイスを使用するように指示する しかし、これは役に立ちません。
これまでに試したことは
- サブネットマスクが異なりますが、まだ問題が発生する
- ただし、インターフェイスが同じドメイン(192.168.2.xおよび192.168.2.y)にある場合、この問題は発生しません。
iptablesに別のルールを追加する必要があるのか、それとも組み込みシステム側のインターフェイスを別々に設定する必要があるのかを教えてくれる人はいますか?
答え1
プライベートインターフェイスのリバースパスフィルタリングを無効にするか、または緩いモードに設定することで問題を解決できます。
echo 2 > /proc/sys/net/ipv4/conf/ethusb0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/ethusb1/rp_filter