这很奇怪。
输出ip route show
:
default via 192.168.1.1 dev eth0 metric 100
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.10
192.168.1.0/24 dev eth2 proto kernel scope link src 192.168.1.11
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.58
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
从防火墙日志中:(略有缩短)
Mar 8 09:17:12 vmhost kernel: [ 562.808036] ''IN-dmz-lan-face':'IN=eth1 OUT= MAC=... SRC=192.168.1.108 DST=192.168.1.58 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=28218 DF PROTO=TCP SPT=47365 DPT=22 WINDOW=14600 RES=0x00 SYN URGP=0
注意到了奇怪的差异了吗?
防火墙日志列出eth1
该地址192.168.1.58
,但路由表将其放在192.168.1.10
。
不知何故,eth1
和eth0
被交换了,或者他们的 IP 地址被交换了。
没有额外的路由表在起作用。
怎么会发生这种情况?我该如何解决?
编辑(更多信息)
输出ip addr | grep "inet "
:
inet 127.0.0.1/8 scope host lo
inet 192.168.1.58/24 brd 192.168.1.255 scope global eth0
inet 192.168.1.10/24 brd 192.168.1.255 scope global eth1
inet 192.168.1.11/24 brd 192.168.1.255 scope global eth2
inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
答案1
沒有出入。
IN=eth1 OUT= SRC=192.168.1.108 DST=192.168.1.58 PROTO=TCP SPT=47365 DPT=22
防火墙日志列出了 eth1 的地址 192.168.1.58,但路由表将其放在 192.168.1.10。
不,防火墙告诉您它已收到一个eth1
来自 192.168.1.58 的数据包。这并不奇怪:您网络上的任何人都可以在您服务器所连接的接口上发送任何虚假数据包。如果这是个问题,那就怪罪发送者。
但请注意,Linux 内核默认使用弱主机模型。这意味着,如果目标地址与其任何接口上的地址匹配,它将接受数据包作为自己的数据包。因此内核将接受该数据包作为合法数据包。
这种弱主机模型也反映在 ARP 行为上:默认情况下,内核将在其任何接口上应答针对 192.168.1.58 地址的 ARP。如果所有接口都连接到同一个网段,那么请求 192.168.1.58 的人可能会最终出现在您的 3 个接口中的任何一个上。如果不希望出现这种情况,请将 sysctl 设置arp_ignore
为 1。
此外,您的路由表即使没有错误,也是不寻常的。如果您要求内核连接到 192.168.1.108,它应该使用哪个接口?实际答案由命令给出ip route get 192.168.1.108
。它可能不是您期望的答案。