Golang Go语言中一个TCP端口同时处理socks5和http代理请求,客户端不用记两个端口了

发布于 1周前 作者 ionicwang 来自 Go语言

代码片段: 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 方法中添加连接二级代理服务器的代码。


Golang Go语言中一个TCP端口同时处理socks5和http代理请求,客户端不用记两个端口了

更多关于Golang Go语言中一个TCP端口同时处理socks5和http代理请求,客户端不用记两个端口了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

14 回复

嗯,这种处理基本是现在的代理标配了,比如 clash: https://github.com/wangtz0607/clash/blob/main/listener/mixed/mixed.go

更多关于Golang Go语言中一个TCP端口同时处理socks5和http代理请求,客户端不用记两个端口了的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html





看来盯着 shadowsocks 的我落后了,学习了。

nowtunnel 中的代理功能也是这么做的
- 一款不一样的组网、代理工具 https://www.nowtunnel.com

请问这种是标准的 http socks 么?这种混合端口如果同时有数据过来,clash 有时候不识别。

这是标准的啊,上面用 curl 命令测试都可以的。代理工具都是我自己写的,没有用过 clash ,不清楚情况。不过看 #1 楼的回复 clash 是支持的。不过记得 http 代理有 2 种模式,可以看代码和 curl 测试命令去理解额。

实现原理就是 net.Conn 的包装,先读几个字节匹配协议,然后丢给协议的 listener

socks4 也可以加上,很简单。

拆下包的事,说白了就是这道 leetcode medium: https://leetcode.cn/problems/utf-8-validation

SSR 就支持,不过用了取巧的方法,方法是开个 Privoxy ,数据进来先尝试按 SOCKS 解析,解析失败就转发到 Privoxy ,Privoxy 会尝试按 HTTP 解析,解析成功就转换成 SOCKS 请求再发回来。

不是很有需求额。我自己用的项目除了 socks5 和 http 代理,还支持 socks5 udp 代理,还支持作为 shadowsocks-rust 的 SIP003 插件(为了支持 shadowsocks-android 的安卓端),也是复用相同 tcp 端口,只是不方便开源😁

如果只是预读数据头部性能应该还可以,如果还处理了部分数据的话那就不太好,还得缓存已处理数据用其他协议再处理一次。

判断 SOCKS 只需要读头部就够了

在Golang中实现一个TCP端口同时处理SOCKS5和HTTP代理请求,可以通过多路复用技术来实现。这种设计通常依赖于协议检测机制来区分进入的流量类型,从而采取相应的处理逻辑。以下是一个简要的实现思路:

  1. 监听单一端口:使用net.Listen在指定的端口上创建一个TCP监听器。

  2. 协议检测:在接受连接后,通过读取初始几个字节的数据来判断是SOCKS5还是HTTP协议。SOCKS5协议通常以特定的握手消息开始,而HTTP请求通常以GETPOST等HTTP方法开头。

  3. 分支处理

    • 如果检测到是SOCKS5协议,则启动SOCKS5代理处理逻辑。
    • 如果检测到是HTTP协议,则启动HTTP代理处理逻辑。
  4. 错误处理:如果无法确定协议类型,可以关闭连接或返回错误消息。

  5. 并发处理:使用Goroutines来并发处理多个连接,确保系统的高性能和响应速度。

实现这种功能需要对网络协议有深入的理解,并可能需要处理一些边缘情况,比如协议混淆攻击等。在实际开发中,可以使用现有的代理库(如goproxygorilla/mux等)来简化HTTP代理部分的实现,而SOCKS5的实现可能需要更深入地定制。

请注意,这种设计虽然简化了客户端配置,但增加了服务器端的复杂性和潜在的安全风险。因此,在实现时需要仔细考虑和充分测试。

回到顶部