在虚拟IP上发送的数据包不符合iptables规则

我有一个IP地址为222.192.124.3的虚拟接口eth1:3 ,我已经build立了一个iptables规则来使用接口的IP(我知道iptables不关心虚拟接口标签)login到那个接口上的数据包,如下所示:

 iptables -A INPUT -d 222.192.124.3 -j LOG --log-level warning --log-prefix "VIP3-IN: " 

当我运行tcpdump并从另一台机器发送这个IP上的数据包时,我看到它们,所以我认为它们是由内核正确接收和处理的,但iptables从不logging这些数据包,当我运行iptables -nvL ,该规则不会增加,就好像它们从来没有达到规则一样(或者如果iptables甚至没有看到数据包进入该接口)。

我首先想到了与数据包相匹配的另一个规则,并在处理LOG规则之前处理它,所以我删除了每个iptables规则,只添加了日志logging规则,但没有成功。

服务器运行在RHEL 6.2上,内核为2.6.32,在VMware ESX上虚拟化。

以下是iptables -nvL的完整输出:

 Chain INPUT (policy ACCEPT 40 packets, 2891 bytes) pkts bytes target prot opt in out source destination 0 0 LOG all -- * * 0.0.0.0/0 222.192.124.3 LOG flags 0 level 4 prefix `VIP3-IN: ' Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 34 packets, 3816 bytes) pkts bytes target prot opt in out source destination 

这里是一个tcpdump的输出示例,显示传入数据包( tcpdump -n -nn -vvv -i eth1 "host 203.0.59.135" ):

 10:26:01.259409 IP (tos 0x50, ttl 121, id 26746, offset 0, flags [DF], proto TCP (6), length 52) 203.0.59.135.62332 > 222.192.124.3.8888: Flags [S], cksum 0x8da8 (correct), seq 3373891789, win 8192, options [mss 1460,nop,wscale 8,nop,nop,sackOK], length 0 

最后, ifconfig eth1:3输出:

 eth1:3 Link encap:Ethernet HWaddr 00:50:56:AC:35:35 inet addr:222.192.124.3 Bcast:222.192.127.255 Mask:255.255.252.0 UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1 

更新:

iptables图http://www.austintek.com/LVS/LVS-HOWTO/HOWTO/images/ce.Iptables.gif

通过上面的图帮助,我已经在不同的表中设置了iptables规则来查看数据包的去向。 我已经想出了以下脚本:

 IPT_FILTER="iptables -t filter" IPT_MANGLE="iptables -t mangle" IPT_NAT="iptables -t nat" $IPT_FILTER -F $IPT_FILTER -X $IPT_FILTER -A INPUT -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG filter: " $IPT_FILTER -Z $IPT_MANGLE -F $IPT_MANGLE -X $IPT_MANGLE -A PREROUTING -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG mangle/prerouting: " $IPT_MANGLE -A INPUT -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG mangle/input: " $IPT_MANGLE -Z $IPT_NAT -F $IPT_NAT -X $IPT_NAT -A PREROUTING -d 222.192.124.0/22 -j LOG --log-prefix "DEBUG nat/prerouting: " $IPT_NAT -Z 

看起来数据包经过了mangle/PREROUTINGnat/PREROUTING表,但是没有命中mangle/INPUT表,所以我猜这需要“防火墙数据”上的“No”分支。 而绝不是networking或系统专家(至多是一个权力用户),这是我迷失方向,不明白发生了什么事…

最终编辑(解决scheme)

正如@nodens在回答中所build议的那样,问题是由于RPF处于“严格”模式造成的……这么简单的设置令人头疼…

你确定在其他表中没有匹配规则,比如mangle或nat吗? 您还可以尝试logging每个进入INPUT的paquet,或者甚至更好地尝试原始表(PREROUTING链)中的TRACE目标(如果在RHEL 6上可用)

编辑(我目前还不能添加评论):

好的,所以数据包碰到了这个界面,但是并不认为它应该在本地处理。 检查你的路由表,也许你没有到这个networking的作用域链路路由,或者由于RPFfilter(这可能发生取决于networking拓扑结构),内核丢弃数据包:check https://access.redhat .COM /网站/scheme/ 53031

虚拟接口在内核级不存在。 他们是通过ifconfig放在地址上的别名。 自从上个千年结束以来,不应该使用它们。

关于iptables。 由于这不是内核级别的接口,因此必须使用真实的接口名称进行过滤。 在你的情况eth1。 如果你想要严格,你将需要通过源networking过滤,如果可能的话,通过使用虚拟接口名称来模仿你想要做的事情。