一、 http代理与tcp代理的区别
- tcp代理才能支持的socks5代理,可以支持tcp四层以上协议的代理。
- tcp代理可以同时支持http和socks5代理。
二、go。http代理一些思考。
正向代理:需要客户端来配置,一般来说我们会通过浏览器或者操作系统提供的工具或者界面来配置。这个时候,代理对客户端不是透明的,客户端需要知道代理的地址并且手动配置。配置了代理,浏览器在发送请求的时候会对报文做特殊的修改。
反向代理:对客户端是透明的,也就是说客户端一般不知道代理的存在,认为自己是直接和服务器通信。我们大部分访问的网站就是反向代理服务器,反向代理服务器会转发到真正的服务器,一般在反向代理这一层实现负载均衡和高可用的功能。而且这里也可以看到,客户端是不会知道真正服务器端的 ip 地址和端口的,这在一定程度上起到了安全保护的作用。
隧道代理:可以用一句话来总结:代理服务器和真正的服务器之间建立起 TCP 连接,然后在客户端和真正服务器端进行数据的直接转发。
- 反向代理:
- saas目前的代理形式
- 可支持http和https,可随意更改报文内容
- 正向代理,
- 一般只能支持http代理,因为 虽然代理可以和真正的服务器建立连接,但是代理无法代表服务器和客户端建立连接,因为代理服务器无法知道真正服务器的私钥。 真正https的代理则需要伪装中间人代理,参考Charles和Fiddler。本文不考虑。
- 隧道代理。
- 客户端先发送 CONNECT 请求到隧道代理服务器,告诉它建立和服务器的 TCP 连接(因为是 TCP 连接,只需要 ip 和端口就行,不需要关注上层的协议类型)
- 代理服务器成功和后端服务器建立 TCP 连接
- 代理服务器返回
HTTP 200 Connection Established
报文,告诉客户端连接已经成功建立 - 报文交换
- 参考:云枢的代理模式就是反向代理+正向隧道代理。(基于nginx实现,不同端口)
- 实践:go-saas网关同时支持反向代理+隧道代理,且同一端口实现。(基于go实现)
易错点:
0、http的connect方法不同于get post,它没有路径,因此通过以下方式不可行:
http.Handle("/", TunnelProxyHandler)
http.HandleFunc("/reverse", ReverseProxyHandler)
http.ListenAndServe(srv.gwConfig.Listen, nil)
1、默认的 ServeMux 不支持 CONNECT 方法的请求,请直接使用自己编写的 Proxy 作为 Mux。
2、不区分HTTP Method
http.HandleFunc("/", print_hello)
http.ListenAndServe(address, nil)
3、go的http包的使用,有很多精巧的实现,值得学习
命令:
curl http://www.baidu.com -x "https://ysuhankan.top:11443"
curl https://ysuhankan.top:11443/aaa
参考:
https://pkg.go.dev/net/http //go官方http包
https://www.infoq.cn/article/vibfhhmpf7hmnnw4fhrx //go简单http2
https://cizixs.com/2017/03/22/http-tunnel-proxy-and-golang-implementation/ //http隧道代理
https://cizixs.com/2017/03/21/http-proxy-and-golang-implementation/ //http代理
https://github.com/cizixs/pxy/blob/master/pxy.go //http代理源码参考
...