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

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

我有一个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: "

当我运行 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

下面是 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 图
(来源:奥斯汀科技网

借助上图,我在不同的表中设置了 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,所以我猜它选择了“防火墙数据”上的“否”分支。我绝不是网络或系统专家(最多是高级用户),这就是我迷路的地方,不明白发生了什么……

最终编辑(解决方案)

正如 @nodens 在其回答中所建议的那样,问题是由 RPF 处于“严格”模式引起的......如此简单的设置却带来如此多的麻烦......

答案1

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

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

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

答案2

虚拟接口不存在于内核级别。它们是 ifconfig 为地址赋予的别名。自上个世纪末以来,它们就不再被使用了。

关于 iptables。由于这不是内核级别的接口,因此您必须使用真实接口名称进行过滤。在您的例子中是 eth1。如果您希望严格执行,则需要按源网络进行过滤(如果可能),以模仿您尝试使用虚拟接口名称执行的操作。

相关内容