如何配置NGINX作为不同端口号的反向代理?


15
I have NGINX configured like this as a reverse proxy for http requests:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}

我还想代理ssh(端口22)请求。我可以将另一个服务器块添加到同一配置文件中吗:

server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

这样最终结果是这样的:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}
server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

TIA,
奥莱


2
nginx充当http代理。如果将其设置为反向代理端口22,则将不允许您传递SSH流量-仅将http流量传递到SSH服务器,这显然会失败。
garethTheRed

去看看HAProxy

Answers:


13

所述SSH协议不是基于HTTP,并且,因此,无法通过常规的代理proxy_passngx_http_proxy_module

但是,最近,nginxnginx 1.9.0(于2016-04-26稳定发布为1.10.0)开始,确实获得了对进行TCP流代理的支持,这意味着,如果您的nginx版本足够近,您实际上可以使用它来代理ssh连接(但是,请注意,您将无法X-Real-IP在代理连接中添加,例如,因为它不是基于HTTP的)。

有关更多信息和示例,请查看:


8

由于Nginx版本1.9.0,NGINX支持ngx_stream_core_module模块,因此应使用--with-stream启用它。启用流模块时,可以使用SSH协议TCP代理

stream {
    upstream ssh {
        server 192.168.1.12:22;
    }
        server {
        listen        12345;
        proxy_pass    ssh;

    }

}

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/


这是nginx的所有不错的功能-但是恕我直言,当您想要像nginx这样的真正反向代理时,它毫无用处,可以很好地完成HTTP。问题是流方法是简单的NAT-因此,我宁愿在边缘路由器上执行该任务。我想要/希望在这里拥有的功能与HTTP反向代理完全相同。换句话说,我只有一个公共IP地址-因此端口22仅适用于一台机器-但是如果有一种方法可以区分某种形式的请求ssh me@srv1.my.net,则ssh me@srv2.my.net-很好。它的协议限制(SSH不会提供客户端使用的DNS名称)
stamster

@stamster,您已经可以通过使用不同的端口号(例如,用于122的srv1222和用于222的srv2)或使用嵌套的ssh会话(您首先通过ssh进入公共服务器/ IP,然后从那里开始)执行几乎相同的操作,倒入树叶;例如ssh user@example.org 'ssh user@192.168.5.1'
cnst

1
不,要求/想法是使用默认端口(22或任何其他服务..)作为目标端口,然后根据DNS名称左右路由流量。就像我们都使用nginx作为反向Web http代理服务器一样,因此每个域都针对默认端口80、443,然后nginx根据代理规则路由流量。当然,客户端具有HOST标头,因此很容易区分它针对的目标...嵌套的SSH会话是一种解决方案,但是却很麻烦-可以工作。我最终在边缘网络上使用了不同的端口-最好的老式NAT作为最KISS和最可靠的解决方案。
演讲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.