
나는 한동안 쉽게 재현할 수 없는 문제로 어려움을 겪고 있습니다. 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
몇 개의 주소에 대해 핑을 보낼 수 있지만 172.16.0.59는 핑할 수 없습니다.
# 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 172.16.1.254 dev eth0" 명령을 사용하여 명시적인 경로를 추가해도 문제가 지속됩니다.
답변1
이는 아마도 버전 2.6.39 이후의 Linux 커널 버그일 것입니다. lml 및 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으로 변경하면 문제가 해결됩니다.
다이어그램을 제공할 수 있나요? 네트워크를 그릴 수 없으면 고칠 수 없습니다(오래된 네트워크 엔지니어 속담...제가 쓴 겁니다!).
건배,