Post

pfctl

pfctl 是用于控制 OpenBSD 或 FreeBSD 上的 Packet Filter (PF) 防火墙的命令行工具。以下是 pfctl 的一些常见用法:

  1. 加载规则集:
    1
    
    pfctl -f /etc/pf.conf
    

    这会从指定的配置文件加载防火墙规则。

  2. 启用 PF:
    1
    
    pfctl -e
    
  3. 禁用 PF:
    1
    
    pfctl -d
    
  4. 显示当前规则:
    1
    
    pfctl -s rules
    
  5. 显示当前状态表:
    1
    
    pfctl -s state
    
  6. 清除规则:
    1
    
    pfctl -F all
    

    这会清除所有规则、状态和计数器。

  7. 重新加载规则(不中断现有连接):
    1
    2
    
    pfctl -nf /etc/pf.conf  # 测试配置文件语法
    pfctl -f /etc/pf.conf   # 如果测试通过,加载新规则
    
  8. 显示统计信息:
    1
    
    pfctl -s info
    
  9. 显示接口信息:
    1
    
    pfctl -s Interfaces
    
  10. 添加单个规则(临时):
    1
    
    echo "block in on em0 from 192.168.1.100 to any" | pfctl -a temp -f -
    

    这会临时添加一个阻止规则。

  11. 删除临时规则集:
    1
    
    pfctl -a temp -F all
    
  12. 显示 NAT 规则:
    1
    
    pfctl -s nat
    
  13. 显示详细的状态信息:
    1
    
    pfctl -vvs states
    
  14. 杀死特定状态:
    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]
  1. action(动作):
    • pass: 允许数据包通过
    • block: 阻止数据包
    • match: 匹配数据包但继续处理
    • rdr: 重定向(用于端口转发)
    • nat: 网络地址转换
  2. direction(方向):
    • in: 入站流量
    • out: 出站流量
  3. [log](日志,可选):
    • log: 记录匹配此规则的数据包
  4. on interface(接口,可选),,默认为所有接口:
    • em0, em1 等: 以太网接口
    • wlan0: 无线接口
    • lo0: 回环接口
    • ppp0: 点对点协议接口
    • tun0: 隧道接口
    • 也可以使用宏定义的接口名,如 $ext_if
  5. [af](地址族,可选):
    • inet: IPv4
    • inet6: IPv6
  6. [proto protocol](协议,可选):
    • tcp: TCP 协议
    • udp: UDP 协议
    • icmp: ICMP 协议
    • any: 任何协议
  7. from source(源地址):
    • any: 任何地址
    • IP 地址: 如 192.168.1.100
    • 网段: 如 192.168.1.0/24
    • 表: 如
  8. to destination(目标地址):
    • 同 source,可以是 any, IP 地址, 网段或表
  9. [flags](TCP 标志,可选):
    • S: SYN
    • A: ACK
    • F: FIN
    • R: RST
    • P: PSH
    • U: URG
    • W: ECE
    • E: CWR
  10. [state](状态跟踪,可选):
    • keep state: 保持状态
    • modulate state: 修改初始序列号
    • synproxy state: SYN 代理

额外的选项(虽然不在基本语法中,但经常使用):

  1. port(端口):
    • 单个端口: 如 80
    • 端口范围: 如 1024:65535
    • 服务名: 如 http, ssh
  2. user(用户):
    • 用户名或 UID
  3. 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.

Trending Tags