有用过 tun2socks 的吗 本机代理陷入 loops 有啥好的办法? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
nojsja
V2EX    程序员

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

  •  
  •   nojsja
    nojsja 2022-06-24 00:28:29 +08:00 4621 次点击
    这是一个创建于 1213 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近正在做一个 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  
       2024-04-03 15:52:32 +08:00
    @gfreezy 请问如果这样的话,tun 网卡默认没有拦截流量,那 DNS 请求如果进入 fakedns 服务本身呢?
    gfreezy
        20
    gfreezy  
       2024-04-04 22:04:12 +08:00
    @liufengsoft722 fakedns ,需要将需要中转的域名都解析道 10.11.*.* ,然后 10.11.*.* 这个网段的 ip 都路由到 tun 。
    自己实现一个 dns 服务器,然后将本机 dns ip 设置为自己服务器启动的地址。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1015 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 18:46 PVG 02:46 LAX 11:46 JFK 14:46
    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