应用程序/接口特定路由

应用程序/接口特定路由

我有一个路由配置,其目的是将所有流量通过隧道(utun3)路由到 openvpn 客户端,然后64.120.44.114通过我的物理接口()连接到 openvpn 服务器( en0)。

我想要做的是直接通过物理接口 ( en0) 而不是通过隧道 ( utun3) 路由某些应用程序。目前,路由对0/1128.0/1强制所有互联网流量通过隧道。

我曾设想,如果我要从一个将其传出地址绑定在物理接口上的应用程序(即10.0.1.15)向 Internet 地址发送流量,则此流量将通过default该地址接口的剩余路由(en0)进行路由。不幸的是,操作系统无法路由这些数据包:

$ ping 8.8.8.8          # or mtr 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=40.835 ms

$ ping -b utun3 8.8.8.8 # or mtr -a 10.12.44.16 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: icmp_seq=0 ttl=55 time=42.036 ms

$ ping -b en0 8.8.8.8   # or mtr -a 10.0.1.15 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
ping: sendto: No route to host

我可以做些什么来确保使用与覆盖路由不兼容的传出地址发送的数据包改用兼容路由?如果没有,是否有其他配置路由表的方法,可用于为特定应用程序路由0/1但“默认”路由?如果没有这样的路由方法,您能否推荐任何软件解决方案来执行特定于应用程序的路由或忽略路由表?就我的情况而言,理想情况下,该软件应该在 macOS 上运行。128.0/1defaulten0utun3

我有以下接口:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 60:03:08:8b:96:88
    inet6 fe80::1c29:1e13:e8ba:fd3%en0 prefixlen 64 secured scopeid 0x5
    inet 10.0.1.15 netmask 0xffffff00 broadcast 10.0.1.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active
utun3: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1500
    inet 10.12.44.16 --> 10.12.44.16 netmask 0xfffffc00

我的路由表中有以下内容:

default            10.0.1.1           UGSc            0        0     en0
10.0.1.1           0:24:36:a0:86:a5   UHLWIir         4      106     en0
64.120.44.114/32   10.0.1.1           UGSc            1        0     en0

0/1                10.12.44.1         UGSc          101        2   utun3
128.0/1            10.12.44.1         UGSc           12        0   utun3
10.12.44/22        10.12.44.16        UGSc            1        0   utun3
10.12.44.16        10.12.44.16        UH              3      170   utun3

答案1

Linux 路由非常灵活,有很多方法可以实现你想要的功能。但这样会增加设置的复杂性(也就是说,如果遇到问题,排除故障会变得更加困难)

我认为,最简单的方法是使用规则来实现基于数据包源的路由。(有时思科称之为基于策略的路由)

Linux 支持多个路由表,并且可以轻松添加自定义表(阅读 iproute2 手册)

然后,它支持规则,根据优先级和标准将“路由搜索”定向到不同的表。规则标准可以是源地址。默认情况下有 3 个表:本地表、主表和默认表。您可以:

1-创建一个新表,说“直接”

    echo "100 direct" >> /etc/iproute2/rt_tables

2-通过 en0 向该表添加默认路由

    ip route add default dev en0 table direct

3-添加一条新规则,例如优先级为 1000,以使用表直接处理源自 10.0.1.15 的流量

    ip rule add from 10.0.1.15 lookup direct

现在,问题是 MacOS 不是 Linux,我知道您的问题出在 MacOS 上,而我对它不是很熟悉。不过,这似乎是可行的。当前的 MacOS 附带 PF,这是一个从 OpenBSD 移植的防火墙,显然是在 4.5 版阶段。此防火墙能够根据规则在内核级别修改路由(除了做很多其他事情之外)。您可以使用路线规则中的关键字。规则通常在锚点其中包含配置部分。PF 默认处于禁用状态,因此您也需要启用它。您可以:

1-创建一个新的锚点配置文件/etc/pf.anchors/pbr.conf和:

     pass out on utun3 route-to (en0 10.0.1.1) from utun3 to any

如果源是 utun3 地址,则将通过 utun3 重定向传出的流量到 en0。

2- 将此锚点添加到 pf 配置编辑中/etc/pf.conf并把

    anchor "pbr.rules"
    load anchor "pbr.rules" from "/etc/pf.anchors/pbr.rules"

3- 以某种方式启用 PF,进行测试时你可以使用修改器然后你可以使用pfctl -F 全部 -f /etc/pf.conf如果需要则重新加载配置。

启动/登录时运行命令(Mac OS X)

相关内容