
ネットワーク上のホストが、その送信元 IP のローカル ARP テーブル内の MAC アドレスと異なる MAC 送信元アドレスを持つ IP パケットを受信するとどうなりますか?
その IP の ARP テーブル エントリは、有効な ARP 応答によって入力され、今後も入力される予定です。
今、受信ホスト (Ubuntu 18.04) が応答パケット (ICMP エコー応答または TCP SYN/ACK ... など) を送信していないことに気付きました。応答パケットはインターフェイスから送信されません。
ここで問題となるのは、ホストがなぜこのように行動するのかということです。 パケットの MAC アドレスと IP アドレス、ローカル ARP テーブル、ルーティング テーブルなどに対してどのようなチェックが行われていますか?
編集:
シナリオを明確にするには:
ホスト Hb が 10.2.0.5 (ホスト Ha) に ping 要求を送信すると、Ha は送信元 IP が 10.1.0.3 の ICMP パケットを受信し、送信元 MAC アドレスはルーターの MAC アドレスになります。ただし、ホスト Ha の ARP テーブルには、10.1.0.3 -> Hb MAC アドレスというエントリがあります。したがって、MAC アドレスは異なります。
答え1
この動作は完全に予想されたものであり、ホストのルーティング構成に関連しています。ホストのルーティング構成には、ルーターを経由するデフォルト ルートのみが含まれている可能性があります。そのため、追加のルートを設定していない場合、ネットワーク ( )Hb
へのパケットはデフォルト ルートを介して送信されます。N2
10.2.0.0/24
したがって、この問題は、ホスト上でリバース パス フィルターが有効になっていることが原因で発生しHa
、送信元アドレスの制限によって着信パケットがドロップされます。
この問題をトラブルシューティングするには、ホスト上で次のコマンドの出力を確認する必要がありますHa
。
ip netconf show dev <iface-N2>
-rp_filter
値を確認してください。おそらくそうですstrict
。ip route get 10.2.0.5 from 10.1.0.3 iif <iface-N2>
- おそらく次のような表示が出るでしょうinvalid cross-device link
。nstat -az TcpExtIPReversePathFilter
- おそらくゼロ以外の値になります。
この問題を解決するには、3 つの簡単な方法があります。
sysctl (および) を使用してホスト
rp_filter
上でを無効にするだけです。また、この変更を永続的にするには、ファイルを編集する必要があります。Ha
sysctl -w net.ipv4.conf.all.rp_filter=0
sysctl -w net.ipv4.conf.<iface-N2>.rp_filter=0
/etc/sysctl.conf
Hb
ホストにアドレス10.2.0.5
を経由するルートを追加するだけです10.1.0.5
(Linuxの場合はコマンドip route add 10.2.0.5 via 10.1.0.5
、Windowsの場合はroute add 10.2.0.5 mask 255.255.255.255 10.1.0.5
)ルータの送信元アドレス変換 (NAT) を設定して、のアドレスを
Hb
ルータのアドレスに書き換えます。これを行うための iptables ルールは次のとおりです。
iptables -t nat -A POSTROUTING -o <iface-N2> --src 10.1.0.3 --dst 10.2.0.5 -j MASQUERADE