使用 iptables 在两个端口之间重定向流量

使用 iptables 在两个端口之间重定向流量

我的目标是在端口 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

相关内容