我有一些问题需要了解通过公用服务器将客户端公开到NAT之后的理论,例如,将客户端用作代理(最好是SOCKS5)。
我想使用Go解决此问题,并且那里有一些很棒的Go库可供SOCKS5使用,所以这没有问题。
如果NAT后面的客户端连接到 public 服务器,其他用户如何连接(也许在其他端口上),我该如何转发请求?
例如如果A( public 服务器)在端口5544上侦听,并且C(NAT后面的客户端连接到它,而C也有本地SOCKS5服务器将请求转发至该端口),用户(甚至多个用户)如何转发向C请求(在A:5544上进行的第一个连接)
[U-> A:5544 C C local socks5服务器]
用户连接到A,C连接到A,流量转发到C(请注意,C不监听传入连接,原因是C连接到A而不是反向,因为C在NAT后面)
我希望你明白我的意思。
先感谢您!
编辑:
指出我的意思。
C-NAT后面的客户端不直接侦听TCP,它只是打开与 public 服务器的TCP连接(net.Dial()...),此连接公开了客户端-C上的socks5代理没有直接暴露,因此拨打的TCP连接soulde的行为类似于TCP侦听器。
我认为基本上,这是teamviewer使用的相同技术。
但是到底如何呢?同样重要的是,多个用户可以通过“A”连接到客户端“C”。
另外:baloo的答案使我更进一步,但现在的问题是,如果来自客户端远程服务器连接的答案/流量通过以下方式复制(在 public 服务器端代码上)
_, err := io.Copy(usrConn, s.ProxyClient)
数据得到流式传输/隧道化,但是如果我通过代理请求一个站点,则该站点正在加载和加载,这还会导致其他“用户”连接被阻止的问题。 (到目前为止,我收到第一个请求的站点响应,但是整个站点的请求仍在等待处理中……我可能对SOCKS5协议有误解?)
这是 public 服务器的凌乱原型代码:http://pastebin.com/7Y2JBVE0
这是客户端(反向代理)的代码:http://pastebin.com/w3i9cap4
最佳答案
您可以使用httputil.ReverseProxy
将用户重定向到本地服务器:
另请参阅:http://blog.charmes.net/2015/07/reverse-proxy-in-go.html
测试样例代码:
package main
import (
"net/http"
"net/http/httputil"
"net/url"
)
func handler(handler http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
r.Host = r.URL.Host
handler.ServeHTTP(w, r)
})
}
func main() {
u, _ := url.Parse("https://translate.google.com")
reverseProxy := httputil.NewSingleHostReverseProxy(u)
http.ListenAndServe(":3000", handler(reverseProxy))
}