有用过 tun2socks 的吗 本机代理陷入 loops 有啥好的办法?

2022-06-24 00:28:29 +08:00
 nojsja
最近正在做一个 proxy 工具,需要支持全局代理。目前方案是创建 tun 虚拟网卡,使用 tun2socks 转发流量到本机 localhost 的 ssr/ss 代理客户端 ss-local ,客户端 ss-local 再向 ss-server 通信就行了。

因为需要全局使用,所以在 windows 路由表让所有流量走虚拟网卡( route add 0.0.0.0 => tun ),但是我发现 ss-local 向 ss-server 请求时会形成 route loop (又匹配到了 0.0.0.0 的路由规则),导致请求发不出去。

我尝试单独设置 ss-server 的 ip 走原来的网关,不走虚拟网卡,这样子是可行的,代理也可以正常工作。但是这样不太合理,每次切换 ss-server 就要设置路由,也很可能造成软件运行中的一些 bug 。所以想问下:tun 全局代理下,有没有更好的处理本机流量转发的方式?就是和网卡出口流量、路由表设置、分流这些相关的东西。🙏
3341 次点击
所在节点    程序员
20 条回复
cnbatch
2022-06-24 00:47:01 +08:00
如果你用过 wireguard 和 OpenVPN 之类的虚拟网卡 VPN ,并且在这些 VPN 连接完成后看过路由表,就会发现他们的做法跟你的一样,专门针对远程服务器 IP 单独设一条路由,走原先的路径。断开连接后,再恢复回去。
每切换一次远程节点,都要更新一次路由表。

所以,既然选择了虚拟网卡的方式,那么更新路由表并没什么不妥。
gfreezy
2022-06-24 00:54:37 +08:00
可以用 fakedns 的方法,把需要走 tun 的域名全部解析到一个特殊的网段,这个网段的 IP 在路由到 tun
kennylam777
2022-06-24 05:34:03 +08:00
Routing table 可以自定義的,不必去動 Main 。

ip route --help 看看

另外還可以用 ip rule 指定網段使用自定義的 routing table
kennylam777
2022-06-24 05:35:57 +08:00
噢,看到了是 Windows ,那沒辦法了,OpenVPN 也是把 remote server 的 IP x.x.x.x/32 via y.y.y.y 加到 routing table 後才加 0.0.0.0/0 的
nojsja
2022-06-24 07:16:50 +08:00
@gfreezy #2 这个倒是了解过,考虑加入支持,但只能解决域名访问的问题。另外多级 dns 缓存的情况下好像仍有 dns 污染的问题,虽然已经设置 TTL 为 1 。
nojsja
2022-06-24 07:18:31 +08:00
@kennylam777 #4 linux 就没这么多麻烦事儿了😂
kennylam777
2022-06-24 07:19:39 +08:00
@gfreezy 這方法應該是比較完美的,只是 TCP 443 的要小心 HTTP/2 connection coalescing 問題,相同的 IP address 會被 connection reuse ,例如 a.comb.com 也是 192.168.89.64 的話,先載入 a.com 然後當中有 b.com 的請求,也會一併發到 a.com 的 HTTP2 連線中去。
nojsja
2022-06-24 07:21:20 +08:00
@cnbatch #1 了解 ~
gfreezy
2022-06-24 08:23:35 +08:00
@kennylam777 每个域名分配唯一 IP 好像就可以了
lovelylain
2022-06-24 09:04:21 +08:00
本机透明代理是一个难解的难题,之前也折腾过,给局域网内其他 ip 代理或者 bridge 容器内代理都好实现,但是本机或 host 容器把本机路由全导给代理,代理本身又要走原来网关出去,目标 ip 固定还好说,但是我是代理内部做分流,
Ehco1996
2022-06-24 09:06:38 +08:00
可以看一下 clash fake-ip 的实现
nojsja
2022-06-24 09:26:52 +08:00
@jobmailcn #10 我去瞧瞧 clash
caobug
2022-06-24 11:12:13 +08:00
直接用 wintun
sslyd
2022-06-24 11:14:05 +08:00
用一条静态路由指定 ss-server??
ty359
2022-06-24 18:21:12 +08:00
我弱弱的问一句,shadowsocks 图形化客户端的全局代理是怎么实现的么
nojsja
2022-06-24 18:52:50 +08:00
@ty359 #15 那个是操作系统提供的 proxy 接口,通过系统设置界面自定义 http 或 socks 代理地址和端口就行。不过一般只能浏览器用,而且只能代理 tcp 流量。
nojsja
2022-06-24 18:55:59 +08:00
@sslyd #14 暂时只找到这个方式
yaott2020
2022-06-25 09:08:51 +08:00
没啥好的办法,14 楼算是目前最普遍的方式了。linux 下倒是可以用 uid/gid mark 来规避
AceDogs
25 天前
@gfreezy 请问如果这样的话,tun 网卡默认没有拦截流量,那 DNS 请求如果进入 fakedns 服务本身呢?
gfreezy
24 天前
@liufengsoft722 fakedns ,需要将需要中转的域名都解析道 10.11.*.* ,然后 10.11.*.* 这个网段的 ip 都路由到 tun 。
自己实现一个 dns 服务器,然后将本机 dns ip 设置为自己服务器启动的地址。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/861788

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX