我有一个基于 CentOS 的主机和一个基于 KVM Debian 的虚拟机。主机在其外部网络接口上有一个以太网桥,KVM 使用这个桥:
br0 Link encap:Ethernet HWaddr 00:25:90:01:5E:92
inet addr:5.XX.XX.84 Bcast:5.XX.XX.255 Mask:255.255.255.0
inet6 addr: fe80::fc54:ff:feaf:95b3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2893439068 errors:0 dropped:0 overruns:0 frame:0
TX packets:2943859744 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3109906781642 (2.8 TiB) TX bytes:3271403241664 (2.9 TiB)
br0:0 Link encap:Ethernet HWaddr 00:25:90:01:5E:92
inet addr:10.228.0.1 Bcast:10.228.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
网桥有两个 IP,一个是外部 IP,另一个来自主机和来宾之间的虚拟 LAN。它充当来宾的默认网关。STP 在网桥上关闭。
问题是客人以某种方式获得了一个奇怪的路由规则:
root@new:~# ip route get 50.31.164.148
50.31.164.148 via 5.XX.XX.81 dev eth0 src 10.228.0.250
cache ipid 0x0dfb rtt 4.781s rttvar 4.297s ssthresh 7 cwnd 9
root@new:~#
5.XX.XX.81
是主机的默认网关,我在来宾的静态路由表中的任何地方都找不到这个 IP:
root@new:~# ip route list
default via 10.228.0.1 dev eth0
10.116.0.0/16 via 10.116.0.146 dev tun0
10.116.0.146 dev tun0 proto kernel scope link src 10.116.0.145
10.228.0.0/24 dev eth0 proto kernel scope link src 10.228.0.250
我想知道这是怎么可能的,我们应该怎么做才能防止这种情况发生?当然,ip route flush cache
救了我们,但我们绝对要消除问题本身,不要盲目地定期刷新路由缓存。
(将我的评论转换为答案)
ICMP 重定向,请参阅linux-ip.net/html/routing-icmp.html
您的解决方案非常不寻常,通常不会桥接到真实界面,而是在主机上设置路由和伪装。