我有一个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
更新:
(来源: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
似乎数据包通过mangle/PREROUTING
andnat/PREROUTING
表,但没有命中mangle/INPUT
表,所以我猜它需要“防火墙数据”上的“否”分支。而且绝不是网络或系统专家(最多是高级用户),这就是我迷路并且不明白发生了什么的地方......
最终编辑(解决方案)
正如@nodens 在他们的回答中所建议的那样,问题是由 RPF 处于“严格”模式引起的......对于这样一个简单的设置来说真是令人头疼......
您确定其他表中没有匹配规则,例如 mangle 或 nat 吗?您还可以尝试记录 INPUT 中的每个 paquet,或者更好的是,尝试原始表(PREROUTING 链)中的 TRACE 目标,如果在 RHEL 6 上可用的话
编辑(我还不能添加评论):
好的,所以数据包到达了接口,但它不被认为是应该在本地处理的。检查您的路由表,也许您没有到该网络的范围链接路由,或者由于 RPF 过滤器而内核丢弃了数据包(这可能取决于网络拓扑):检查https://access.redhat .com/site/solutions/53031
内核级别不存在虚拟接口。它们是 ifconfig 放在地址上的别名。自上个千年结束以来,不应使用它们。
关于iptables。由于这不是内核级别的接口,因此您必须使用真实的接口名称进行过滤。在你的情况下 eth1. 如果您希望严格,您将需要尽可能按源网络进行过滤,以通过使用虚拟接口名称来模仿您尝试执行的操作。