IPtables 問題 - 感謝協助

IPtables 問題 - 感謝協助

我正在嘗試為我的樹莓派製作防火牆。我想要的規則是

  1. 允許傳入 SSH - 這有效

  2. 允許傳出 ssh - 這不起作用,這是我的主要問題

  3. 允許傳入和傳出 VNC - 目前這個半工作狀態我可以連接,但無法執行任何操作。並不是真正的優先事項
  4. 允許傳出 https - 我可以訪問網站,但我認為我需要為 DNS 新增另一行,才能在啟動時正常工作。
  5. 允許外發電子郵件 - 這有效
  6. 允許傳出 ping 並獲得回應 - 這有效
  7. 放棄其他一切 - 猜測這有效,因為我無法進行傳出 SSH,所以我相信問題出在我的規則中。

我知道我的 ssh 通常可以正常工作,因為在沒有加載防火牆的情況下,我可以從一個 pi 到另一個 pi 傳出 SSH。

    #!/bin/sh

    #Flush all rules
    iptables -F

    #Allow incoming and outgoing SSH
    sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A OUTPUT  -p tcp --sport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

    #Allow VNC sessions
    sudo iptables -A INPUT -s 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -j ACCEPT
    sudo iptables -A OUTPUT -d 10.10.10.1,192.168.0.150 -m state --state NEW,ESTABLISHED -m tcp -p tcp -m multiport --sports 5900:5905,6000:6005 -j ACCEPT

    #Accept only incoming etstablished and allow new or established outgoing
    sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
    sudo iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

    #Accept port 587 for email
    sudo iptables -A INPUT -p tcp --sport 587 -j ACCEPT
    sudo iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT

    #Allow ping requests to go out and get a reply
    sudo iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
    sudo iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

    #Drop all other packets and protocols
    sudo iptables -P INPUT DROP
    sudo iptables -P FORWARD DROP
    sudo iptables -P OUTPUT DROP

答案1

SSH 線路的問題是您試圖允許22來自本機電腦的來源連接埠。但是,當您連接到遠端 SSH 伺服器時,您的電腦不會使用連接埠 22。它使用隨機端口,通常在較高的端口範圍內。這是有道理的,因為如果使用連接埠 22 進行傳出 SSH 連接,您一次只能連接到一台 SSH 伺服器。

為了解決這個問題,最簡單的方法是使用--dport代替--sport,允許每個具有目標連接埠22(ssh) 的連接。

sudo iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

請注意,您必須添加正如 @bcs78 在評論中指出的那樣,這一行而不是取代它。

阻止內部環回連線的流量通常也是一個壞主意。有些程式依賴此連接,沒有它就無法正常工作。將其添加到腳本的開頭:

sudo iptables -A INPUT -i lo -j ACCEPT

答案2

每個鏈添加一次包羅萬象的內容有狀態的將簡化大多數其他規則的規則:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
iptables -F

iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

再加上允許所有本地服務的常用lo介面規則,如果您認為確實不需要,請將其刪除:

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

現在您不必重複其他規則(我將離開該NEW狀態,即使它不是很有用並且並不總是存在):

iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 10.10.10.1 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -s 192.168.0.150 -m tcp -p tcp -m multiport --dports 5900:5905,6000:6005 -m conntrack --ctstate NEW -j ACCEPT

iptables -A OUTPUT  -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A OUTPUT -p tcp --dport 587 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

一切都由前兩個規則處理,無需重複每個規則,現在流程的初始方向很明確:INPUTOUTPUT,僅一次。因此,更清楚地表明--sport 22SSH 對傳出案例沒有幫助(--dport 22需要)。如果有相關錯誤回覆的規則RELATED,將會很有用。在此設定中可能不需要它。udpicmp

相關內容