# 18.3 IPFilter（IPF）

IPFilter（IPF）是早期跨平台开源防火墙，在 FreeBSD 等多种操作系统上均可运行。

IPF 提供包过滤和网络地址转换（NAT）功能，其核心作者为 Darren Reed。IPF 几乎由他一人写就，并移植到多种系统。

> **警告**
>
> 本节所述内容建议在测试环境中验证后再用于生产部署。

## 启用 IPF 防火墙

启用 IPF 防火墙需要准备配置文件并启动相关服务，具体步骤如下。

如需启用 IPF，可执行以下命令：

```sh
# 复制示例文件作为默认配置规则集文件，否则 ipfilter 启动后将无规则生效。示例文件自带的规则不影响使用
# cp /usr/share/examples/ipfilter/ipf.conf.sample /etc/ipf.rules
```

* 启动 IPF 防火墙：

```sh
# service ipfilter enable   # 设置 ipfilter 在系统启动时自动启动
# service ipfilter start    # 启动 ipfilter 服务
```

* 启动 ipnat：

ipnat 是 IPF 的组成部分，专门用于维护网络地址转换（NAT）规则。NAT 可以实现内网 IP 与公网 IP 的转换，以及端口转发等功能。

```sh
# cp /usr/share/examples/ipfilter/ipnat.conf.sample /etc/ipnat.rules   # 复制示例文件作为默认配置规则集，否则 ipnat 无法启动
# service ipnat enable   # 设置 ipnat 在系统启动时自动启动
# service ipnat start    # 启动 ipnat 服务
```

> **注意**
>
> ipfilter 服务重启后，ipnat 也需要重启。

IPF 的管理命令主要有 `ipf`、`ipfstat` 和 `ipnat`，常用操作示例如下：

### 相关文件结构

IPFilter 的配置文件结构如下。

```sh
/
├── etc
│   ├── ipf.rules                     # IPFilter 防火墙规则文件
│   └── ipnat.rules                    # IPNAT 转发规则文件
└── usr
    └── share
        └── examples
            └── ipfilter
                ├── ipf.conf.sample   # IPFilter 示例配置
                └── ipnat.conf.sample # IPNAT 示例配置
```

## 参考文献

* FreeBSD Project. ipf -- alters packet filtering lists for IP packet input and output\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipf&sektion=8>. IPFilter 包过滤规则管理工具手册页，描述规则加载、刷新与状态表操作。
* FreeBSD Project. ipf -- IP packet filter\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipf&sektion=4>. IPFilter 内核模块手册页，描述设备接口与内核可调参数。
* FreeBSD Project. ipf, ipf.conf -- IPFilter firewall rules file format\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipf.conf&sektion=5>. IPFilter 规则文件格式手册页，定义过滤、NAT 与状态跟踪规则语法。
* FreeBSD Project. ipfstat -- reports on packet filter statistics and filter list\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipfstat&sektion=8>. IPFilter 统计信息查看工具手册页。
* FreeBSD Project. ipnat -- user interface to the NAT subsystem\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipnat&sektion=8>. IPFilter NAT 子系统管理工具手册页。
* FreeBSD Project. ipnat.conf -- IPFilter NAT rules file format\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipnat.conf&sektion=5>. IPFilter NAT 规则文件格式手册页，定义了 `rdr` 等规则的正确语法。
* FreeBSD Project. ipmon -- monitors /dev/ipl for logged packets\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ipmon&sektion=8>. IPFilter 日志监控守护进程手册页。
* FreeBSD Project. ippool, ippool.conf -- IP Pool file format\[EB/OL]. \[2026-04-14]. <https://man.freebsd.org/cgi/man.cgi?query=ippool&sektion=5>. IPFilter 地址池配置文件格式手册页。
* FreeBSD Project. FreeBSD Handbook, Chapter 33.4: IPFILTER (IPF)\[EB/OL]. \[2026-04-14]. <https://docs.freebsd.org/en/books/handbook/firewalls/#firewalls-ipf>. FreeBSD 手册中关于 IPF 防火墙的配置指南与示例。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.bsdcn.org/di-18-zhang-fang-huo-qiang/di-18.3-jie-ipfilter-ipf.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
