Distributions
› Ubuntu
› Fedora
› CentOS
中文资源站
› 网易开源镜像站
moxuanyuan
V2EX  ›  Linux

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

  •  
  •   moxuanyuan · Nov 9, 2021 · 5933 views
    This topic created in 1821 days ago, the information mentioned may be changed or developed.

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

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

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