在仅运行 BIND 缓存的绝对标准的 ubuntu-server Linux 发行版上,有时我会在 arp/nei 表中看到非链接本地 ip 地址,并且无法与这些条目进行通信
在谷歌搜索了大半个上午之后,我没有发现类似的问题,所以我认为可能是我的设置有问题。
设置非常简单:
1 个网络接口,1 个 VLAN(eth0.264
),1 个 IP 地址,1 个默认网关 - 没有其他
(对于这个问题 - 我用 替换我的 IP 地址9.9.9.9
,用 替换我的子网,9.9.9.0/24
用 替换示例条目9.17.100.131
)
# uname -a
Linux space 3.0.0-16-server #28-Ubuntu SMP Fri Jan 27 18:03:45 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
# ip a li
4: eth0.264@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 00:30:48:d5:c2:70 brd ff:ff:ff:ff:ff:ff
inet 9.9.9.13/24 brd 9.9.9.255 scope global eth0.264
inet6 fe80::230:48ff:fed5:c270/64 scope link
valid_lft forever preferred_lft forever
# ip rule li
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
# ip ro li
default via 9.9.9.1 dev eth0.264 metric 100
9.9.9.0/24 dev eth0.264 proto kernel scope link src 9.9.9.13
# ip neigh show 9.17.100.131
9.17.100.131 dev eth0.264 INCOMPLETE
# arp -n 9.17.100.131
9.17.100.131 (incomplete) eth0.264
# sysctl net.ipv4.conf.all.accept_redirects
net.ipv4.conf.all.accept_redirects = 0
# strange route cache stuff
# ip ro show cache 9.17.100.131
9.17.100.131 dev eth0.264 src 9.9.9.13
cache <redirected> ipid 0x05cb
9.17.100.131 from 9.9.9.13 dev eth0.264
cache <redirected> ipid 0x05cb
# ip ro flush cache
# ip ro show cache 9.17.100.131
# ping 9.17.100.131
PING 9.17.100.131 (9.17.100.131) 56(84) bytes of data.
^C
--- 9.17.100.131 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
# ip ro show cache 9.17.100.131
9.17.100.131 from 9.9.9.13 dev eth0.264
cache <redirected> ipid 0x06cb
9.17.100.131 dev eth0.264 src 9.9.9.13
cache <redirected> ipid 0x06cb
# arp -d 9.17.100.131
SIOCDARP(dontpub): Network is unreachable
(当然9.17.100.131
可以从下一个服务器访问9.9.9.14
,并且9.9.9.14
可以从 .. 等访问奇怪的 arp 条目9.9.9.13
)
ip nei flush
不删除条目,
也arp -s
拒绝设置它(就像它应该的那样):
# arp -s 9.17.100.132 00:11:22:33:44:55
SIOCSARP: Network is unreachable
# arp -d 9.17.100.131
SIOCDARP(dontpub): Network is unreachable
我有 3 台服务器,使用相同的 ubuntu 版本并运行相同的进程(仅 BIND),它们都经历了整个世界是链接本地综合症reboot
,工作了几天后它开始添加那些非链接本地条目。
一些使用情况统计数据:
eth0.264 ~ 1000 pps udp traffic
load average 0.03
processes - rsyslogd, named, snmpd, sshd
任何想法都将不胜感激。
答案1
我猜你的网关有一个物理接口,既用于 9.9.9.0/24 网络,也用于连接 9.17.100.131 的网络。这就是它发送重定向的原因。
在我看来,您的 Ubuntu 服务器中有两个错误(或“奇怪的功能”):
- 它应该忽略重定向,因为 net.ipv4.conf.all.accept_redirects=0
- 它应该忽略无法从你的 Ubuntu 网络访问的 IP 的重定向
但是,你可以在 Ubuntu 上使用以下命令暂时修复此问题:
ip route flush cache
并且您可能会在网关上永久修复此问题,使用:
sysctl -w net.ipv4.conf.all.send_redirects=0
毕竟,允许从具有多个网络连接到同一物理接口的网关进行重定向可能不是一个好主意。
答案2
为什么您会找到不在同一子网上的计算机的 ARP 记录?这是不可能的。
如果您有网络9.9.9.0/24
,那么您的计算机必须通过默认网关访问计算机9.17.100.131
,因为它的子网部分 IP 地址是9.9.9.x
(网络掩码是255.255.255.0
)。然后您必须在邻居缓存中仅记录默认网关。您的计算机必须发送带有目标 IP 的数据包9.17.100.131
,但带有您的默认网关的 MAC 地址。您的网关将把这个数据包路由到另一个网络。
arp 的抱怨“网络不可达”告诉你,那台计算机不是网络的一部分,其地址是9.17.100.131
,那么这个 IP 地址的 ARP 记录就是无稽之谈。
您的路由表告诉您,您的路由器试图通过 ICMP 重定向数据包将您重定向到目的地9.17.100.131
。这是一条消息,告诉您,您的路由器有另一个网络掩码,而不是您的计算机,例如/8
( 255.0.0.0
),并且它认为您与 9.17.100.131 位于同一网络上,路由器不必将数据包从您转发到这台计算机。
请仔细检查您网络上的计算机上的网络掩码,特别是针对您的“默认网关”计算机或路由器的网络掩码 - 它们必须相同才能正常工作。
答案3
的值是多少net.ipv4.conf.all.secure_redirects
?如果为 1,恰好是默认值,它将接受来自网关的重定向,而不管accept_redirects
。禁用它。(并send_redirects
按照 Arnaud Bienvenu 的建议在网关上禁用)。
此外,3.0 内核有一个令人恼火的错误,重定向路由永远不会从内核中清除即使清除路由缓存,清除它们的唯一方法是重启,或者一些复杂的步骤包括等待很长时间。
答案4
以下是我发现的内容:
我的 Ubuntu 14.04 服务器因维护而断电几分钟后,与远程主机 150.43.127.1 失去了连接。
检查路由缓存后发现条目使用了错误的 gw (150.150.100.2):
rg@buntu:~$ sudo ip route get 150.43.127.1
150.43.127.1 via 150.150.100.2 dev eth0 src 150.150.100.10
cache <redirected>
刷新缓存后,现在使用正确的 gw (150.150.127.1):
rg@buntu:~$ sudo ip route flush cache
rg@buntu:~$ sudo ip route get 150.43.127.1
150.43.127.1 via 150.150.127.1 dev eth0 src 150.150.100.10
cache
rg@buntu:~$
远程主机现在可以访问:
rg@buntu:~$ ping 150.43.127.1
PING 150.43.127.1 (150.43.127.1) 56(84) bytes of data.
64 bytes from 150.43.127.1: icmp_seq=1 ttl=252 time=14.9 ms
64 bytes from 150.43.127.1: icmp_seq=2 ttl=252 time=15.6 ms
^C