Nginx 能不能通过不同的域名复用 443 port 反代 SSH 22 port ?

2021-11-09 13:37:10 +08:00
 moxuanyuan

纸面上研究了一个早上,基于不同端口应该可以,但要基于域名复用 443 port ,好似不行。。

4518 次点击
所在节点    Linux
19 条回复
geligaoli
2021-11-09 13:38:42 +08:00
可以,用 stream 模块
moxuanyuan
2021-11-09 13:39:59 +08:00
@geligaoli #1 基于域名呀?我看好似不行
chendy
2021-11-09 13:50:00 +08:00
前后协议不一样做不到吧
rrfeng
2021-11-09 13:50:27 +08:00
带 sni 的协议可以。
defunct9
2021-11-09 13:56:43 +08:00
可以
Tink
2021-11-09 14:08:05 +08:00
我也想知道,有没有教程
fetich
2021-11-09 14:11:18 +08:00
感觉用 iptables 更合适
HelloAmadeus
2021-11-09 14:15:17 +08:00
sni 了解一下
ihciah
2021-11-09 14:15:21 +08:00
SSH 又没有 sni 的,域名根本不会发出去=。=

不过换个思路,可以收集一下目标服务器的指纹然后根据这个东西分流,不过就是需要自己写代码了。
jifengg
2021-11-09 14:18:31 +08:00
之前研究过,我自己的结论是不行。代理到 ssh ,是走 tcp 协议,也就是 nginx 里的 stream 模块;域名复用走的是 http 协议,也就是 nginx 里的 http 模块。
tcp 协议里没有域名信息,没法基于域名做判断。
salmon5
2021-11-09 14:21:26 +08:00
stream 只能这样代理 https ,这是确认的,通过 SNI ;
但是 SSH 应该是不支持的
Xusually
2021-11-09 14:21:49 +08:00
salmon5
2021-11-09 14:23:50 +08:00
其实可以换个思路,直接用 jumpserver ,它跑在 https 443 ,通过这个管理不同的 SSH ,这是常规应用
defunct9
2021-11-09 14:32:18 +08:00
stream {

upstream ssh {
server 172.18.31.2:22;
}

// set up SSL session with certificate for marvel.com, www.marvel.com
upstream marvel {
server 127.0.0.1:4431;
}
server {
listen 127.0.0.1:4431 ssl;

ssl_certificate certs/marvel.pem;
ssl_certificate_key certs/marvel.key;

proxy_ssl on;
proxy_pass https_backend;
}

// set up SSL session with certificate for dccomics.com, www.dccomics.com
upstream dccomics {
server 127.0.0.1:4432;
}
server {
listen 127.0.0.1:4432 ssl;

ssl_certificate certs/dccomics.pem;
ssl_certificate_key certs/dccomics.key;

proxy_ssl on;
proxy_pass https_backend;
}

// route connection to the tunnel with correct certificate
map $ssl_preread_server_name $upstream {
default ssh;

marvel.com marvel;
www.marvel.com marvel;

dccomics.com dccomics;
www.dccomics.com dccomics;
}

upstream ssh {
server 172.18.31.2:22;
}

server {
listen 443;
ssl_preread on;
proxy_pass $upstream;
}


}
301
2021-11-09 14:34:06 +08:00
12 楼正解
ZeroClover
2021-11-09 14:43:58 +08:00
用跳板机,nginx 不可能实现一个 443 端口按需代理到多个 SSH 后端,SSH 又不是 TLS ,不会发送 SNI 。
ungrown
2021-11-09 14:47:09 +08:00
@301 #15
@Xusually #12
和楼主需求还是有区别的吧,仅仅是分流到一个 443 和一个 22 端口,并不是楼主所要的分流到不同域名、不同主机的 SSH 端口
wonderfulcxm
2021-11-09 14:51:44 +08:00
可以的,stream_ssl_preread 模块通过 SNI 请求的服务器名称选择上游
nmap
2021-11-09 15:22:13 +08:00
自己写个前端 proxy ,根据 ssh/https 的协议特征识别后转发到不同端口

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/814132

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX