應該更改防火牆設置以阻止所有中斷正在進行的 ssh 會話
假設我通過 ssh 登錄到伺服器。在會話中,我更改了防火牆配置以阻止所有流量。
當我之前用 FreeBSD 和 pf 嘗試過這個時,目前的連接斷開了。當我現在嘗試時,目前連接仍然處於活動狀態,但 ping(和新連接)不起作用。我不確定是否還有其他我遺漏的東西。
預期的行為是什麼 - 這應該會中斷我目前的會話嗎?
“應更改防火牆設置以
block all
中斷正在進行的 ssh 會話”答案是,也許。這取決於精確的規則、
block all
出現的位置以及現有的 SSH 連接是否在keep state
(或modulate state
)下管理。set optimization
也是相關的;設置為積極修剪狀態的防火牆可能會在一個正在擺弄防火牆規則更改的同時丟棄會話。還有其他相關設置可能會影響是否保持狀態,例如set state-policy
可能設置為if-bound
,並且出於某種路由原因的 SSH 數據包開始出現在另一個介面上。匹配規則在
pf
最後一條生效,除非quick
被添加到規則中。這與其他防火牆規則係統相反,尤其是 Linux 上的 iptables。因此,規則的確切順序很重要,無論是否quick
使用。如果啟用狀態,則應通過規則更改保留現有連接(除非
set optimization
因超時而終止它們)。一個例子:
block all
將不適用,因為最後一個匹配規則獲勝;此外,為現有的 SSH 連接維護狀態:block all pass out on $ext_if proto tcp all modulate state pass in on $ext_if proto tcp from any to any port ssh modulate state
下一個規則集是一個安全防火牆,因為一切都會被迅速阻止,儘管現有的 SSH 連接仍應保持到會話超時:
block quick all pass out proto tcp all modulate state pass in proto tcp from any to any port ssh modulate state
編寫上述內容的另一種方法是將
block all
作為最終規則(除非有其他quick
規則),因為預設情況下最後一個匹配規則獲勝。(新狀態的匹配方式也很複雜;您可以減少限制,
flags any
以便為 TCP 連接的任何部分創建狀態,而不僅僅是預設的僅通過 default 的新連接flags S/SA
。以及來自例如非對稱路由。)在進行防火牆規則更改時,具有某種回滾或恢復選項通常也是一個非常好的主意,這樣您就不會將自己鎖定在系統之外:
# pfctl -f pf.conf; sleep 30; cp pf.conf.bak pf.conf; pfctl -f pf.conf jfkd^C
規則更改(設置
block return quick
)並沒有殺死我現有的會話,所以我control+c
在混合幾個鍵後點擊以查看它們是否會被終端回顯。