Jul 222012
 

A volte hai qualche firewall che non permette di accettare la connessione tranne alcune porte specifiche diciamo che è possibile collegarsi alla vostra VPS o server remoto solo sulle porte 80 (http) e 443 (https), ma è necessario una porta anche per ssh per gestire la VPS/server ma la porta 443 è utilizzata dal server web con il suo protocollo https, quindi cosa si può fare?

Qui è dove entra in gioco sslh è uno strumento molto semplice che prende le connessioni in ingresso ad una porta e poi a seconda del protocollo che è utilizzato reindirizza al server sshd sulla porta 22, o al tuo server web su localhost: 443.


sslh permette di accettare sia le connessioni HTTPS che SSH sulla stessa porta. Permette di connettersi a un server SSH sulla porta 443 (ad esempio dall’interno di un firewall aziendale, che quasi mai blocca la porta 443), mentre mantiene funzionante il protocollo HTTPS su quella porta.

L’idea è quella di avere sslh in ascolto all’esterno sulla porta 443, fargli accettare le connessioni in ingresso, capire che tipo di connessione è, e poi girarle al server appropriato.

Sslh è implementato in C per migliorare le prestazioni e supporta la perdita dei privilegi.

Rilevamento del protocollo

La rilevazione viene effettuata sulla base del protocollo su una piccola differenza tra SSL e SSH: un client SSL quando si connette a un server parla per primo, mentre un client SSH si aspetta che il server SSH sia quello che parla per primo (si annuncia con un banner). sslh aspetta per qualche tempo per la connessione in ingresso per inviare i dati. Se lo fa prima del timeout si verifica, si suppone sia una connessione SSL. In caso contrario, si suppone sia una connessione SSH.

Installazione

sslh è stato pacchettizzato per Debian, Ubuntu, Gentoo, FreeBSD e molti altri sistemi operativi, quindi controllate il repository della vostra distribuzione preferita prima di installarlo a mano, che è comunque possibile scaricando l’ archivio con i sorgenti

Configurazione

In Debian e Ubuntu il file di configurazione si trova in /etc/default/sslh . Qua si trovano le variabili d’ambiente caricate dallo script di avvio ( /etc/init.d/sslh ) e passate al sslh come argomenti della riga di comando, ma prima di guardare sshl dobbiamo configurare i nostri 2 server di back-end:

Configurazione SSH

Non c’e’ bisogno di fare alcuna configurazione speciale su ssh, è possibile configurare il server SSH in modo che sia in ascolto sulla porta SSH normale (22).

Configurare il server-HTTPS

Ora configurare il server-HTTPS (Apache?) in modo che sia in ascolto per le connessioni HTTPS/SSL su una porta non utilizzata. In questo esempio userò la 8080 che è riservata per il traffico alternativo HTTP, ma questa è una scelta arbitraria. O come alternativa potete fare in modo che il server web sia in ascolto solo localhost (non sull’indirizzo IP pubblico).

Configurazione di SSLH

Ora è il momento di modificare il file /etc/default/sslh, questo è un file di configurazione preso da Ubuntu.

Modificate:

RUN=yes #Tell that the daemon must be started
DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:8080"

Questa è una spiegazione delle opzioni:

-user sslh Richiede l’esecuzione con questo nome utente specifico.
-p 0.0.0.0:443 Indirizzo su cui ascolta – SSLH ascolta su porta 443 su tutte le interfaccie disponibili.
-s 127.0.0.1:22 Indirizzo per SSH – Gira il traffico SSH alla porta 22 su localhost.
-l 127.0.0.1:8080 Indirizzo per SSL – Gira il traffico HTTPS/SSL alla porta 8080 su localhost

Ora è possibile riavviare i 3 demoni e raggiungere dalla porta 443 entrambi i server di back-end.

Conclusioni

Questa è una soluzione facile per un problema comune, ed ancora una volta con il nostro fidato Pinguino possiamo avere una valida soluzione in meno di 10 minuti.

Popular Posts:

Flattr this!

  2 Responses to “sslh – un multiplexer ssl/ssh per Linux”

  1. Very awesome. Thankfully I only have to deal with port 80 being blocked – but wow – this is getting bookmarked. Been in many spots this would have been great to have.

  2. Great stuff,
    I have an https web server behind this and it workd great except that the remote-ip header info gets changed by sslh to 127.0.0.1
    the solution (as far as i can tell) is to use the –transparent option in DAEMON_OPTS
    Plus some further changes to iptables.
    If anyone actually figures it out I’d like to know!

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

*