Ich habe eine funktionierende Konfiguration, die ssh über TLS auf Port 443 unter Verwendung des Stream-Moduls nginx tunnelt. Ich mache auch XMPP über TLS und normales HTTP am selben Port. Ich mache das Multiplexen über ALPN.
(Sie benötigen nginx> 1.13.10, um das Modul ssl_preread mit alpn http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_module.html#ssl_preread zu verwenden. )
Meine Konfiguration verwendet die Docker-Version von nginx, sollte aber auch ohne Docker funktionieren.
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; } }
Wenn Sie das XMPP-Material verwenden möchten, müssen Sie einige SRV-Einträge hinzufügen, um auf den Port Ihrer Server zu verweisen. Siehe https://xmpp.org/extensions/xep-0368.html
Wenn Sie eine Verbindung zu Ihrem SSH-Server herstellen möchten, müssen Sie Ihre SSH-Sitzung in eine SSL-Sitzung einschließen, die die ALPN-Zeichenfolge sendet, die Sie in Ihrer Stream-Konfiguration definiert haben. Ich habe in dem obigen Beispiel "IDENTSSH" verwendet. Sie können alles verwenden, aber versuchen Sie nicht, mit den offiziell definierten Namen zu kollidieren: https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids
So starten Sie die SSH-Sitzung von Ihrem Client zu Ihrem vorbereiteten Server:
ssh you@yourserver -o "ProxyCommand openssl s_client -alpn identifyssh -ign_eof -connect yourserver:443"
Und du solltest verbunden sein.
Ich sollte auch beachten, dass ich das Proxy_Protokoll verwende, um die Header und IP-Adressen der Clients beizubehalten, während sie an meine Backends weitergeleitet werden.
Ihr normaler http-Server, der im Abschnitt http {} konfiguriert ist, sollte dies beachten:
server { listen 8443 ssl proxy_protocol; # ... }
Das Beste ist, dass Sie keine Tools wie sslh, stunnel, Proxytunnel oder andere benötigen, um dies zu erreichen. Sie benötigen nur ein neueres Nginx und OpenSSL. Hoffe das hilft jemandem. Es würde mir helfen, mich in das Zeug einzuarbeiten.