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

mde*_*ous 7 networking linux iptables rhel6

我有一个eth1:3带有 IP 地址的虚拟接口222.192.124.3,我已经设置了一个 iptables 规则来使用接口的 IP 记录来自该接口的数据包(我知道 iptables 不关心虚拟接口标签),如下所示:

iptables -A INPUT -d 222.192.124.3 -j LOG --log-level warning --log-prefix "VIP3-IN: "
Run Code Online (Sandbox Code Playgroud)

当我运行 tcpdump 并从另一台机器在这个 IP 上发送数据包时,我看到了它们,所以我假设它们被内核正确接收和处理,但是 iptables 从不记录这些数据包,当我运行时iptables -nvL,该规则的数据包计数是'不增加,就像他们从未达到规则一样(或者就像 iptables 甚至没有看到该接口上的数据包)。

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

服务器在 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
Run Code Online (Sandbox Code Playgroud)

这是 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
Run Code Online (Sandbox Code Playgroud)

最后,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
Run Code Online (Sandbox Code Playgroud)

更新:

iptables图
(来源: austintek.com )

在上图的帮助下,我在不同的表中设置了 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
Run Code Online (Sandbox Code Playgroud)

看起来数据包通过mangle/PREROUTINGnat/PREROUTING表,但没有命中mangle/INPUT表,所以我猜它需要“防火墙数据”上的“否”分支。并且绝不是网络或系统专家(最多是高级用户),这就是我迷路的地方,不明白发生了什么......

最终编辑(解决方案)

正如@nodens 在他们的回答中所建议的那样,问题是由 RPF 处于“严格”模式引起的......对于这样一个简单的设置来说如此令人头疼......

nod*_*ens 3

您确定其他表中没有匹配规则,例如 mangle 或 nat 吗?您还可以尝试记录输入中的每个 paquet,或者更好的是,尝试原始表(PREROUTING 链)中的 TRACE 目标(如果 RHEL 6 上可用)

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

好的,数据包到达了接口,但它不被视为应该在本地处理的数据包。检查您的路由表,也许您没有到该网络的作用域链接路由,或者由于 RPF 过滤器而导致数据包被内核丢弃(这可能会发生,具体取决于网络拓扑):检查https://access.redhat .com/site/solutions/53031