iptables 端口转发仅适用于本地主机

iptables 端口转发仅适用于本地主机

下面是我的 iptables 配置。我使用它通过端口 80 访问在端口 9000 中运行的 node js 网站。只有通过本地主机/环回访问网站时,此方法才有效。当我尝试使用路由器通过 dcp 分配的 eth0 ip 时。当我使用 192.168.0.103 之类的 ip 访问网站时,此方法不起作用。我无法弄清楚这里出了什么问题,已经花了一天时间,仍然无法弄清楚 :(

编辑:(更多信息)以前,我使用此配置开发网站,我在 /etc/hosts 文件中将域名配置为指向 127.0.0.1。它运行良好,但现在我正尝试在具有静态 IP 的 vps 中部署网站,此配置不适用于静态 IP。

# redirect port 80 to port 9000
*nat
:PREROUTING ACCEPT [57:3896]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [4229:289686]
:POSTROUTING ACCEPT [4239:290286]
-A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9000
-A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9000
COMMIT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p tcp --dport 9000 -j ACCEPT

-A INPUT -j REJECT

[编辑:2:工作配置]

*nat
:PREROUTING ACCEPT [51:17434]
:INPUT ACCEPT [51:17434]
:OUTPUT ACCEPT [239:16027]
:POSTROUTING ACCEPT [247:16507]
-A PREROUTING -d 192.168.1.59/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8000
-A PREROUTING -d 127.0.0.1/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8000
-A OUTPUT -d 192.168.1.59/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8000
-A OUTPUT -d 127.0.0.1/32 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8000
COMMIT

答案1

Iptables 正在执行您要求它执行的操作。当流量来自另一台计算机时,将查询 PREROUTING 链。当流量由您的本地计算机生成时,将查询 OUTPUT 链。那么让我们看看您的 OUTPUT 规则。您已将其编写为仅适用于目的地为环回地址的流量。这就是它重定向 127.0.0.1:80 而不是 192.168.0.103:80 的原因。您可以添加第二条规则,其中将目标参数设置为-d 192.168.0.103/32,它将执行您想要的操作,但是当您的 IP 地址发生变化时,您需要更改规则。更好的方法可能是匹配发往您的环回接口的流量,例如

-A OUTPUT -o lo -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8000

这应该与您的环回地址以及 dhcp 分配的当前地址相匹配。

相关内容