V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
body007
V2EX  ›  Go 编程语言

一个 TCP 端口同时处理 socks5 和 http 代理请求,客户端不用记两个端口了。

  •  
  •   body007 · 84 天前 · 3154 次点击
    这是一个创建于 84 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码片段: https://gist.github.com/jan-bar/b856c271712a6481260131dd66dd7ffe

    测试命令如下

    # http CONNECT proxy method
    curl -v -x http://127.0.0.1:1080 https://cn.bing.com https://www.baidu.com https://www.sina.com
    # http direct proxy method
    curl -v -x http://127.0.0.1:1080 cn.bing.com www.baidu.com www.sina.com
    # socks5 proxy method
    curl -v -x socks5://127.0.0.1:1080 https://cn.bing.com https://www.baidu.com https://www.sina.com
    # socks5h proxy method
    curl -v -x socks5h://127.0.0.1:1080 https://cn.bing.com https://www.baidu.com https://www.sina.com
    

    还可以在 func proxyDial 方法中添加连接二级代理服务器的代码。

    13 条回复    2024-08-29 20:54:48 +08:00
    sunny352787
        1
    sunny352787  
       84 天前
    嗯,这种处理基本是现在的代理标配了,比如 clash: https://github.com/wangtz0607/clash/blob/main/listener/mixed/mixed.go
    0o0O0o0O0o
        2
    0o0O0o0O0o  
       84 天前   ❤️ 1
    我最早是在 @nadoo 的代码里看见的,现在已经是标配了
    - /t/375186
    - https://github.com/nadoo/glider/blob/668d5bc47038453e7798a6d840f6081058991a3f/mixed.go
    body007
        3
    body007  
    OP
       84 天前
    @sunny352787
    @0o0O0o0O0o

    看来盯着 shadowsocks 的我落后了,学习了。
    jason56
        4
    jason56  
       84 天前
    nowtunnel 中的代理功能也是这么做的
    - 一款不一样的组网、代理工具 https://www.nowtunnel.com
    canyue7897
        5
    canyue7897  
       84 天前 via Android
    请问这种是标准的 http socks 么?这种混合端口如果同时有数据过来,clash 有时候不识别。
    body007
        6
    body007  
    OP
       84 天前
    @canyue7897 这是标准的啊,上面用 curl 命令测试都可以的。代理工具都是我自己写的,没有用过 clash ,不清楚情况。不过看 #1 楼的回复 clash 是支持的。不过记得 http 代理有 2 种模式,可以看代码和 curl 测试命令去理解额。
    aladdinding
        7
    aladdinding  
       84 天前
    实现原理就是 net.Conn 的包装,先读几个字节匹配协议,然后丢给协议的 listener
    DefoliationM
        8
    DefoliationM  
       84 天前 via Android
    socks4 也可以加上,很简单。
    bagel
        9
    bagel  
       84 天前
    拆下包的事,说白了就是这道 leetcode medium: https://leetcode.cn/problems/utf-8-validation
    ysc3839
        10
    ysc3839  
       84 天前 via Android
    @body007 SSR 就支持,不过用了取巧的方法,方法是开个 Privoxy ,数据进来先尝试按 SOCKS 解析,解析失败就转发到 Privoxy ,Privoxy 会尝试按 HTTP 解析,解析成功就转换成 SOCKS 请求再发回来。
    body007
        11
    body007  
    OP
       84 天前
    @DefoliationM 不是很有需求额。我自己用的项目除了 socks5 和 http 代理,还支持 socks5 udp 代理,还支持作为 shadowsocks-rust 的 SIP003 插件(为了支持 shadowsocks-android 的安卓端),也是复用相同 tcp 端口,只是不方便开源😁
    body007
        12
    body007  
    OP
       84 天前
    @ysc3839 如果只是预读数据头部性能应该还可以,如果还处理了部分数据的话那就不太好,还得缓存已处理数据用其他协议再处理一次。
    ysc3839
        13
    ysc3839  
       84 天前
    @body007 判断 SOCKS 只需要读头部就够了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3579 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:52 · PVG 08:52 · LAX 16:52 · JFK 19:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.