当我尝试理解 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
,没有任何输出。
有人能帮我了解发生了什么事吗?
- 为什么目的地址为 localhost 的 DNAT 流量被接口为 的规则阻止
eth0
? - 为什么 tcpdump 命令没有输出?