iptables 埠轉發(預路由埠 80)和防火牆不能一起工作
我已經閱讀了很多關於這個主題的文章和答案,並且我一直在與 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
如果我沒有防火牆規則,這些規則將起作用。事實上,我現在正在使用它們,但我不得不關閉防火牆。
如果我添加防火牆規則,則
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 的標準輸出,無論我將規則保存到 iptables 的順序如何。對我來說,這似乎是兩件事之一:
PREROUTING
同樣具有 ACCEPT 規則的埠可能意味著預路由被忽略- 我要去
PREROUTING
一個技術上被封鎖的港口(但我認為那是“PRE”進來的地方)有人知道嗎?
謝謝!
保羅
在 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 上,所以與外部世界沒有區別,也沒有進一步的安全隱患。