V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
nojsja
V2EX  ›  程序员

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

  •  
  •   nojsja ·
    nojsja · 2022-06-24 00:28:29 +08:00 · 3901 次点击
    这是一个创建于 915 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近正在做一个 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 全局代理下,有没有更好的处理本机流量转发的方式?就是和网卡出口流量、路由表设置、分流这些相关的东西。🙏
    20 条回复    2024-04-04 22:04:12 +08:00
    cnbatch
        1
    cnbatch  
       2022-06-24 00:47:01 +08:00   ❤️ 4
    如果你用过 wireguard 和 OpenVPN 之类的虚拟网卡 VPN ,并且在这些 VPN 连接完成后看过路由表,就会发现他们的做法跟你的一样,专门针对远程服务器 IP 单独设一条路由,走原先的路径。断开连接后,再恢复回去。
    每切换一次远程节点,都要更新一次路由表。

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

    ip route --help 看看

    另外還可以用 ip rule 指定網段使用自定義的 routing table
    kennylam777
        4
    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
        5
    nojsja  
    OP
       2022-06-24 07:16:50 +08:00
    @gfreezy #2 这个倒是了解过,考虑加入支持,但只能解决域名访问的问题。另外多级 dns 缓存的情况下好像仍有 dns 污染的问题,虽然已经设置 TTL 为 1 。
    nojsja
        6
    nojsja  
    OP
       2022-06-24 07:18:31 +08:00
    @kennylam777 #4 linux 就没这么多麻烦事儿了😂
    kennylam777
        7
    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
        8
    nojsja  
    OP
       2022-06-24 07:21:20 +08:00
    @cnbatch #1 了解 ~
    gfreezy
        9
    gfreezy  
       2022-06-24 08:23:35 +08:00 via iPhone
    @kennylam777 每个域名分配唯一 IP 好像就可以了
    lovelylain
        10
    lovelylain  
       2022-06-24 09:04:21 +08:00 via Android   ❤️ 1
    本机透明代理是一个难解的难题,之前也折腾过,给局域网内其他 ip 代理或者 bridge 容器内代理都好实现,但是本机或 host 容器把本机路由全导给代理,代理本身又要走原来网关出去,目标 ip 固定还好说,但是我是代理内部做分流,
    Ehco1996
        11
    Ehco1996  
       2022-06-24 09:06:38 +08:00   ❤️ 1
    可以看一下 clash fake-ip 的实现
    nojsja
        12
    nojsja  
    OP
       2022-06-24 09:26:52 +08:00
    @jobmailcn #10 我去瞧瞧 clash
    caobug
        13
    caobug  
       2022-06-24 11:12:13 +08:00 via iPhone
    直接用 wintun
    sslyd
        14
    sslyd  
       2022-06-24 11:14:05 +08:00
    用一条静态路由指定 ss-server??
    ty359
        15
    ty359  
       2022-06-24 18:21:12 +08:00
    我弱弱的问一句,shadowsocks 图形化客户端的全局代理是怎么实现的么
    nojsja
        16
    nojsja  
    OP
       2022-06-24 18:52:50 +08:00
    @ty359 #15 那个是操作系统提供的 proxy 接口,通过系统设置界面自定义 http 或 socks 代理地址和端口就行。不过一般只能浏览器用,而且只能代理 tcp 流量。
    nojsja
        17
    nojsja  
    OP
       2022-06-24 18:55:59 +08:00
    @sslyd #14 暂时只找到这个方式
    yaott2020
        18
    yaott2020  
       2022-06-25 09:08:51 +08:00 via Android
    没啥好的办法,14 楼算是目前最普遍的方式了。linux 下倒是可以用 uid/gid mark 来规避
    AceDogs
        19
    AceDogs  
       266 天前
    @gfreezy 请问如果这样的话,tun 网卡默认没有拦截流量,那 DNS 请求如果进入 fakedns 服务本身呢?
    gfreezy
        20
    gfreezy  
       264 天前
    @liufengsoft722 fakedns ,需要将需要中转的域名都解析道 10.11.*.* ,然后 10.11.*.* 这个网段的 ip 都路由到 tun 。
    自己实现一个 dns 服务器,然后将本机 dns ip 设置为自己服务器启动的地址。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5293 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 08:00 · PVG 16:00 · LAX 00:00 · JFK 03:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.