Ubuntu

iptables 埠轉發(預路由埠 80)和防火牆不能一起工作

  • March 26, 2014

我已經閱讀了很多關於這個主題的文章和答案,並且我一直在與 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 的順序如何。

對我來說,這似乎是兩件事之一:

  1. PREROUTING同樣具有 ACCEPT 規則的埠可能意味著預路由被忽略
  2. 我要去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 上,所以與外部世界沒有區別,也沒有進一步的安全隱患。

引用自:https://serverfault.com/questions/584743