Eu tenho uma configuração de trabalho tunelamento ssh sobre tls na porta 443, usando o módulo de fluxo nginx.
Eu também faço XMPP por TLS e HTTP normal na mesma porta.
Eu faço o mutliplexing via ALPN.
(Você precisa do nginx > 1.13.10 para usar o módulo ssl_preread com o alpn
link )
Minha configuração usa a versão docker do nginx, mas também deve funcionar sem o docker.
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;
}
}
Se você quiser usar o material XMPP, adicione alguns registros SRV para apontar para a porta 443 de seus servidores, consulte o link
Se você deseja se conectar ao seu servidor ssh, é necessário agrupar sua sessão ssh em uma sessão ssl que envia a cadeia ALPN que você definiu em sua configuração de fluxo. Eu usei "identifshsh" no exemplo acima. Você pode usar qualquer coisa, mas tente não colidir com os nomes oficiais definidos:
link
Para iniciar a sessão ssh do seu cliente para o servidor preparado, use:
ssh you@yourserver -o "ProxyCommand openssl s_client -alpn identifyssh -ign_eof -connect yourserver:443"
E você deve estar conectado.
Também devo observar que uso o proxy_protocol para manter os cabeçalhos dos clientes e o endereço IP ao passar para os meus back-ends.
Seu servidor http normal configurado na seção http {} deve cuidar disso:
server {
listen 8443 ssl proxy_protocol;
# ...
}
O melhor é que você não precisa de ferramentas como sslh, stunnel, proxytunnel ou outras para fazer isso funcionar. Você só precisa de um novo nginx e openssl.
Espero que isso ajude alguém. Isso me ajudaria a cavar essas coisas.