自己配置 clash tun 路由规则完成 macOS 上的流量转发 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
dianqk
V2EX    macOS

自己配置 clash tun 路由规则完成 macOS 上的流量转发

  •  1
     
  •   dianqk 2022-06-07 09:28:33 +08:00 6748 次点击
    这是一个创建于 1289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    虽然我在切换到 Linux 做主力机后用到很顺利,但是工作上不可避免要用到 macOS 。咱还是得有个凑合够用的代理方案。我买了 5 设备版本的 surge 但我更想尝试用(相对)开源软件进行替代。

    这篇文章以 clash premium 闭源件为例,不过 https://github.com/MetaCubeX/Clash.Meta/tree/Alpha 这里有一份 fork 开源 tun 实现。

    使用 clash 并不会和 wireguard 等服务冲突。

    很抱歉我对网络相关的知识还处于一窍不通的状态,之前也只是看了 iptables 的手册。如果有啥错误的地方还请直接指出来。

    macOS 的流量转发

    为了将流量转发到特定服务上,我们可以使用 route 这个工具。

    使用下面的命令可以目标为 198.18.0.0/16 流量发到 198.18.0.1 这个网关 /tun/interface:

    route add -net 198.18.0.0/16 198.18.0.1 

    198.18.0.0/15 是个特殊网段,正常不会有网站使用这个 ip ,刚好 clash 可以用来做 fake-ip 。

    clash/surge 都是通过这个基本操作完成的流量转发。 如果要代理全部的流量就要添加更完整的路由规则,不过这里我的使用方法和 clash/surge 不同,我没有配置所有 ip 都转发到 clash tun 中。 一个原因是我不知道该咋处理回环流量,如果这里接管所有流量,clash 本身发出的流量可能还会走这个路由形成个环,另外一个重要原因我可以自己配置路由规则来更好地支持 wireguard 和 openconnect 。

    从 Clash.Meta 上的代码看,似乎是 clash 会直接把从 tun 来的流量直接发到 en0 ?

    由于上述的配置,只有 198.18.0.0/16 会走到 clash ,其他网段还是走系统默认规则,这刚好不会干扰其他流量转发服务,免得一个数据包走好几次路由。

    此时使用 wg-quick 会启动 wireguard 同时配置类似上面的路由规则,最后启动 openconnect 也会有类似的路由规则。

    路由表大概是这个样子:

    198.18.0.0/16 -> 198.18.0.1 (clash tun3) 192.168.1.1/24 -> 192.168.2.1 (wireguard tun4) 10.0.0.0/8 -> 10.0.0.1 (openconnect tun5) other -> en0 

    分别完成各自的代理。

    DNS

    只配置路由规则不够,我们还需要启动 clash 的 DNS 服务,并设置系统的 DNS 为 clash 提供的 ip 。 这里直接让 clash 监听 0.0.0.0:53 ,系统就可以设置代理为 127.0.0.1 或者 198.18.0.1 (最好选择 198.18.0.1 )。

    此时使用 nslookup 就能得到一个类似下面的 ip:

    $ nslookup v2ex.com Server: 198.18.0.1 Address: 198.18.0.1#53 Name: v2ex.com Address: 198.18.1.104 

    此时所有域名流量应该都会转发到 clash 同时完成代理浏览的功能。

    配置 clash 的 DNS 例外

    如果所有域名都在 198.18.0.0/16 内,那 wireguard 等无法接管对应的流量。 clash 的 dns 服务提供了例外配置,我们把使用 wireguard 和 openconnect 代理的域名添加进去。 此时这些域名的会指向原本的 ip ,这样一来就完成以下内容:

    • 大部分的域名访问由 clash 处理
    • 内网 ip 访问直接由 wireguard/openconnect 处理
    • 内网域名由于不在 198.18.0.0/16 范围,仍然由 wireguard/openconnect 处理

    Telegram 插曲

    如果所有网站都使用域名提供服务,那可太开心了,上面这波配置就结束了,可是像 Telegram 客户端会直接使用 ip 访问,这个我们直接补一份 Telegram 的 ip 段路由到 clash tun 即可。

    到这一步基本上就完成了!接下来我们让这一套流程开机自动执行。

    launchctl 配置自启动 & 脚本设置路由和 DNS

    比较遗憾的是 clash 还没有提供像 openconnect 的 --vpnc-script 参数,可以调用一个脚本配置路由。

    在这里我创建了两个 plist ,参见: https://gist.github.com/DianQK/752412a5b79d4117bb95127a096ffdc1

    最后补充,这还有个优势,如果你挂了 qt 等服务,这可以在 ip 路由上避免 qt 走代理。

    目前尚无回复
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     969 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 27ms UTC 19:10 PVG 03:10 LAX 11:10 JFK 14:10
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86