V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
moxuanyuan
V2EX  ›  Linux

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

  •  
  •   moxuanyuan · 2021-11-09 13:37:10 +08:00 · 4449 次点击
    这是一个创建于 1105 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    不过换个思路,可以收集一下目标服务器的指纹然后根据这个东西分流,不过就是需要自己写代码了。
    jifengg
        10
    jifengg  
       2021-11-09 14:18:31 +08:00
    之前研究过,我自己的结论是不行。代理到 ssh ,是走 tcp 协议,也就是 nginx 里的 stream 模块;域名复用走的是 http 协议,也就是 nginx 里的 http 模块。
    tcp 协议里没有域名信息,没法基于域名做判断。
    salmon5
        11
    salmon5  
       2021-11-09 14:21:26 +08:00
    stream 只能这样代理 https ,这是确认的,通过 SNI ;
    但是 SSH 应该是不支持的
    salmon5
        13
    salmon5  
       2021-11-09 14:23:50 +08:00
    其实可以换个思路,直接用 jumpserver ,它跑在 https 443 ,通过这个管理不同的 SSH ,这是常规应用
    defunct9
        14
    defunct9  
       2021-11-09 14:32:18 +08:00   ❤️ 1
    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
        15
    301  
       2021-11-09 14:34:06 +08:00
    12 楼正解
    ZeroClover
        16
    ZeroClover  
       2021-11-09 14:43:58 +08:00
    用跳板机,nginx 不可能实现一个 443 端口按需代理到多个 SSH 后端,SSH 又不是 TLS ,不会发送 SNI 。
    ungrown
        17
    ungrown  
       2021-11-09 14:47:09 +08:00
    @301 #15
    @Xusually #12
    和楼主需求还是有区别的吧,仅仅是分流到一个 443 和一个 22 端口,并不是楼主所要的分流到不同域名、不同主机的 SSH 端口
    wonderfulcxm
        18
    wonderfulcxm  
       2021-11-09 14:51:44 +08:00 via iPhone
    可以的,stream_ssl_preread 模块通过 SNI 请求的服务器名称选择上游
    nmap
        19
    nmap  
       2021-11-09 15:22:13 +08:00
    自己写个前端 proxy ,根据 ssh/https 的协议特征识别后转发到不同端口
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1181 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 72ms · UTC 18:32 · PVG 02:32 · LAX 10:32 · JFK 13:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.