iptables DNAT 流量到本地主机的奇怪行为

iptables DNAT 流量到本地主机的奇怪行为

当我尝试理解 iptables 如何处理 DNATed 数据包时,我遇到了一个问题。我在 localhost:8000 运行一个服务器,并向 nat 表添加了一条规则:

-A OUTPUT -d 1.2.3.4/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 127.0.0.1:8000

然后我添加了一条规则来过滤表:

-A OUTPUT -o eth0 -j DROP

当我运行时curl 1.2.3.4,它只是挂在那里,没有响应 - 似乎它被 DROP 规则阻止了。在我向过滤表添加以下规则后:

-A OUTPUT -d 127.0.0.1/32 -o eth0 -j ACCEPT
-A OUTPUT -o eth0 -j DROP

curl命令可以成功返回localhost:8000服务器的内容。

我真的很困惑,据我所知,该curl 1.2.3.4命令首先会由 nat 表处理,经过 DNAT 后,数据包的目的地将更改为 127.0.0.1,这应该由 lo 接口处理,而不应该被-A OUTPUT -o eth0 -j DROP规则阻止。有一件事让我更困惑,我运行tcpdump -i eth0 host 127.0.0.1,没有任何输出。

有人能帮我了解发生了什么事吗?

  1. 为什么目的地址为 localhost 的 DNAT 流量被接口为 的规则阻止eth0
  2. 为什么 tcpdump 命令没有输出?

相关内容