我们有一台 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 -si
是memory
计数器。 相同的详细信息应可通过 获得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
pfstatepl
struct pf_state
是为( )分配的内存的标签。/usr/src/sys/net/pf_ioctl.c
故障似乎很严重。
pfctl -vvsi | grep congestion