纸面上研究了一个早上,基于不同端口应该可以,但要基于域名复用 443 port ,好似不行。。
![]() | 1 geligaoli 2021-11-09 13:38:42 +08:00 可以,用 stream 模块 |
![]() | 2 moxuanyuan OP @geligaoli #1 基于域名呀?我看好似不行 |
![]() | 3 chendy 2021-11-09 13:50:00 +08:00 前后协议不一样做不到吧 |
![]() | 4 rrfeng 2021-11-09 13:50:27 +08:00 via Android 带 sni 的协议可以。 |
![]() | 5 defunct9 2021-11-09 13:56:43 +08:00 可以 |
![]() | 6 Tink PRO 我也想知道,有没有教程 |
![]() | 7 fetich 2021-11-09 14:11:18 +08:00 感觉用 iptables 更合适 |
![]() | 8 HelloAmadeus 2021-11-09 14:15:17 +08:00 via iPhone sni 了解一下 |
![]() | 9 ihciah 2021-11-09 14:15:21 +08:00 SSH 又没有 sni 的,域名根本不会发出去=。= 不过换个思路,可以收集一下目标服务器的指纹然后根据这个东西分流,不过就是需要自己写代码了。 |
10 jifengg 2021-11-09 14:18:31 +08:00 之前研究过,我自己的结论是不行。代理到 ssh ,是走 tcp 协议,也就是 nginx 里的 stream 模块;域名复用走的是 http 协议,也就是 nginx 里的 http 模块。 tcp 协议里没有域名信息,没法基于域名做判断。 |
11 salmon5 2021-11-09 14:21:26 +08:00 stream 只能这样代理 https ,这是确认的,通过 SNI ; 但是 SSH 应该是不支持的 |
![]() | 12 Xusually 2021-11-09 14:21:49 +08:00 ![]() |
13 salmon5 2021-11-09 14:23:50 +08:00 其实可以换个思路,直接用 jumpserver ,它跑在 https 443 ,通过这个管理不同的 SSH ,这是常规应用 |
![]() | 14 defunct9 ![]() 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; } } |
15 301 2021-11-09 14:34:06 +08:00 12 楼正解 |
16 ZeroClover 2021-11-09 14:43:58 +08:00 用跳板机,nginx 不可能实现一个 443 端口按需代理到多个 SSH 后端,SSH 又不是 TLS ,不会发送 SNI 。 |
17 ungrown 2021-11-09 14:47:09 +08:00 |
![]() | 18 wonderfulcxm 2021-11-09 14:51:44 +08:00 via iPhone 可以的,stream_ssl_preread 模块通过 SNI 请求的服务器名称选择上游 |
![]() | 19 nmap 2021-11-09 15:22:13 +08:00 自己写个前端 proxy ,根据 ssh/https 的协议特征识别后转发到不同端口 |