У меня есть рабочая конфигурация туннелирования ssh через tls на порт 443, используя модуль потока nginx. Я также делаю XMPP через TLS и обычный HTTP на том же порту. Я делаю мутплексирование через ALPN.
(Вам нужно nginx> 1.13.10, чтобы использовать модуль ssl_preread с alpn http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html#ssl_preread )
Моя конфигурация использует версию докера nginx, но она также должна работать без докера.
stream { # check ALPN for xmpp client or server and redirect to local ssl termination endpoints map $ssl_preread_alpn_protocols $ssl_multiplexer { "xmpp-client" 127.0.0.1:5422; "xmpp-server" 127.0.0.1:5469; "identifyssh" 127.0.0.1:8822; default 127.0.0.1:8443; } server { listen 443; ssl_preread on; proxy_pass $ssl_multiplexer; proxy_protocol on; set_real_ip_from 172.18.0.0/32; } # ssl termination for c2s connections server { listen 5422 ssl proxy_protocol; # ... <- tls keys and options here proxy_ssl off; proxy_pass ejabberd:5222; } # ssl termination for s2s connections server { listen 5469 ssl proxy_protocol; # ... <- tls keys and options here proxy_ssl off; proxy_pass ejabberd:5269; } # ssl termination for ssh connections server { listen 8822 ssl proxy_protocol; # ... <- tls keys and options here proxy_ssl off; proxy_pass yourserver:22; } }
Если вы хотите использовать XMPP, вам нужно добавить некоторые записи SRV для указания на порт 443 вашего сервера, см. Https://xmpp.org/extensions/xep-0368.html.
Если вы хотите подключиться к вашему ssh-серверу, вы должны обернуть ваш ssh-сеанс в ssl-сеанс, который отправляет строку ALPN, определенную вами в конфигурации потока. Я использовал «identifssh» в примере выше. Вы можете использовать что угодно, но стараться не вступать в конфликт с официальными именами: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids
Чтобы запустить сессию ssh с вашего клиента на ваш подготовленный сервер, используйте:
ssh you@yourserver -o "ProxyCommand openssl s_client -alpn identifyssh -ign_eof -connect yourserver:443"
И вы должны быть на связи.
Следует также отметить, что я использую proxy_protocol, чтобы сохранить заголовки клиентов и IP-адрес при передаче их бэкэндам.
Ваш обычный http-сервер, настроенный в разделе http {}, должен позаботиться об этом:
server { listen 8443 ssl proxy_protocol; # ... }
Лучше всего то, что вам не нужны такие инструменты, как sslh, stunnel, proxytunnel или другие, чтобы сделать эту работу. Вам нужен только новый nginx и openssl. Надеюсь, это кому-нибудь поможет. Это помогло бы мне разобраться в этом.