PF 还是 IPFW
PF 规则可读性好,常用于主机过滤、NAT 和状态跟踪;IPFW 与 FreeBSD 集成紧密,也支持 dummynet。选团队能审查、监控和恢复的一种即可。不要同时启用 PF、IPFW、IPFilter 并期望规则自动组合。
PF:先写最小可验证规则
下面只是本机模板,em0 和管理网段必须替换。远程执行前必须有控制台或定时回滚。
ext_if = "em0"
admin_net = "192.0.2.0/24"
set skip on lo
block return all
pass out all keep state
pass in on $ext_if proto tcp from $admin_net to ($ext_if) port 22 keep state
192.0.2.0/24 是文档示例网段,不是可直接用于生产的来源。语法检查不会加载规则:
pfctl -nf /etc/pf.conf
pfctl -sr
pfctl -si
只有语法和管理通道都确认后才持久启用:
sysrc pf_enable=YES
service pf start
修改现有规则使用 pfctl -nf 先查语法,再 service pf reload;保持旧会话并用新会话验证。
IPFW:理解默认策略
IPFW 规则按编号顺序匹配,最终策略受内核和 rc 配置影响。启用前先阅读当前 ipfw(8) 和 Handbook,确认系统是否以 firewall_type、自定义脚本或内核选项管理规则。
ipfw list
sysrc firewall_enable
sysrc firewall_type
不要在远程主机上先设置默认拒绝、再补 SSH 放行。安全的实施顺序是:离线生成完整规则;静态审查接口、地址和方向;控制台加载;从外部验证;最后写入 rc 配置。
NAT 与 IPv6
IPv4 NAT 不会自动覆盖 IPv6。启用 IPv6 后必须单独审查入站和转发策略。PF 的 nat、IPFW 的内核 NAT 与用户态 natd 属于不同路径;选定一种,记录拓扑和状态表容量,不复制十年前基于拨号接口的规则。
防锁死回滚
- 使用带外控制台,或在变更前安排一个只执行“恢复旧规则”的一次性任务。
- 保存当前规则与计数器输出,记录测试源地址和端口。
- 验证 SSH 之外的 DNS、NTP、包仓库、监控、备份和返回流量。
- 失败时恢复旧配置并 reload;不要用“临时全部放行”长期掩盖规则错误。