![同一主机上 2 个以太网卡之间的 INPUT 上的 iptables 规则](https://linux22.com/image/598110/%E5%90%8C%E4%B8%80%E4%B8%BB%E6%9C%BA%E4%B8%8A%202%20%E4%B8%AA%E4%BB%A5%E5%A4%AA%E7%BD%91%E5%8D%A1%E4%B9%8B%E9%97%B4%E7%9A%84%20INPUT%20%E4%B8%8A%E7%9A%84%20iptables%20%E8%A7%84%E5%88%99.png)
我在同一个主机上有 2 个以太网卡。均直接通过 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)
我发送 TCP syn 数据包(使用原始套接字的 c++ 程序)从 192.168.1.2 到 192.168.1.1
在 wireshark 中我看到在 eth0 上接收到了数据包,但是 iptables 规则(上面)不适用于该数据包。当我将数据包发送到远程主机并在远程主机上应用此规则时,它就可以正常工作。
因此,我猜测这是由于两个 ETH 卡都存在于同一主机。我需要为本地 ETH 卡(目标和源在同一台机器上)创建 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
答案1
确保监听 netfilter 队列的程序确实在响应。如果你说它在你的服务器上不起作用,但在另一台服务器上起作用,那是因为另一台服务器上实际上有一个响应该 NFQueue 的程序。
还要记住,数据包套接字(有时被滥用为“原始套接字”)不受 netfilter 的约束,并且内核也可以丢弃数据包,例如,如果启用了反向路径过滤并且该数据包失败。
答案2
这里的问题到底是什么?
您可以使用 -i 开关为每个接口定义 iptables 规则:
iptables -A INPUT -i eth0 -p tcp -j NFQUEUE --queue-num 0
iptables -A INPUT -i eth1 -p tcp -j NFQUEUE --queue-num 1
匹配数据包的一个可能方法是:
iptables -A OUTPUT -s 192.168.1.2/32 -d 192.168.1.1/32 -j LOG --log-prefix 'Going from eth0 to eth1: '
iptables -A OUTPUT -s 192.168.1.1/32 -d 192.168.1.2/32 -j LOG --log-prefix 'Going from eth1 to eth0: '
当然,适当使用 -t {nat,mangle}。