pfctl
pfctl 是用于控制 OpenBSD 或 FreeBSD 上的 Packet Filter (PF) 防火墙的命令行工具。以下是 pfctl 的一些常见用法:
- 加载规则集:
1
pfctl -f /etc/pf.conf
这会从指定的配置文件加载防火墙规则。
- 启用 PF:
1
pfctl -e
- 禁用 PF:
1
pfctl -d
- 显示当前规则:
1
pfctl -s rules
- 显示当前状态表:
1
pfctl -s state
- 清除规则:
1
pfctl -F all
这会清除所有规则、状态和计数器。
- 重新加载规则(不中断现有连接):
1 2
pfctl -nf /etc/pf.conf # 测试配置文件语法 pfctl -f /etc/pf.conf # 如果测试通过,加载新规则
- 显示统计信息:
1
pfctl -s info
- 显示接口信息:
1
pfctl -s Interfaces
- 添加单个规则(临时):
1
echo "block in on em0 from 192.168.1.100 to any" | pfctl -a temp -f -
这会临时添加一个阻止规则。
- 删除临时规则集:
1
pfctl -a temp -F all
- 显示 NAT 规则:
1
pfctl -s nat
- 显示详细的状态信息:
1
pfctl -vvs states
- 杀死特定状态:
1
pfctl -k host -k 192.168.1.100
这会终止与指定主机相关的所有状态。
使用 pfctl 时,请注意:
- 大多数命令需要 root 权限。
- 在进行重大更改之前,最好先备份当前的配置。
- 使用
-n
选项可以进行语法检查而不实际应用更改。 - 在生产环境中更改防火墙规则时要格外小心,错误的配置可能会导致网络中断。
具体语法规则
1
2
action direction [log] on interface [af] [proto protocol] \
from source to destination [flags] [state]
- action(动作):
- pass: 允许数据包通过
- block: 阻止数据包
- match: 匹配数据包但继续处理
- rdr: 重定向(用于端口转发)
- nat: 网络地址转换
- direction(方向):
- in: 入站流量
- out: 出站流量
- [log](日志,可选):
- log: 记录匹配此规则的数据包
- on interface(接口,可选),,默认为所有接口:
- em0, em1 等: 以太网接口
- wlan0: 无线接口
- lo0: 回环接口
- ppp0: 点对点协议接口
- tun0: 隧道接口
- 也可以使用宏定义的接口名,如 $ext_if
- [af](地址族,可选):
- inet: IPv4
- inet6: IPv6
- [proto protocol](协议,可选):
- tcp: TCP 协议
- udp: UDP 协议
- icmp: ICMP 协议
- any: 任何协议
- from source(源地址):
- any: 任何地址
- IP 地址: 如 192.168.1.100
- 网段: 如 192.168.1.0/24
- 表: 如
- to destination(目标地址):
- 同 source,可以是 any, IP 地址, 网段或表
- [flags](TCP 标志,可选):
- S: SYN
- A: ACK
- F: FIN
- R: RST
- P: PSH
- U: URG
- W: ECE
- E: CWR
- [state](状态跟踪,可选):
- keep state: 保持状态
- modulate state: 修改初始序列号
- synproxy state: SYN 代理
额外的选项(虽然不在基本语法中,但经常使用):
- port(端口):
- 单个端口: 如 80
- 端口范围: 如 1024:65535
- 服务名: 如 http, ssh
- user(用户):
- 用户名或 UID
- group(组):
- 组名或 GID
示例规则:
1
pass in on em0 proto tcp from any to any port 80 flags S/SA keep state
这条规则允许任何源地址到任何目标地址的 80 端口的入站 TCP 连接,要求 SYN 标志设置(新连接),并保持状态跟踪。
具体例子
比如你要封禁udp
1
2
3
4
block in proto udp from any to any
block in proto udp from any to any [port 53]
block out proto udp from any to any
block in proto udp from any to any [port 1000:2000] [port {12 13 14}]
This post is licensed under CC BY 4.0 by the author.