iptables端口转发(prerouting端口80)和防火墙不能一起工作

我已经阅读了许多关于这个话题的文章和答案,我一直在与Linode的支持进行讨论,但似乎没有人能够回答我确切的问题。

看起来很简单 – 我想使用iptables防火墙来限制除了22,80和443之外的所有端口的访问。Linode在这里有一个很好的写法: https : //library.linode.com/securing-your-server#sph_creating – 防火墙 ,我用它们的防火墙规则。 防火墙运行良好。

我也想预先路由一些端口,因为这是一个nodejs应用程序。 所以我用:

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 443 -j REDIRECT --to-port 3000 

如果我没有防火墙规则,这些规则将起作用。 实际上,我正在使用它们,但是我不得不离开防火墙。

如果我添加防火墙规则, PREROUTING停止工作。 如果我将活动的iptables规则保存到一个文件中进行查看,防火墙(过滤规则)和PREROUTING (nat规则)都存在,但只有防火墙规则有效。 看这里:

 # Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014 *security :INPUT ACCEPT [1606:135329] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1206:144815] COMMIT # Completed on Wed Mar 26 02:40:04 2014 # Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014 *raw :PREROUTING ACCEPT [1620:139613] :OUTPUT ACCEPT [1206:144815] COMMIT # Completed on Wed Mar 26 02:40:04 2014 # Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014 *nat :PREROUTING ACCEPT [4:248] :INPUT ACCEPT [6:376] :OUTPUT ACCEPT [12:728] :POSTROUTING ACCEPT [12:728] -A PREROUTING -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 8080 -A PREROUTING -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 3000 COMMIT # Completed on Wed Mar 26 02:40:04 2014 # Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014 *mangle :PREROUTING ACCEPT [1620:139613] :INPUT ACCEPT [1606:135329] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [1206:144815] :POSTROUTING ACCEPT [1206:144815] COMMIT # Completed on Wed Mar 26 02:40:04 2014 # Generated by iptables-save v1.4.18 on Wed Mar 26 02:40:04 2014 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -i lo -j ACCEPT -A INPUT -d 127.0.0.0/8 -j REJECT --reject-with icmp-port-unreachable -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT -A INPUT -p icmp -j ACCEPT -A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7 -A INPUT -j DROP -A FORWARD -j DROP -A OUTPUT -j ACCEPT COMMIT # Completed on Wed Mar 26 02:40:04 2014 

如果我使用iptables -F ,它只会刷新防火墙(过滤)规则, PREROUTING将再次开始工作。 所以这肯定是一个冲突。 规则块的顺序似乎并不重要,因为这(上面)是iptables的标准输出,不pipe我把规则保存到iptables的顺序如何。

对我来说,这似乎是两件事情之一:

  1. PREROUTING也具有接受规则的端口可能意味着预先路由被忽略
  2. 我正在向技术上被阻塞的端口(但我认为这就是“PRE”所在的端口)

有人知道吗?

谢谢!

保罗

PREROUTING本地数据包后,去本地filter,他们被丢弃(你的情况2)。

所以你只需要允许传入的stream量到iptables中的那些端口:

iptables -A INPUT -p tcp -m tcp --dport 8080 -j ACCEPT

iptables -A INPUT -p tcp -m tcp --dport 3000 -j ACCEPT

既然你把HTTP从80/443redirect到8080/3000,就好像后面的端口是开放的,而且暴露在互联网上,所以和外部的wrorld没什么区别,没有进一步的安全隐患。