macOS下通过pf.conf配置基于用户的多接口流量路由问题
问题原因
当前配置存在3个核心问题,导致流量无法正常通信:
route-to仅指定网络接口无效:以太网场景下必须填写对应接口的下一跳网关IP,否则pf无法完成二层封装,数据包无法正确发送到网关- 缺少反向流量路由规则:外部返回的响应数据包到达en1后,会匹配系统默认路由走en0回包,路径不对称导致TCP连接被直接丢弃
- 未配置源地址转换:testuser的流量从en1发出时,默认使用en0的IP作为源地址,响应包会被路由到en0,无法被testuser的进程接收
正确实现步骤
1. 提前获取接口配置信息
先执行命令查询两个网卡的IP和对应网关,后续配置需要替换为你实际的参数,示例参数如下:
- en0:IP为
192.168.1.10,网关为192.168.1.1 - en1:IP为
192.168.2.10,网关为192.168.2.1
查询命令参考:
# 查看所有接口IP ifconfig # 查看路由表获取网关地址 netstat -rn
2. 修改pf配置
编辑/etc/pf.conf,在文件末尾添加如下配置:
# 源地址转换规则:不同用户的出口流量自动转换为对应网卡的IP nat on en0 from any to any user admin -> (en0) nat on en1 from any to any user testuser -> (en1) # 出站策略路由:按用户指定出口网卡和网关 pass out quick route-to (en1 192.168.2.1) all user testuser keep state pass out quick route-to (en0 192.168.1.1) all user admin keep state # 入站反向路由:响应包从接收接口原路返回 pass in quick reply-to (en0 192.168.1.1) all inet received-on en0 keep state pass in quick reply-to (en1 192.168.2.1) all inet received-on en1 keep state
注:配置中
(en0)的括号表示动态获取接口当前IP,适合动态IP场景,无需每次IP变更修改配置。
3. 加载并生效配置
先校验配置语法是否合法:
pfctl -nf /etc/pf.conf
无报错后加载配置,如果pf未启用需要先执行pfctl -e启用pf服务:
pfctl -f /etc/pf.conf
4. 验证效果
分别切换到admin和testuser用户,执行curl ifconfig.me,返回的出口IP对应两个网卡的公网IP即配置成功。
注意事项
如果是macOS系统,系统升级可能会覆盖/etc/pf.conf默认配置,建议将自定义规则写入/etc/pf.anchors/下的独立锚点文件,再在pf.conf中引入锚点,避免配置丢失。
内容的提问来源于stack exchange,提问作者Hao
相关产品推荐
相关产品推荐

