pf 防火墙是 macOS 上内置的一种基于状态的防火墙,可以根据 IP 地址、端口号、协议和其他条件来控制网络流量。而pfctl 是 macOS 上用于配置 pf 防火墙的命令行工具。
一、常见场景的命令及其功能介绍
1、加载和应用配置文件:
-
sudo pfctl -f /etc/pf.conf: 加载指定的 pf 防火墙配置文件 /etc/pf.conf 并使其生效。这样可以更新防火墙规则而无需重启系统。
-
sudo pfctl -s info: 显示有关当前 pf 防火墙状态的详细信息,包括已加载的规则、网络接口配置等。 -
sudo pfctl -s state: 显示当前 pf 防火墙状态表中的状态信息。 -
sudo pfctl -s rules: 显示当前 pf 防火墙的规则集。 -
sudo pfctl -s nat: 显示当前 pf 防火墙的网络地址转换 (NAT) 规则集。
3、规则管理:
-
sudo pfctl -a 'rulename' -f /path/to/rules: 加载指定规则文件到名为 'rulename' 的规则集。
-
sudo pfctl -a 'rulename' -sr: 显示名为 'rulename' 的规则集中的规则。
-
sudo pfctl -a 'rulename' -d: 禁用名为 'rulename' 的规则集。
-
sudo pfctl -a 'rulename' -e: 启用名为 'rulename' 的规则集。
4、防火墙启用和禁用:
-
sudo pfctl -e: 启用 pf 防火墙,开始根据加载的规则进行流量过滤和控制。
-
sudo pfctl -d: 禁用 pf 防火墙,允许所有流量通过。
5、日志记录和调试:
-
sudo pfctl -s log: 显示当前的日志设置和日志文件的内容。
-
sudo pfctl -s all: 显示所有 pf 防火墙的状态、规则和日志信息。
这些是 pfctl 常见的命令和场景,用于配置、管理和监视 pf 防火墙。pfctl 还提供了其他选项和命令,可用于更高级的功能,如带宽控制、连接状态跟踪等。可以通过 man pfctl 命令查看完整的 pfctl 命令文档和选项说明。
二、场景测试
在分享之前,顺便介绍一个AI命令行工具Warp-集成了AI能力的command terminal,可以提高效率。
Warp is the terminal reimagined with AI
https://www.warp.dev/
比如我想知道如何curl baidu只显示response header头部份,可以这样:
场景一:禁止访问IP地址
笔者是不想自己公司的电脑被DLP监控,所以想到通过pf来阻止mac电脑访问DLP的server端,是不是可行??
# 解析www.baidu.com 的IP地址
nslookup www.baidu.com
# 测试访问效果
curl -I www.baidu.com
# 更新防火墙规则
sudo pfctl -f /etc/pf.conf
# pfctl的规则
block drop out quick from any to 153.3.238.102
这个 pfctl 配置规则的含义是阻止任何源 IP 地址的流量从本机(out)发送到目标 IP 地址 10.34.132.151,下面是对该配置的解读:
-
block drop: 这表明匹配的流量将被直接丢弃,并不会返回任何响应
-
out: 这表示该规则适用于从本机发送出去的流量
-
quick: 这表示一旦匹配到该规则,不再继续匹配其他规则,直接执行相应操作
-
from any: 这表示该规则适用于任何源 IP 地址
-
to 10.34.132.151: 这表示目标 IP 地址是 10.34.132.151
场景二:禁止访问域名
测试直接禁止本地访问域名:www.baidu.com
# pfctl的规则
block drop out quick from any to www.baidu.com
‼️这里延伸一下,关于PF防火墙是根据什么原理来根据域名识别流量并采取动作的,我问了下chatgpt:
对于基于域名的规则,pf防火墙可以使用域名解析服务(如DNS)来获取与
域名相关的IP地址。一旦获取到目标域名的IP地址,pf防火墙就可以将之
与数据包中的目标地址进行比较。如果数据包的目标地址与规则中指定的域名
的IP地址匹配,那么该规则就会被触发,从而对数据包进行相应的操作,
如阻止(block)或丢弃(drop)。通过这种方式,pf防火墙可以根据域名
来识别流量,并根据规则对其进行处理。
并不是笔者认为的比较高深的技术,那么我的问题来了,通过将配置的域名先解析为IP地址,在根据实际解析的IP进行识别,这个会存在不准确的问题,特别是对于一些域名解析结果特别多或者解析结果经常变化的,可能会识别错误,可以简单证明一下:
1)PF 写规则将www.baidu.com拦截
block drop out quick from any to www.baidu.com
2)按照下图所示的四步去配置
3)我的猜测是,如果PF 防火墙是其他的原理,那么篡改hosts应该不会影响结果,但是测试下来是影响了,所以我猜测Pf 防火墙根据域名能识别流量的原理和上面chatgpt说的一至。
一顿瞎验证🙄,也不知道对不对,可以评论区留言讨论。
场景三:禁止IP+Port
禁止出去访问192.168.3.1的80端口,但不禁止其他,例如icmp
# pfctl的规则
block drop out quick proto tcp from any to 192.168.3.1 port 80
场景四:block drop & block return的不同
block drop上面说到,表明匹配的流量将被直接丢弃,并不会返回任何响应;block return则表示匹配的流量被拒绝并返回响应给客户端。
先测试block drop:
block drop out quick proto tcp from any to 192.168.3.1 port 80
再测试block return:
block return out quick proto tcp from any to 192.168.3.1 port 80
场景五:阻止特定协议通过
例如禁止dns协议的流量出去:
block out proto udp
三、高级用法
PF 防火墙除了基本的规则配置外还拥有强大的功能,拥有一些高级的用法和功能,包括:
-
配置地址表(Tables):可以使用pfctl命令创建和管理地址表,用于存储IP地址、网络地址或端口号的集合。地址表可用于更灵活的配置规则,例如在规则中引用一个地址表来指定多个IP地址或网络。
-
按时间调度规则:使用pfctl可以配置按时间调度的规则,即根据时间段或特定的日期来激活或禁用规则。这在需要按时段进行访问控制或限制的情况下非常有用。
-
配置带宽控制和流量限制:pfctl允许配置带宽控制和流量限制,以实现流量管理和公平共享带宽。通过配置ALTQ(Alternate Queueing)功能,可以对特定流量进行带宽限制、优先级设置和队列管理。
这里演示下比较能用得到的配置地址表(Tables)。
1)创建地址表
sudo pfctl -t denyiplist -T add 192.168.3.1
2)添加/删除地址到地址表
# 删除
sudo pfctl -t myblocklist -T delete 192.168.3.1
# 添加
sudo pfctl -t myblocklist -T add 192.168.3.1
3)查看地址表
# 查看
sudo pfctl -t blocklist -T show
4)在规则中引用地址表
# /etc/pf.conf规则引用地址表:denyiplist
block out quick from any to <denyiplist>
5)测试效果
试验做的差不多了,最后通过命令总结一下。
# 查看一下防火墙的规
sudo pfctl -sr
等价:
sudo pfctl -s rules
# 查看pf防火墙所有信息
sudo pfctl -s all
sudo pfctl -s all
No ALTQ support in kernel
ALTQ related functions disabled
TRANSLATION RULES:
"com.apple/*" all
"com.apple/*" all
FILTER RULES:
"com.apple/*" all fragment reassemble
anchor "com.apple/*" all
block drop out quick inet from any to 10.34.132.151
block drop out quick inet from any to 18.166.181.78
block drop out quick from any to <denyiplist>
DUMMYNET RULES:
"com.apple/*" all
INFO:
Status: Enabled for 0 days 01:15:20 Debug: Urgent
State Table Total Rate
current entries 0
searches 476455 105.4/s
inserts 0 0.0/s
removals 0 0.0/s
Counters
match 308161 68.2/s
0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
0 0.0/s
congestion 0 0.0/s
0 0.0/s
0 0.0/s
0 0.0/s
0 0.0/s
0 0.0/s
0 0.0/s
synproxy 0 0.0/s
dummynet 0 0.0/s
0 0.0/s
TIMEOUTS:
120s
30s
86400s
900s
45s
90s
30s
60s
30s
60s
20s
10s
120s
30s
1800s
120s
900s
60s
30s
60s
frag 30s
interval 10s
6000 states
12000 states
0s
LIMITS:
states hard limit 10000
hard limit 10000
hard limit 10000
frags hard limit 5000
tables hard limit 1000
hard limit 200000
TABLES:
blocklist
denyiplist
myblocklist
table
OS FINGERPRINTS:
696 fingerprints loaded
原文始发于微信公众号(安全随笔):packet filter防火墙工具分享
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论