如何通过 Nginx 代理 RDP

How to proxy RDP via Nginx

我在 nginx 中使用以下配置来代理 RDP 连接:

  server { 
    listen          80;
    server_name     domain.com;

    location / {
      proxy_pass      http://192.168.0.100:3389;
    }
  }

但是连接不通。我的猜测是问题出在 proxy_pass 中的 http。谷歌搜索 "Nginx RDP" 收效甚微。

有人知道这是否可行吗?如果可行,怎么做?

其实你是对的 http 是问题所在,但不完全是你代码块中的那个问题。让我们解释一下:

在您的 nginx.conf 文件中,您有类似的内容:

http {  
    ...
    ...
    ...

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

因此,您在 conf 文件中写入的所有内容都在这个 http block/scope 中。但是 rdp 不是 http 是不同的协议。

我知道 nginx 处理此问题的唯一解决方法是在 tcp 级别上工作。

因此,在 nginx.conf 块内部和 http 块外部,您必须像这样声明 stream 块:

stream {
    # ...
    server {
        listen     80;
        proxy_pass 192.168.0.100:3389;
    }
}

使用上面的配置只是在 tcp 层上代理你的后端,当然是有代价的。您可能会注意到它缺少 server_name 属性,您不能在 stream 范围内使用它,而且您会失去 http 级别的所有日志记录功能。

有关此主题的更多信息,请查看 docs

对于希望使用 Nginx 负载平衡 RDP 连接的任何人,这是我所做的:

像往常一样配置 nginx,将 HTTP(S) 流量重新路由到您想要的服务器。

在该服务器上,安装 myrtille(它需要 IIS 和 .Net 4.5),您将能够从浏览器将 RDP 连接到您的服务器!