我正在嘗試為我的樹莓派製作防火牆。我想要的規則是
允許傳入 SSH - 這有效
允許傳出 ssh - 這不起作用,這是我的主要問題
- 允許傳入和傳出 VNC - 目前這個半工作狀態我可以連接,但無法執行任何操作。並不是真正的優先事項
- 允許傳出 https - 我可以訪問網站,但我認為我需要為 DNS 新增另一行,才能在啟動時正常工作。
- 允許外發電子郵件 - 這有效
- 允許傳出 ping 並獲得回應 - 這有效
- 放棄其他一切 - 猜測這有效,因為我無法進行傳出 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
一切都由前兩個規則處理,無需重複每個規則,現在流程的初始方向很明確:INPUT
或OUTPUT
,僅一次。因此,更清楚地表明--sport 22
SSH 對傳出案例沒有幫助(--dport 22
需要)。如果有相關錯誤回覆的規則RELATED
,將會很有用。在此設定中可能不需要它。udp
icmp