15.2 Packet Filter(PF)

PF(Packet Filter,包过滤器)是一款源自 OpenBSD 的防火墙,提供了丰富功能,包括 ALTQ(Alternate Queuing,交错队列)等。

启用 PF

# kldload pf                  # 加载 pf 内核模块
# cp /usr/share/examples/pf/pf.conf /etc/  # 复制示例文件作为默认配置规则集,否则 pf 无法启动
# service pf enable           # 设置 pf 在系统启动时自动启动
# service pf start            # 启动 pf 服务
  • ① 如果不执行上述操作,则会提示 pfctl: /dev/pf: No such file or directory,此时可以重启系统后再执行 service pf start

  • ② 否则会提示如下信息:

/etc/rc.d/pf: WARNING: /etc/pf.conf is not readable.

PF 的管理命令为 pfctl

一次性操作命令

  1. 启动 PF 防火墙

pfctl -e

作用:启用 PF,相当于 service pf start

  1. 禁用 PF 防火墙规则

pfctl -d

作用:停用 PF 防火墙,相当于 service pf stop

  1. 加载规则集文件中的规则

作用:将 /etc/pf.conf 文件中的规则加载到 PF 中。

  1. 解析规则但不加载

作用:检查规则语法是否正确,但不实际应用。

可选参数:

  • -N:只解析 NAT 规则

  • -R:只加载过滤规则

  • -A:只加载队列规则

  • -O:只加载选项规则

  1. 查看 PF 的对象信息

作用:显示 PF 的所有对象信息。

可用替换 all 的选项:

  • nat

  • queue

  • rules

  • anchors

  • states

  • sources

  • info

  • running

  • labels

  • timeouts

  • memory

  • tables

  • osfp

  • interfaces

  1. 删除 PF 的所有规则

作用:删除 PF 中所有已加载的规则和状态信息。

如果想查看特定规则,可以用 natqueuerulesstatessourcesinfotablesosfp 替换 all

永久性的规则集

上述操作仅针对 PF 的运行状态和规则加载,并未对规则进行管理,因此仍需修改规则集文件,常用示例如下。

规则集文件

  1. 整理所有输入的数据

作用:对所有进入的数据包进行规范化处理(如重组分片、清理异常标志等),提高规则匹配的可靠性。

  1. 阻止所有访问

作用:默认阻止所有访问。

说明:block 表示动作,all 表示从任何源到任何目标的所有流量。

  1. 允许回环接口访问

作用:允许本地回环接口 lo0 的所有访问,但不影响外部访问。 说明:quick 表示匹配该规则后立即停止,不再继续匹配后续规则。

  1. 允许 TCP 协议访问 80 端口

作用:允许任意设备通过 TCP 协议访问本机的 80 端口(通常用于 HTTP 服务)。

  1. 允许本机对外发送 80 端口的响应

作用:允许本机向任意设备发送 TCP 80 端口的响应数据。

  1. 端口转发 80 → 8080

作用:将访问本机 80 端口的 TCP 流量转发到内网地址 192.168.1.166 的 8080 端口。 说明:rdr 表示重定向(端口转发)。

  1. 允许本机与外部设备进行 ping

作用:允许 ICMP 回显请求(ping)通过,icmp-type 8 表示请求,code 0 表示标准返回码。

  1. 允许 traceroute 的 ICMP 流量

作用:允许本机发送 ICMP“时间超时”报文,用于执行 traceroute

  1. 允许 traceroute 的 UDP 流量

作用:允许本机通过 UDP 协议发送端口范围 33434-34500 的数据,用于 traceroute

说明:>< 表示端口范围。

规则集文件

可能用到的规则集文件 /etc/pf.conf 如下:

  1. 对数据包进行标准化

作用:对所有进入的数据包进行规范化处理,重组分片、清理异常标志,提高规则匹配的可靠性。

  1. 端口转发规则

作用:将访问本机 8080 端口的 TCP 流量转发到 80 端口。

说明:转发规则应置于过滤规则之前以确保生效。

  1. 阻止所有流量并允许回环接口

作用:默认阻止所有流量,但允许本机回环接口 lo0 的所有访问。

说明:quick 表示匹配该规则后立即停止,不再继续匹配后续规则。

  1. 允许外部访问服务器特定端口

作用:允许任意设备访问服务器的 SSH(22)、HTTP(80)、HTTPS(443)、4200、10000 端口。

  1. 允许服务器访问外部设备特定端口

作用:允许服务器向外发送数据到指定端口。

  1. 服务器访问任意设备的 HTTP/HTTPS 并保持状态

作用:允许服务器访问外部 HTTP/HTTPS 服务,同时跟踪连接状态。

  1. 服务器访问 DNS 服务器

作用:允许服务器通过 UDP 端口 53 查询 DNS,并保持状态。

  1. 服务器访问 DHCP 服务器

作用:允许服务器通过 UDP 端口 67 与 DHCP 服务器通信,并保持状态。

  1. 允许服务器发送 ICMP 请求

作用:允许发送 ICMP 回显请求(ping)。

  1. 允许 ICMP 超时消息(traceroute)

作用:允许发送 ICMP“时间超时”报文,用于 traceroute。

  1. 允许服务器访问 UDP 端口范围 33434 至 34500

作用:允许服务器通过 UDP 协议发送端口范围 33434-34500 的数据,用于 traceroute。

  1. 加载规则文件使其生效

作用:

  • -F a:清除所有已加载的规则和状态

  • -f /etc/pf.conf:加载指定规则文件

最后更新于

这有帮助吗?