iptables:关于本地生成并前往本地的数据包

J L*_*Lee 2 iptables

本地生成并前往本地的数据包是否采用 PREROUTING 链?

我向 iptables 添加了一些规则,将我的公共 IP 的 http 请求转发到本地绑定的 Nginx。

iptables -t nat -A PREROUTING -i enp3s0f0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1
iptables -t nat -A POSTROUTING -o lo -p tcp --sport 80 -j SNAT --to-source xxx.yyy.zzz.www
Run Code Online (Sandbox Code Playgroud)

并将过滤表 FORWARD 链的策略设置为 ACCEPT。

结果,这些规则起作用了,我可以在另一台机器上访问Nginx,但在具有xxx.yyy.zzz.www IP的机器上无法访问xxx.yyy.zzz.www。(使用 Curl 和 Chrome)

为什么xxx.yyy.zzz.www机器无法访问Nginx?

Ant*_*lov 7

不,本地发起的数据包不会通过 PREROUTING 链(请参阅此wiki 图- 本地数据包的路径从本地进程块开始)。此外,这些数据包仅通过 INPUT/OUTPUT 链,而不会通过 FORWARD。

要重定向本地发起的数据包,您应该将 DNAT/REDIRECT 规则插入 nat/OUTPUT 链:

iptables -t nat -A OUTPUT -p tcp --dst xxx.yyy.zzz.www --dport 80 \
  -j DNAT --to-destination 127.0.0.1
Run Code Online (Sandbox Code Playgroud)