欢迎光临中国葬花网
详情描述

FreeBSD PF 安装与使用详解如下。PF 是 OpenBSD 开发的一款功能强大的防火墙和流量整形工具,FreeBSD 从 5.3 版本开始将其引入,并已成为系统首选的内置防火墙。

一、PF 的安装与启用

在 FreeBSD 13.0 及以后版本中,PF 已作为内核模块直接包含在基础系统中,无需额外安装。

1. 加载 PF 内核模块

/boot/loader.conf 中添加一行,让系统启动时自动加载 PF 模块:

echo 'pf_load="YES"' >> /boot/loader.conf

或者手动立即加载(无需重启):

kldload pf
2. 启用 PF

编辑 /etc/rc.conf,启用 PF 并指定规则配置文件路径:

sysrc pf_enable="YES"
sysrc pf_rules="/etc/pf.conf"    # 默认规则文件路径
sysrc pflog_enable="YES"         # 启用 PF 日志
sysrc pflog_logfile="/var/log/pflog" # 日志文件位置
3. 启动 PF 服务
service pf start

常用管理命令:

service pf status   # 查看状态
service pf stop     # 停止
service pf restart  # 重启(重新加载规则)
pfctl -s rules      # 查看当前加载的规则

二、PF 配置文件详解 (/etc/pf.conf)

PF 规则文件语法清晰,主要由以下几部分组成:

1. 宏定义:定义变量,便于维护
ext_if="em0"        # 外网接口
int_if="em1"        # 内网接口
localnet=$int_if:network  # 内网网段
webserver="192.168.1.10"
ssh_port="22"
2. :用于存储一组 IP 地址,高效处理大量地址
table <spam> persist file "/etc/spammers.txt"  # 从文件加载黑名单
table <goodguys> { 10.0.0.0/24, !10.0.0.5 }    # 定义内网网段,排除某个 IP
3. 选项:调整 PF 行为
set skip on lo0               # 忽略本地回环接口
set block-policy return       # 阻塞时返回 RST/ICMP,默认是 drop
set state-policy if-bound     # 状态绑定到接口
4. 规则:核心部分,包括过滤规则、NAT、重定向等

规则顺序至关重要,从上到下逐条匹配

三、核心规则编写

1. 基本过滤规则
block all                      # 默认拒绝所有流量
pass out quick on $ext_if      # 允许所有外网出口流量
pass in on $int_if from $localnet to any  # 允许所有内网到外网的流量
2. 按协议/端口控制
# 允许来自外网的入站 SSH (限制在特定 IP 段)
pass in on $ext_if proto tcp from { 192.168.2.0/24 } to $ext_if port $ssh_port

# 允许来自任何地方的 HTTPS
pass in on $ext_if proto tcp to any port 443

# 允许内网 DNS 查询
pass in on $int_if proto udp from $localnet to any port 53
3. 状态化过滤

PF 是状态防火墙,keep stateflags S/SA 可跟踪连接状态。

pass in on $ext_if proto tcp to $webserver port { 80, 443 } flags S/SA keep state
4. 网络地址转换
# 出站 NAT (经典 IP 伪装,内网共享公网 IP)
nat on $ext_if from $localnet to any -> ($ext_if)

# 入站端口转发 (将公网 IP 的 443 端口转发到内网服务器)
rdr on $ext_if proto tcp from any to $ext_if port 443 -> $webserver port 443

# 双向转发/1:1 NAT
nat on $ext_if from 192.168.1.100 to any -> 203.0.113.10
5. 流量整形与队列

PF 通过 ALTQ 系统进行 QoS。

# 在接口上启用 CBQ 队列
altq on $ext_if cbq bandwidth 100Mb queue { std, bulk, web }
queue std bandwidth 30% cbq(default)  # 默认队列
queue bulk bandwidth 20% cbq          # 大流量队列
queue web bandwidth 50% cbq           # Web 流量队列

# 将流量分类到队列
pass in on $ext_if proto tcp to any port 80 queue web
pass in on $ext_if proto tcp to any port 22 queue std

四、高级特性与实用技巧

1. 锚点:用于动态规则(如 FTP 被动模式)或与第三方程序集成
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $int_if proto tcp to any port 21 -> 127.0.0.1 port 8021
2. 日志记录
# 记录被阻止的流量到 pflog
block in log (all) on $ext_if

# 使用 pflogd 服务捕获日志,用 tcpdump 查看:
tcpdump -n -e -ttt -r /var/log/pflog
3. 防止 IP 欺骗
antispoof for $ext_if
4. 规则集优化与调试
# 测试规则文件语法
pfctl -nf /etc/pf.conf

# 详细显示当前所有状态和规则
pfctl -s all

# 查看状态表
pfctl -s states
pfctl -s info     # 查看统计信息

# 动态添加/删除规则(临时生效)
echo "block in on $ext_if from 1.2.3.4 to any" | pfctl -f -

五、一个完整的基础配置文件示例

适用于家庭或小型办公室网关:

# /etc/pf.conf
# 宏定义
ext_if="igb0"        # 外网接口
int_if="igb1"        # 内网接口
localnet="192.168.1.0/24"
webserver="192.168.1.10"
ssh_port="22"

# 选项
set skip on lo0
set block-policy return

# 默认规则:拒绝所有入站,允许所有出站
block all
pass out quick on $ext_if
pass in quick on $int_if from $localnet to any

# NAT:内网共享公网 IP
nat on $ext_if from $localnet to any -> ($ext_if)

# 入站规则
# 1. 允许来自外网的 SSH (限制 IP 范围)
pass in on $ext_if proto tcp from { 192.168.2.0/24 } to $ext_if port $ssh_port

# 2. 允许来自外网的 Web 访问(转发到内网服务器)
rdr pass on $ext_if proto tcp from any to $ext_if port { 80, 443 } -> $webserver
pass in on $ext_if proto tcp to $webserver port { 80, 443 } flags S/SA keep state

# 3. 允许 ICMP (Ping)
pass in on $ext_if inet proto icmp all icmp-type echoreq

六、与 IPFW 的比较(FreeBSD 另一款防火墙)

特性 PF IPFW
来源 OpenBSD FreeBSD
语法 较简洁,类似配置文件 规则编号,类似 Cisco IOS
NAT/重定向 集成度高,语法直观 (nat, rdr) 需要 libalias 或内核模块
流量整形 内置 ALTQ 使用 dummynet
状态检测 内置 需要 stateful 规则
学习曲线 中等 较简单

建议:如果你来自 OpenBSD 背景或需要复杂策略路由/流量整形,选 PF;如果你习惯 IPFW 语法或需要极简方案,选 IPFW。

七、故障排除

规则不生效

  • 运行 pfctl -nf /etc/pf.conf 检查语法。
  • 确保 pf_enable="YES"/etc/rc.conf 中。
  • 使用 pfctl -s all 查看加载的规则。

网络中断

  • 在物理控制台或通过 ssh 连接执行 pfctl -d 临时禁用 PF 进行排查。
  • 在规则顶部添加 pass in quick on $int_if 确保内网管理不中断。

查看日志

  • tcpdump -n -e -ttt -r /var/log/pflog 分析日志。

八、下一步

  • 阅读官方手册:man pf.confman pfctl
  • 深入 PF 书籍:The Book of PF (No Starch Press)
  • 访问 OpenBSD PF 文档:https://www.openbsd.org/faq/pf/

PF 功能极为丰富,建议从简单规则开始测试,逐步增加复杂性。在测试新规则时,始终在本地控制台操作,避免被锁在远程主机外。

相关帖子
对于有婴幼儿的家庭,在挑选婴幼儿专用湿巾时应注意查看哪些成分?
对于有婴幼儿的家庭,在挑选婴幼儿专用湿巾时应注意查看哪些成分?
各地开放的公共数据究竟包含哪些内容,对企业发展和个人生活有什么实际价值?
各地开放的公共数据究竟包含哪些内容,对企业发展和个人生活有什么实际价值?
安庆市殡葬服务正规公司|丧葬一条龙,葬礼跟拍录像
安庆市殡葬服务正规公司|丧葬一条龙,葬礼跟拍录像
在线上办理某些业务时,如何安全地上传身份证照片?
在线上办理某些业务时,如何安全地上传身份证照片?
2026年家用电动汽车的锂电池日常如何保养才能更耐用?
2026年家用电动汽车的锂电池日常如何保养才能更耐用?
白银市网站开发设计#erp系统开发,一站式服务
白银市网站开发设计#erp系统开发,一站式服务
在异地提交了换证申请后,因故需要取消或修改信息该如何操作?
在异地提交了换证申请后,因故需要取消或修改信息该如何操作?
山南市网站优化公司#精准获客助手,模板建站
山南市网站优化公司#精准获客助手,模板建站
农业遥感如何帮助农民了解作物长势并预估产量,2026年有哪些新应用?
农业遥感如何帮助农民了解作物长势并预估产量,2026年有哪些新应用?
在选择医保定点药店时,我们应该重点考虑和对比哪些因素?
在选择医保定点药店时,我们应该重点考虑和对比哪些因素?
为什么说智能水表和电表的数据,正在成为评估个人信用的潜在依据?
为什么说智能水表和电表的数据,正在成为评估个人信用的潜在依据?
南充市安卓系统app开发@品牌网站定制开发,专业建站
南充市安卓系统app开发@品牌网站定制开发,专业建站
恋爱期间共同出资买房但未结婚,房产的归属问题应该如何妥善处理?
恋爱期间共同出资买房但未结婚,房产的归属问题应该如何妥善处理?
如果未来想买下政府持有的产权份额,具体的评估和购买流程是怎样的?
如果未来想买下政府持有的产权份额,具体的评估和购买流程是怎样的?
在2026年,面对越来越逼真的AI生成内容,我们该如何保持警惕?
在2026年,面对越来越逼真的AI生成内容,我们该如何保持警惕?
员工主动辞职时,当年未休的年休假工资应该如何正确计算和支付?
员工主动辞职时,当年未休的年休假工资应该如何正确计算和支付?
2026年想将家里的高额宽带套餐降级,运营商却设置重重障碍该怎么办?
2026年想将家里的高额宽带套餐降级,运营商却设置重重障碍该怎么办?
汉中市正规殡葬公司|丧葬服务公司,搭设灵堂
汉中市正规殡葬公司|丧葬服务公司,搭设灵堂
在停工停课期间,企业是否有权安排员工使用带薪年假或其他假期?
在停工停课期间,企业是否有权安排员工使用带薪年假或其他假期?
延安市网站建设推广服务#外贸网站建设,高端网站开发设计
延安市网站建设推广服务#外贸网站建设,高端网站开发设计