15.4 ipfirewall(IPFW)

IPFIREWALL(IPFW,IP 防火墙)是由 FreeBSD 项目开发和维护的防火墙软件,作为可加载模块存在于基本系统内核(GENERIC)中。作为 FreeBSD 原生防火墙,IPFW 基于规则编号的优先级机制,为网络访问控制提供了灵活而精确的管理框架。规则编号越小,优先级越高,可覆盖编号较大的规则。

警告

IPFW 默认包含一条规则,规则号为 65535,不可删除:该规则会阻断所有未匹配的流量。因此,在防火墙配置完成之前,请勿启动 IPFW,以免被阻断在防火墙之外。

服务项

配置 IPFW 服务首先需要启用系统防火墙,然后进行启动和状态检查等操作,具体步骤如下。

  • 启用系统防火墙设置:

# sysrc firewall_enable="YES"

技巧

参见:routing[EB/OL]. [2026-03-26]. https://github.com/freebsd/freebsd-src/blob/main/libexec/rc/rc.d/routing#L387arrow-up-right

可以使用以下命令设置 IPFW 防火墙在系统启动时自动启动:

# service ipfw enable # 须重启后生效

两种方法功能等价:sysrc firewall_enable="YES" 直接修改 rc.conf 配置,service ipfw enable 通过服务管理工具设置开机自启,均需重启后生效。

  • 启动 IPFW 防火墙服务:

# service ipfw start

Firewall rules loaded.
Firewall logging enabled.
ifconfig: interface ipfw0 already exists
Firewall logging pseudo-interface (ipfw0) created.
  • 查看 IPFW 防火墙的当前状态:

相关文件结构

其他 RC 配置

除了基本的服务启用外,还可通过以下配置项进一步调整 IPFW 的行为。

  1. 设置防火墙策略类型

作用:允许所有流量通过。

说明:

  • 如果不设置 open,FreeBSD 默认的防火墙规则是 65535: deny ip from any to any,即拒绝所有 IP 流量。

  • 功能等同于执行:

  1. 指定防火墙规则文件

作用:设置 IPFW 防火墙规则文件路径。

说明:系统启动时会读取该文件并加载其中的防火墙规则。

  1. 启用防火墙日志

作用:开启 IPFW 日志功能,使防火墙能够打印日志信息。

  1. 指定日志输出设备

作用:将防火墙日志输出到 ipfw0 伪接口设备。

便于使用 tcpdumpngrep 等工具监控防火墙日志流量。


配置完成后,可以通过以下命令查看当前生效的规则。

按上述配置的规则如下:

编辑 /usr/local/etc/ipfw.rules 文件

如需自定义 IPFW 规则,可编辑规则文件。

以下示例用于指定防火墙规则:

每条规则的基本结构如下,可据此编写自定义规则:

  • ① 按优先级排序,数字越小优先级越高,可覆盖数字较大的规则。

示例:添加规则 500,用于拒绝并记录所有流量:

写入文本:

或者执行命令:

注意

ipfw 命令为一次性生效,执行时即时生效,但不会永久保存规则。需要将规则写入指定文件以保持持久化。

除了编辑规则文件外,还可通过以下命令调整 IPFW 的默认行为。

  • 设置 IPFW 默认策略为允许所有流量:

  • 显示当前 IPFW 防火墙规则列表:

课后习题

  1. 查找 FreeBSD 源码中 IPFW 的规则编号优先匹配机制,重构一个最小化的规则匹配引擎。

  2. 选取 IPFW 的状态跟踪(keep-state)机制,为其设计并实现一个简化版本,验证其功能。

  3. 修改 IPFW 的默认策略(如将 default_to_accept 从 1 改为 0 或调整规则 65535 的行为),验证其行为变化。

最后更新于