应该更改防火墙设置以阻止所有中断正在进行的 ssh 会话

ahr*_*ron 4 freebsd ssh firewall pf

假设我通过 ssh 登录到服务器。在会话中,我更改防火墙配置以阻止所有流量。

当我之前使用 FreeBSD 和 pf 尝试此操作时,当前连接已断开。当我现在尝试时,当前连接保持活动状态,但 ping(和新连接)不起作用。我不确定是否还缺少其他东西。

预期的行为是什么 - 这会破坏我当前的会话吗?

thr*_*rig 7

“应该更改防火墙设置来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在敲击几个键后点击,看看它们是否会被终端回显。