Linux ルーティングのバグ?

Linux ルーティングのバグ?

私はしばらく前から、簡単に再現できないこの問題に悩まされてきました。Linux カーネル v3.1.0 を使用していますが、いくつかの IP アドレスへのルーティングが機能しないことがあります。パケットをゲートウェイに送信する代わりに、カーネルが宛先アドレスをローカルとして扱い、ARP 経由で MAC アドレスを取得しようとするためと思われます。

たとえば、現在の IP アドレスは 172.16.1.104/24、ゲートウェイは 172.16.1.254 です。

# ifconfig eth0 eth0      Link encap:Ethernet  HWaddr 00:1B:63:97:FC:DC
          inet addr:172.16.1.104  Bcast:172.16.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:230772 errors:0 dropped:0 overruns:0 frame:0
          TX packets:171013 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:191879370 (182.9 Mb)  TX bytes:47173253 (44.9 Mb)
          Interrupt:17

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.254    0.0.0.0         UG    0      0        0 eth0
172.16.1.0      0.0.0.0         255.255.255.0   U     1      0        0 eth0

いくつかのアドレスには ping できますが、172.16.0.59 には ping できません。

# ping -c1 172.16.1.254
PING 172.16.1.254 (172.16.1.254) 56(84) bytes of data.
64 bytes from 172.16.1.254: icmp_seq=1 ttl=64 time=0.383 ms

--- 172.16.1.254 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.383/0.383/0.383/0.000 ms
root@pozsybook:~# ping -c1 172.16.0.1
PING 172.16.0.1 (172.16.0.1) 56(84) bytes of data.
64 bytes from 172.16.0.1: icmp_seq=1 ttl=63 time=5.54 ms

--- 172.16.0.1 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.545/5.545/5.545/0.000 ms
root@pozsybook:~# ping -c1 172.16.0.2
PING 172.16.0.2 (172.16.0.2) 56(84) bytes of data.
64 bytes from 172.16.0.2: icmp_seq=1 ttl=62 time=7.92 ms

--- 172.16.0.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 7.925/7.925/7.925/0.000 ms
root@pozsybook:~# ping -c1 172.16.0.59
PING 172.16.0.59 (172.16.0.59) 56(84) bytes of data.
From 172.16.1.104 icmp_seq=1 Destination Host Unreachable

--- 172.16.0.59 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms

172.16.0.59 に ping を実行しようとすると、tcpdump で ARP 要求が送信されたことがわかります。

# tcpdump -n -i eth0|grep ARP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
15:25:16.671217 ARP, Request who-has 172.16.0.59 tell 172.16.1.104, length 28

/proc/net/arp には 172.16.0.59 の不完全なエントリがあります:

# grep 172.16.0.59 /proc/net/arp
172.16.0.59      0x1         0x0         00:00:00:00:00:00     *        eth0

172.16.0.59にご注意くださいこの LAN から他のコンピュータからアクセスできます。

何が起こっているのか誰か知っていますか? ありがとう。

アップデート:以下のコメントに返信します:

  • eth0とlo以外のインターフェースはありません
  • ARP要求は相手側からは見えませんが、それが本来の動作です。主な問題は、ARP要求がそもそも送信されるべきではないことです。
  • 「route add -host 172.16.0.59 gw 1​​72.16.1.254 dev eth0」コマンドで明示的なルートを追加しても、問題は解決しません。

答え1

これは確かにLinuxカーネルのバグで、おそらくバージョン2.6.39以降に発生しています。私はlkmlとnetdevのリストに質問を投稿しました(次のスレッドを参照してください)。https://lkml.org/lkml/2011/11/18/191)、そしてそれはちょうど別のnetdevスレッドで議論されましたhttp://www.spinics.net/lists/netdev/msg179687.html

現在の解決策は、再起動するか、すべてのルートをフラッシュして、ICMPリダイレクトが期限切れになるまで10分間待つことです。再発を防ぐには、

echo 0 >/proc/sys/net/ipv4/conf/eth0/accept_redirects

役立ちます。

答え2

172.16.XX のデフォルトのサブネット マスクは 255.255.0.0 ですが、これを 255.255.255.0 に再構成しました。したがって、ホスト 172.16.0.x と 172.16.1.x は異なるサブネット上にあります。したがって、デフォルト ゲートウェイを介してルーティングを試みます。

サブネットマスクを 255.255.0.0 に変更すると問題は解決します。

図を提供していただけますか。ネットワークを描けなければ、修正することはできません (古いネットワーク エンジニアの格言です... 私による!)。

乾杯、

関連情報