複数のインターフェイスを使用したnslookupとIP転送が時々失敗する

複数のインターフェイスを使用したnslookupとIP転送が時々失敗する

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に特定のインターフェイスを使用するように指示する しかし、これは役に立ちません。

これまでに試したことは

  1. サブネットマスクが異なりますが、まだ問題が発生する
  2. ただし、インターフェイスが同じドメイン(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

関連情報