如何从 enp7s0 端口转发到 localhost:80

如何从 enp7s0 端口转发到 localhost:80

我相当困惑,完全不明白iptables

我有一个 nginx 服务器正在监听localhost:80,我想用我的网卡的 ip 访问它192.168.29.167:80。我遵循数字海洋关于设置规则的教程。

我的:

类型 界面 地址
local lo 127.0.0.1
NIC lan enp7s0 192.168.29.167

是的,

iptables -A FORWARD -i lo -o enp7s0 -p tcp --syn --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i lo -o enp7s0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i enp7s0 -o lo -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport 80 -d 127.0.0.1 -j SNAT --to-desitnation 127.0.0.1

设置PREROUTINGPOSTROUTINGFORWARD规则没有任何作用。我无法localhost:80通过访问enp7s0

(注:我有sudo sysctl -w net.ipv4.ip_forward=1

答案1

  1. 您的规则有误nat:您的接口名称似乎不正确。最好使用DNAT基于目标地址的,而不是输入接口名称。因此,您只需要一条规则即可实现您想要的效果:
iptables -t nat -A PREROUTING --dst 192.168.29.167 -p tcp --dport 80 -j DNAT --to-destination 127.0.0.1:80
  1. 这些数据包不会被转发(传输),但会被输入。您应该在链中filter/INPUT而不是在中允许此流量filter/FORWARD。请注意,操作后DNAT输入接口不会改变(因此您应该指定enp7s0接口,而不是lo)。但您可以允许任何DNAT具有单个规则的连接。
iptables -t filter -A INPUT -m conntrack --ctstate DNAT -j ACCEPT
  1. 运行sysctl -w net.ipv4.conf.enp7s0.route_localnet=1以允许接收来自外部的数据包,这些数据包的地址是127.0.0.1
  2. 最好使用iptables-save -c命令列出带有计数器的完整规则集。您nat/PREROUTING至少应该看到规则计数器增加。此外,使用iptables-apply应用新规则。查看这些实用程序的文档。
  3. 使用tcpdump -ni enp7s0 'tcp port 80'来排除外部流量故障。
  4. 要重定向本地发起的流量,您应该使用这些规则
  iptables -t nat -A OUTPUT -p tcp --dport 80 --dst 192.168.29.167 -j DNAT --to 127.0.0.1

否则,您无法从服务器本身通过 192.168.29.167 地址连接到您的 nginx。

相关内容