我在同一台主机上有 2 张 eth 卡。两者都直接通过 LAN 电缆连接。
I set eth0 with ip - 192.168.1.2
I set eth1 with ip - 192.168.1.1
我设定了这个规则:
iptables -A INPUT -p tcp -j NFQUEUE --queue-num 0
没有其他规则。(我运行了 iptables -X,-F)
我从 192.168.1.2 向 192.168.1.1 发送 TCP syn 数据包(通过使用原始套接字的 C++ 程序)
在 wireshark 中,我看到在 eth0 上收到了数据包,但是 iptables 规则(上面)不适用这个数据包。当我将数据包发送到远程主机并在远程主机上应用此规则时,它工作正常。
所以,我猜这是因为两张 eth 卡都存在于同一个主机上。. 我需要为本地 eth 卡(dest 和 src 在同一台机器上)创建 iptables INPUT 规则。我需要它来简化测试。
我猜对了问题吗?有没有办法绕过这个?
Ps - 通过开关连接它们没有帮助。该规则未应用。在 Ubuntu 上运行。
TCDUMP 显示数据包:
10:48:42.365002 IP 192.168.1.2.38550 > 192.168.1.1.34298: Flags [S], seq 0, win 5840, length 0
但是像这样记录 iptables 什么也没有:
iptables -A INPUT -p tcp -j LOG --log-prefix '*****************'
iptables -A OUTPUT -p tcp -j LOG --log-prefix '#################'
root@test:~# ip ad sh
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 80:1f:02:2f:d1:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.1.1/24 brd 192.168.1.255 scope global eth0
inet6 fe80::821f:2ff:fe2f:d1aa/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 70:f3:55:0d:ef:31 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.2/24 brd 192.168.1.255 scope global eth1
inet6 fe80::72f3:95ff:fe0d:ef31/64 scope link
valid_lft forever preferred_lft forever
root@test:~# ip ro sh
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2
确保监听 netfilter 队列的程序确实在响应。如果你说它在你的服务器上不起作用但在另一个服务器上起作用,那是因为另一个服务器实际上有一个程序响应那个 NFQueue。
还请记住,数据包套接字(有时被滥用为“原始套接字”)不受 netfilter 的约束,并且内核也可以丢弃数据包,例如,如果该数据包启用了反向路径过滤但失败了。
这里的问题到底是什么?
您可以使用 -i 开关为每个接口定义 iptables 规则:
匹配数据包的一种可能方法是:
当然,请酌情使用 -t {nat,mangle}。