Ssh

應該更改防火牆設置以阻止所有中斷正在進行的 ssh 會話

  • August 7, 2022

假設我通過 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在混合幾個鍵後點擊以查看它們是否會被終端回顯。

引用自:https://unix.stackexchange.com/questions/712776