tcpdump
显示我的网络中有一些 ICMP 重定向(KVM 虚拟机、桥接网络)。我决定仔细研究它们以及我的系统的行为方式和外观。我发现它没有按预期工作:
假设我在1.1.1.1和我ping 2.2.2.2
:
# ping 2.2.2.2
PING 2.2.2.2 (2.2.2.2) 56(84) bytes of data.
64 bytes from 2.2.2.2: icmp_seq=1 ttl=63 time=0.569 ms
From 4.4.4.4: icmp_seq=2 Redirect Host(New nexthop: 3.3.3.3)
64 bytes from 2.2.2.2: icmp_seq=2 ttl=63 time=0.690 ms
From 4.4.4.4: icmp_seq=3 Redirect Host(New nexthop: 3.3.3.3)
正如你所看到的,我得到了多个重定向到3.3.3.3看起来不错,但由于某种原因我的主人(1.1.1.1) 忽略它。
# sysctl -a|grep accept_redirects
net.ipv4.conf.all.accept_redirects = 1
net.ipv4.conf.default.accept_redirects = 1
net.ipv4.conf.eth0.accept_redirects = 1
net.ipv4.conf.lo.accept_redirects = 1
并且没有该新路线的条目ip route list
并且ip route list cache
为空。
内核版本是:
# uname -a
Linux foo.bar 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt20-1+deb8u3 (2016-01-17) x86_64 GNU/Linux
改变/proc/sys/net/ipv4/conf/*/accept_redirects
价值观0|1
,networking restart
甚至reboot
没有效果。
我希望接受ICMP 重定向 - 有什么想法吗?
更新:
# ip -d route
unicast default via 4.4.4.4 dev eth0 proto boot scope global
unicast 1.1.1.0/24 dev eth0 proto kernel scope link src 1.1.1.1
unicast 4.4.4.4 dev eth0 proto boot scope link
答案1
发送 ICMP 重定向是为了定义到目的地的更好的路由/网关。
由于您必须拥有与路由的网关/出口位于同一网络中的 IP 地址,因此只有满足以下所有条件时,该路由才会插入路由表中:
accept_redirects
设置为 1- 有问题的机器有一个接口,其地址属于网关网络
- 它没有与目的路由在同一网络中的 IP 地址。
否则该路由将被丢弃。
我不会盲目接受重定向,因为欺骗性 ICMP 重定向存在已知的安全隐患。 ICMP 重定向还可能掩盖瞬时网络故障或网络设计错误。
答案2
添加到 Rui F Ribeiro 的答案:
您可能还必须禁用 secure_redirects,因为它现在默认为 1,并拒绝尚未属于现有网关之一的重定向目的地。
或者,如果您可以将目标 IP 添加为同一接口的第二个默认网关(也许具有较低的指标),那也应该可行。如果有人知道如何做到这一点,请发表评论。