从 OpenBSD PF 迁移到 FreeBSD IPFW 是生产环境中常见的系统优化选择,尤其在追求高并发性能和 IPv6 原生支持时。PF 规则简洁但依赖锚点和宏扩展,而 IPFW 使用编号规则和状态跟踪,提供更精细的流量整形和 NAT 控制。根据 FreeBSD 手册,IPFW 通过内核模块实现,支持 IPv4/IPv6 双栈,默认 deny 策略更安全。
核心观点:IPFW 在 SMP 扩展性和基准测试中优于 PF,适合高负载生产防火墙。证据显示,FreeBSD IPFW 在多核系统上线性扩展至 8 CPU,数据库负载下性能提升 350%,优于 Linux 2.6 内核 15%。迁移时,先启用 IPFW 模块(无需自定义内核),配置 /etc/rc.conf:firewall_enable=YES; firewall_script=/etc/ipfw.rules。清单:1)flush 现有规则(ipfw -q -f flush);2)定义 cmd=ipfw -q add;3)允许 loopback($cmd 10 allow all from any to any via lo0);4)check-state($cmd 15 check-state);5)PF pass out proto tcp to any port {80,443} → IPFW $cmd 200 allow tcp from any to any 80,443 out via $pif setup keep-state。
有状态 NAT 处理是迁移痛点,PF nat on $ext_if from $localnet → ($ext_if),IPFW 使用 in-kernel NAT:ipfw nat 1 config if $pif same_ports unreg_only reset。参数:redirect_port tcp internal:80 public:80 用于端口转发;redirect_addr internalIP publicIP 用于静态 NAT。IPv6 兼容:启用 IPV6FIREWALL 内核选项,规则如 $cmd allow ipv6 from any to any via $pif6 keep-state。生产参数:net.inet.ip.fw.verbose_limit=5(日志限流);max-src-conn=100, max-src-conn-rate=15/5(防 DDoS);DUMMYNET 用于 QoS(options DUMMYNET)。
性能基准:FreeBSD 手册显示 IPFW 在高负载下吞吐量达 40Mbit/s 单连接,优于 PF 在复杂锚点下的开销。IPv6 测试:IPFW 支持 ipfw6 等价规则,无缝双栈。回滚策略:保留 PF 规则备份,sysrc firewall_type=open 测试;监控 ipfw list -a(计数器)和 /var/log/security(日志)。迁移步骤清单:1)备份 PF 配置;2)转换规则(PF pass → IPFW allow keep-state);3)验证 NAT / 状态(tcpdump -i pflog0);4)负载测试(iperf3);5)上线切换(service ipfw start)。
风险:自定义内核需 IPFIREWALL/IPDIVERT;日志洪泛设 verbose_limit。生产落地:脚本化 /etc/ipfw.rules,开机加载;Prometheus 监控规则命中率。
资料来源:FreeBSD Handbook Firewalls 章节(https://docs.freebsd.org/en/books/handbook/firewalls/);man ipfw/pf;HN 讨论(https://news.ycombinator.com/)。