我有一些问题需要了解通过公用服务器将客户端公开到NAT之后的理论,例如,将客户端用作代理(最好是SOCKS5)。
我想使用Go解决此问题,并且那里有一些很棒的Go库可供SOCKS5使用,所以这没有问题。

如果NAT后面的客户端连接到 public 服务器,其他用户如何连接(也许在其他端口上),我该如何转发请求?

  • “C”是NAT
  • 之后的(单个)客户端
  • “A”是我要用来公开客户端
  • 的 public 服务器
  • “U”是一个(或多个)用户,希望通过A
  • 连接到C

    例如如果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))
    }
    

    10-07 19:03
    查看更多