如何通过Nginx代理RDP

9

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

  server { 
    listen          80;
    server_name     domain.com;

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

但是连接无法通过。我猜问题出在 proxy_pass 中的 http。通过谷歌搜索 "Nginx RDP" 没有什么结果。

有人知道是否可能,并且如果可以,应该如何操作吗?

3个回答

13

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

在你的 nginx.conf 文件中,你有类似于以下内容:

http {  
    ...
    ...
    ...

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

所有在配置文件中编写的内容都在 http 块/作用域内。但是,rdp 不是 http,它是一种不同的协议。

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

因此,在您的 nginx.conf 文件中,在 http 块之外,您必须像这样声明 stream 块:

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

使用上述配置只能在tcp层面代理您的后端,但代价显然。 您可能会注意到缺少 server_name 属性,因此无法在 stream 范围内使用它,并且失去了所有在 http 级别上提供的日志记录功能。

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


感谢你的回答。我读到 RDP 现在可以与 HTTPS 结合使用。这给我的印象是,我们可以将它用作 SSL 连接,在“http”块内使用。但由于我对这个问题的知识有限,我无法看出这有可能是如何实现的。你有什么想法? - fardin
以下是在下面的文章中让我这样想的那句话:“本质上,标准RPC流量在客户端被包装在HTTPS中”:http://www.brianmadden.com/opinion/Its-Official-Microsoft-is-Adding-an-RDP-over-HTTPS-Proxy-to-Windows - fardin
1
好的,你引用的那行代码是指一个应用程序(Outlook),它将RPC封装在HTTPS中,另一边有另一个软件可以处理未打包的消息。微软开发了软件,可以在https流量上打包和解包RDP,当然nginx不能做到这一点。你需要一个不同的实现来处理这个问题,你不能直接传递到3389端口,你需要一个RD网关,可以查看这个链接:https://turbofuture.com/computers/How-to-Remote-Desktop-to-a-Terminal-Server-via-a-Web-Proxy - zochamx
1
说句实话,如果你改变端口,这个语法对于VNC也是适用的。 - davidk
这对我有用。谢谢。 - Sohel Aman

0

对于任何想要使用Nginx进行RDP连接负载均衡的人,这是我所做的:

像平常一样配置nginx,将HTTP(S)流量重定向到所需的服务器。

在该服务器上安装myrtille(它需要IIS和.Net 4.5),您就可以从浏览器远程桌面连接到您的服务器了!


0
如果你正在寻找一个完整且不包含一堆点点的配置,这些点点在nginx配置测试中永远无法通过,下面是一个完整且经过测试的配置。
这个例子监听端口25301,并将连接转发到rds.example.com:25301。然后在你的无线路由器中,你必须将端口25301的传入连接转发到目标Windows PC的IP地址和端口3389。
端口转发 - 路由器设置
服务名称 外部端口 内部端口 内部IP地址 协议 SERVER9_RDP 25301 3389 10.0.0.9 BOTH
NGINX - RDP配置
stream {
    tcp_nodelay            on;
    resolver               1.1.1.1 1.0.0.1 valid=60s;
    resolver_timeout       5s;

    server {
        listen 25301;
        # proxy_pass 192.168.0.1:25301;
        proxy_pass rds.example.com:25301;

        proxy_connect_timeout 10s;
        proxy_timeout 2h;
        # Preserve client IP address
        proxy_bind $remote_addr transparent;

        allow 192.168.1.0/24;  # Example for allowing specific IPs
        deny all;

        # Logging
        access_log             off;
        error_log              /var/log/nginx/error.log warn;
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接