PF OpenBSD 状态

PF OpenBSD 状态

我们有一台 OpenBSD 服务器,用作防火墙,使用的是著名的 pf。防火墙一端连接到互联网,另一端连接到本地网络。由于 pf 达到其最大状态数(即 20000),我们遇到了连接中断,这种情况持续了不到一个小时,然后就恢复正常了。有没有办法确定打开这些状态的主机。增加 pf.conf 中的状态数有帮助吗?

多谢

答案1

您可以在这里做很多事情。

要查看哪些主机负责大量状态表条目,您可以执行以下操作pfctl -vs state

要添加更多状态表条目,您可以按照建议进行操作(set limit states增加更多数字),但如果存在潜在问题,您可能不想这样做。

您还可以考虑调整状态超时值(set timeout),可能使用自适应超时,以便更快地摆脱旧的/陈旧的状态。

查看手册页pf.conf手册页pfctl了解更多信息

答案2

[参考:达到 PF 状态表限制]

PF 状态表设置了已授权连接的限制,从而限制了新的防火墙将接受的连接数。您可能有多余的带宽,但如果状态表中没有可用容量,则防火墙将成为瓶颈。

可以通过以下方式访问已配置的状态信息限制pfctl

# pfctl -sm
states        hard limit    10000   
src-nodes     hard limit    10000
frags         hard limit     5000
tables        hard limit     1000
table-entries hard limit   200000

上述限制预先设定了已定义结构的分配内存,以便它们始终可用,并且还限制了上述数据结构的增长。如果您的防火墙流量超出上述设置,则性能将受到影响。

现在,重要的是监控流量对上述限制计数器的影响。通用-si输出为我们提供了进一步调查防火墙中潜在瓶颈的线索。

# pfctl -si
Status: Enabled for XXXXXXXXXXXXXXXX          Debug: Urgent

State Table                          Total             Rate
  current entries                       34
  searches                        96379206           15.2/s
  inserts                           726196            0.1/s
  removals                          726162            0.1/s

在上述网关上,连接到两台不常用的笔记本电脑,current entries相对于hard limit 10000上述情况, 非常低。显然,current entries会因使用情况而波动,而在更繁忙的网关上, 可能会波动很大。

[参考:达到 PF 状态表限制已达到 Open BSD 状态硬限制]

一个需要监控的重要计数器pfctl -simemory 计数器。 相同的详细信息应可通过 获得systat pf

从连接我们 6 个站点的活动网关,我们从标准安装中获得以下内容,无需修改状态表。

# pfctl -si | grep memory
  memory                          209230            0.1/s

计数器突出显示 PF 至少在其中一个方面失败的pool(9)频率。数字越高,到达防火墙的数据包最有可能由于硬件限制之一而被丢弃的发生频率就越高。

上面的例子显示内存限制是

下一步是检查内核内存分配,使用vmstat。为了将搜索范围缩小到 pf 状态表的影响,我们检查了普福斯

下面,我们抓取状态为“失败”的行(这样我们就可以得到列标题)

# vmstat -m | grep -E "state|Fail"
Name      Size  Requests  Fail   InUse Pgreq Pgrel Npage Hiwat Minpg Maxpg  Idle
pfstatepl  296  213123877 209235  5075  1050     0  1050 1050     0   2308   526
pfstatekeypl 
pfstateitempl

pfstateplstruct pf_state是为( )分配的内存的标签。/usr/src/sys/net/pf_ioctl.c故障似乎很严重。

pfctl -vvsi | grep congestion

相关内容