使用iptablesredirect两个端口之间的stream量

我的目标是在端口3000上运行一个web服务器,并通过端口80将其提供给我的networking。到目前为止,我发现的最好的答案是这个不错的一行。

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3000 

但是,这只会影响传入的包,我希望客户端从端口80得到他的回应。接下来的问题是,networking服务器应该只能通过端口80到达。到目前为止,我坚持这种configuration。

 # 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 

你需要允许“RELATED”和“ESTABLISHED”状态。 不需要POSTROUTING规则。

像Apache这样的Web服务器可以绑定到端口80,因为它作为根运行。 这使得它可以绑定到一个特权端口<1024,但是在这之后它会放弃root权限,并在非特权用户下处理http请求。 所以,如果你想绑定到端口80,你应该可以做类似的事情。

这似乎是诀窍。 networking服务器现在可以使用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