假设我通过 ssh 登录到服务器。在会话中,我更改防火墙配置以阻止所有流量。
当我之前使用 FreeBSD 和 pf 尝试此操作时,当前连接已断开。当我现在尝试时,当前连接保持活动状态,但 ping(和新连接)不起作用。我不确定是否还缺少其他东西。
预期的行为是什么——这会中断我当前的会话吗?
答案1
“应该更改防火墙设置来
block all
中断正在进行的 ssh 会话”
答案是,也许吧。这取决于精确的规则,其中出现,以及现有 SSH 连接是否在(或)block all
下进行管理。也相关;设置为积极修剪状态的防火墙可能会在修改防火墙规则的同时丢弃会话。还有其他相关设置可能会影响是否维护状态,例如可能设置为,并且出于某种路由原因的 SSH 数据包开始出现在另一个接口上。keep state
modulate state
set optimization
set state-policy
if-bound
在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 连接的任何部分创建状态,而不仅仅是通过默认的仅新连接的默认值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
在敲击几个键后点击,看看它们是否会被终端回显。