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)
Run Code Online (Sandbox Code Playgroud)
如您所见,我多次重定向到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
Run Code Online (Sandbox Code Playgroud)
并且没有该新路线的条目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
Run Code Online (Sandbox Code Playgroud)
改变/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
Run Code Online (Sandbox Code Playgroud)
发送 ICMP 重定向是为了定义到目的地的更好的路由/网关。
由于您必须拥有与路由的网关/出口位于同一网络中的 IP 地址,因此只有满足以下所有条件时,该路由才会插入路由表中:
accept_redirects
设置为 1否则该路由将被丢弃。
我不会盲目接受重定向,因为欺骗性 ICMP 重定向存在已知的安全隐患。ICMP 重定向还可能掩盖瞬时网络故障或网络设计错误。