FreeBSD PF防火墙配置
网站上线后,服务器通常只需要对外提供HTTP、HTTPS等少数服务,SSH管理入口则可以限制来源地址。FreeBSD内置的PF防火墙可以完成这些访问控制,并通过规则、连接状态和日志帮助管理员检查实际流量。下面以一台单网卡网站服务器为例,完成基础配置。
一、配置前的准备
本文使用以下示例参数:
- 外网网卡:
em0 - SSH端口:
22 - 网站端口:
80、443 - 管理来源IPv4地址:
198.51.100.10
198.51.100.10是文档示例地址,必须替换为管理员实际使用的公网出口IP。 如果SSH使用其他端口,也要同步修改规则。
下面的配置以固定IPv4地址、无转发需求的网站服务器为例,不适合直接覆盖已有的网关、Jail或虚拟机网络规则。IPv6网站、DHCP及其他业务需要另外配置。
首次启用防火墙前,请确认可以通过服务商控制台或本地终端登录服务器。不要只依赖当前SSH连接。 PF规则加载后会影响网络访问,语法正确也不代表放行范围符合实际需求。
二、编写PF规则
以root身份编辑配置文件。如果已经存在/etc/pf.conf,先备份并检查现有内容,不要直接覆盖。
cp -p /etc/pf.conf /root/pf.conf.before-change
首次配置、文件不存在时,跳过备份命令。然后编辑:
vi /etc/pf.conf
写入以下内容,并替换网卡、管理IP和SSH端口:
ext_if = "em0"
admin_ip = "198.51.100.10"
ssh_port = "22"
web_ports = "{ 80, 443 }"
set skip on lo0
block log all
pass out inet all keep state
pass in on $ext_if inet proto tcp from $admin_ip to ($ext_if) port $ssh_port flags S/SA keep state
pass in on $ext_if inet proto tcp from any to ($ext_if) port $web_ports flags S/SA keep state
pass in on $ext_if inet proto icmp from any to ($ext_if) icmp-type echoreq keep state
这组规则默认拦截流量,再允许服务器主动发起IPv4连接、指定来源访问SSH、外部访问网站,以及IPv4 Ping请求。keep state用于跟踪连接状态,允许匹配连接的返回流量通过;($ext_if)表示对应网卡的地址。该示例没有放行IPv6,也没有放行HTTP/3使用的UDP端口。
三、检查并启用防火墙
先检查语法,不立即加载:
pfctl -vnf /etc/pf.conf
确认没有报错,再次核对管理IP与SSH端口。设置开机启动并启动服务:
sysrc pf_enable="YES"
sysrc pflog_enable="YES"
service pf start
service pflog start
PF默认读取/etc/pf.conf,pflog负责记录带有log选项的匹配流量。
启用后,保留当前连接,另外打开一个终端重新登录SSH,并从外部访问网站。旧连接可能仍匹配已有状态,不能仅凭旧窗口可操作就认定新连接也能通过。
四、修改与查看规则
后续修改规则时,继续采用“先检查、后加载”的顺序:
pfctl -nf /etc/pf.conf
pfctl -f /etc/pf.conf
查看PF状态、过滤规则和连接状态:
pfctl -si
pfctl -sr
pfctl -ss
日常更新规则通常不需要清空整个状态表。不要为了使规则“立即生效”而随意执行清空全部状态的命令,否则可能影响正在进行的连接。
五、查看拦截日志
实时查看日志接口:
tcpdump -n -e -ttt -i pflog0
读取保存的日志:
tcpdump -n -e -ttt -r /var/log/pflog
PF日志采用抓包文件格式,应使用tcpdump等工具读取,不能直接当作普通文本日志查看。本例的block log all可用于观察被拦截流量;公网扫描较多时,也应关注日志增长情况。
六、配置错误时如何恢复
如果新连接被误拦截,先通过本地终端或服务商控制台登录。
存在可用备份时,检查并重新加载备份规则:
pfctl -nf /root/pf.conf.before-change
pfctl -f /root/pf.conf.before-change
确认访问恢复后,再将备份恢复到配置文件,避免重启后重新加载错误配置。
紧急情况下,也可以从控制台暂时禁用PF:
pfctl -d
禁用PF会撤销其过滤保护,只适用于临时恢复访问。 修复规则后,应重新检查、加载并启用:
pfctl -nf /etc/pf.conf
pfctl -f /etc/pf.conf
pfctl -e
以上操作分别完成规则检查、加载与启用。
七、常见问题
规则中已经放行SSH,为什么仍然无法连接?
先核对管理来源地址和实际SSH端口。尤其要区分管理员电脑的局域网地址与服务器实际看到的公网出口地址,规则中的来源必须匹配后者。
修改配置文件后,规则为什么没有变化?
编辑文件不会自动替换当前规则。检查通过后,还需要执行pfctl -f /etc/pf.conf,并使用pfctl -sr核对已加载内容。
可以直接复制OpenBSD的PF配置吗?
不建议未经检查直接使用。FreeBSD中的PF实现与OpenBSD版本存在差异,应以当前FreeBSD系统的手册和语法检查结果为准。
广告合作
QQ群号:4114653
- 本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。邮箱:2942802716#qq.com(#改为@)。
- 本站原创内容未经允许不得转载,转载请注明出处“站长百科”和原文地址。