“应该更改防火墙设置来
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
Run Code Online (Sandbox Code Playgroud)
下一个规则集是安全防火墙,尽管现有的 SSH 连接仍应保持到会话超时,但所有内容都会被快速阻止:
block quick all
pass out proto tcp all modulate state
pass in proto tcp from any to any port ssh modulate state
Run Code Online (Sandbox Code Playgroud)
编写上述内容的另一种方法是将其作为block all
最终规则(除非有其他quick
规则),因为默认情况下最后匹配的规则获胜。
(新状态的匹配方式也很复杂;您可以减少限制,flags any
以便为 TCP 连接的任何部分创建状态,而不仅仅是通过默认的仅新连接的默认值flags S/SA
。以及其他此类复杂情况,例如非对称路由。)
在更改防火墙规则时,使用某种回滚或恢复选项通常也是一个非常好的主意,这样您就不会将自己锁定在系统之外:
# pfctl -f pf.conf; sleep 30; cp pf.conf.bak pf.conf; pfctl -f pf.conf
jfkd^C
Run Code Online (Sandbox Code Playgroud)
规则更改(设置block return quick
)并没有终止我现有的会话,因此我control+c
在敲击几个键后点击,看看它们是否会被终端回显。