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

pai*_*cle 3 ubuntu iptables port-forwarding linode node.js

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

看起来很简单 - 我想使用 iptables 防火墙来限制对除 22、80 和 443 之外的所有端口的访问。Linode 在这里写得很好:https : //library.linode.com/securing-your-server#sph_creating -a-firewall并且我按原样使用了他们的防火墙规则。防火墙运行良好。

我还想预先路由一些端口,因为这是一个 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
Run Code Online (Sandbox Code Playgroud)

如果我没有防火墙规则,这些规则会起作用。事实上,我现在正在使用它们,但我不得不关闭防火墙。

如果我添加防火墙规则,则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 
Run Code Online (Sandbox Code Playgroud)

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

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

  1. PREROUTING 也有 ACCEPT 规则的端口可能意味着预路由被忽略
  2. 我正在PREROUTING访问一个技术上被阻止的端口(但我认为这就是“PRE”出现的地方)

有人知道吗?

谢谢!

保罗

Lin*_*Ops 6

PREROUTING 本地数据包后转到本地过滤器,在那里它们被丢弃(您的情况 2)。

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

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

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

由于您将 http(s) 流量从 80/443 重定向到 8080/3000 就像后者的端口是开放的并且无论如何都暴露在 Internet 上,因此与外部世界没有区别,也没有进一步的安全隐患。

  • 为了提供信息,如果我想明确阻止对端口 3000 的直接请求怎么办?IE mysite.com 可以,但 mysite.com:3000 不行。 (2认同)