同一主机上 2 个以太网卡之间的 INPUT 上的 iptables 规则

同一主机上 2 个以太网卡之间的 INPUT 上的 iptables 规则

我在同一个主机上有 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}。

相关内容