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

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

  •  
  •   moxuanyuan · 193 天前 · 2478 次点击
    这是一个创建于 193 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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