Como @AlexeyTen mencionou em seu comentário, sslh
é a ferramenta certa para essa finalidade. Ele tem suporte embutido para protocolos HTTP, SSL, SSH, OpenVPN, tinc e XMPP e também suporta testes de regex personalizados.
Por exemplo, para fazer sslh
encaminhar solicitações http para nginx e solicitações não http para ejabberd, é suficiente substituir em todos os hosts virtuais do nginx
listen 80;
com
listen 127.0.0.1:88;
( também é possível usar listen 127.0.0.1:80
if sslh
com escutar a porta 80 somente em ip específico, ou usar por exemplo listen 88
), em seguida, instalar sslh
e editar seu opções padrão:
RUN=yes
DAEMON_OPTS="--numeric --user sslh --listen 0.0.0.0:80 --http 127.0.0.1:88 --xmpp 127.0.0.1:5222 --pidfile /var/run/sslh/sslh.pid"
( /etc/default/sslh
no debian). E, finalmente, apenas (re) inicie os serviços:
systemctl restart nginx
systemctl start sslh
Se a opção --transparent
para sslh
for necessária, haverá algumas etapas adicionais - elas são bem documentadas no github .