Golang Go语言中一个TCP端口同时处理socks5和http代理请求,客户端不用记两个端口了
代码片段: 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
嗯,这种处理基本是现在的代理标配了,比如 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
我最早是在 的代码里看见的,现在已经是标配了
- /t/375186
- https://github.com/nadoo/glider/blob/668d5bc47038453e7798a6d840f6081058991a3f/mixed.go
看来盯着 shadowsocks 的我落后了,学习了。
nowtunnel 中的代理功能也是这么做的
- 一款不一样的组网、代理工具 https://www.nowtunnel.com
这是标准的啊,上面用 curl 命令测试都可以的。代理工具都是我自己写的,没有用过 clash ,不清楚情况。不过看 #1 楼的回复 clash 是支持的。不过记得 http 代理有 2 种模式,可以看代码和 curl 测试命令去理解额。
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代理请求,可以通过多路复用技术来实现。这种设计通常依赖于协议检测机制来区分进入的流量类型,从而采取相应的处理逻辑。以下是一个简要的实现思路:
-
监听单一端口:使用
net.Listen
在指定的端口上创建一个TCP监听器。 -
协议检测:在接受连接后,通过读取初始几个字节的数据来判断是SOCKS5还是HTTP协议。SOCKS5协议通常以特定的握手消息开始,而HTTP请求通常以
GET
、POST
等HTTP方法开头。 -
分支处理:
- 如果检测到是SOCKS5协议,则启动SOCKS5代理处理逻辑。
- 如果检测到是HTTP协议,则启动HTTP代理处理逻辑。
-
错误处理:如果无法确定协议类型,可以关闭连接或返回错误消息。
-
并发处理:使用Goroutines来并发处理多个连接,确保系统的高性能和响应速度。
实现这种功能需要对网络协议有深入的理解,并可能需要处理一些边缘情况,比如协议混淆攻击等。在实际开发中,可以使用现有的代理库(如goproxy
、gorilla/mux
等)来简化HTTP代理部分的实现,而SOCKS5的实现可能需要更深入地定制。
请注意,这种设计虽然简化了客户端配置,但增加了服务器端的复杂性和潜在的安全风险。因此,在实现时需要仔细考虑和充分测试。