我的目标是在端口 3000 上运行一个 Web 服务器,并通过端口 80 使其可供我的网络使用。到目前为止,我找到的最佳答案就是这个漂亮的单行代码。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
但这只会影响传入的数据包,我希望客户端从端口 80 获取响应。下一个问题是,Web 服务器只能通过端口 80 访问。到目前为止,我只能使用这种配置。
# Default Chain Policies
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT DROP
iptables -t filter -P FORWARD DROP
# Allow Loopback Access
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000
iptables -t nat -A POSTROUTING -p tcp -o eth0 --sport 3000 -j SNAT --to 192.168.0.2:80
iptables -t filter -A INPUT -i eth0 -p tcp --dport 3000 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 3000 -j ACCEPT
答案1
您需要允许“RELATED”和“ESTABLISHED”状态。无需 POSTROUTING 规则。
像 apache 这样的 Web 服务器可以绑定到端口 80,因为它以 root 身份运行。这使它能够绑定到小于 1024 的特权端口,但此后它会放弃 root 权限并以非特权用户身份处理 http 请求。因此,如果您想绑定到端口 80,您应该能够执行类似操作。
答案2
这似乎奏效了。现在,Web 服务器可供 80 多个用户使用,而不再可供 3000 多个用户使用。
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
iptables -t filter -A INPUT -i eth0 -p tcp --dport 3000 -m state --state NEW,ESTABLISHED -m mark --mark 1 -j ACCEPT
iptables -t filter -A OUTPUT -o eth0 -p tcp --sport 3000 -m state --state ESTABLISHED -j ACCEPT