在macOS Ventura中使用pfctl禁用VPN连接的技术咨询
在macOS Ventura中使用pfctl禁用VPN连接的技术咨询
没问题,这完全可以通过pfctl实现,我来帮你梳理下当前规则的问题并给出调整方案:
首先,你当前的规则有个核心问题:block all放在最前面会直接拦截所有流量——因为pf是按从上到下的顺序匹配规则的,一旦触发block all,后面的允许规则根本没机会生效。所以得先把允许的规则放在前面,最后再拦截剩余流量。
另外,要禁用VPN连接,我们需要针对性拦截VPN常用的协议、端口,以及macOS上VPN默认使用的虚拟接口(通常是utun*开头的接口)。结合你的需求,我整理了一套完整的规则:
# 允许回环接口的所有流量(本地进程间通信必需,不能少) pass on lo0 all # 保留你指定的DNS服务器流量规则 pass out proto {tcp, udp} from any to 8.8.8.8 port 53 keep state pass out proto {tcp, udp} from any to 8.8.4.4 port 53 keep state # 允许本地网卡en0到指定IP的80/443流量(现在会生效,因为放在block前面) pass on en0 proto {tcp, udp} from any to 192.168.50.67 port {80, 443} keep state # 如果你想允许整个本地局域网的流量,可改成:pass on en0 all keep state # 拦截所有VPN相关流量 # 拦截常见VPN协议的端口:OpenVPN(1194)、IPsec(500/4500)、WireGuard(51820) block out proto {tcp, udp} from any to any port {1194, 500, 4500, 51820} # 拦截IPsec使用的ESP协议 block out proto esp all # 拦截所有通过VPN虚拟接口的流量(macOS VPN基本都用utun开头的接口) block on utun* all # 最后拦截所有未被允许的剩余流量 block all
接下来是操作步骤:
- 先备份原有的pf配置文件:
sudo cp /etc/pf.conf /etc/pf.conf.backup - 把上面的规则写入
/etc/pf.conf(可以用sudo nano /etc/pf.conf编辑) - 启用pfctl:
sudo pfctl -e - 加载新规则:
sudo pfctl -f /etc/pf.conf - 验证规则:用
sudo pfctl -s rules查看当前生效的规则,或者尝试连接VPN,应该会被拦截。
几个补充注意点:
- 如果遇到某些特殊VPN没被拦截,可以用
tcpdump抓包查看它使用的端口/协议,然后添加到拦截规则里。 - macOS重启后pfctl会默认关闭,要是想开机自动启用,需要配置launchd,但注意Ventura的系统完整性保护(SIP)可能会限制修改,操作前最好了解清楚。
- 所有pfctl命令都需要管理员权限,记得加
sudo。
备注:内容来源于stack exchange,提问作者user2354128




