OpenVPN - Aggirare il firewall aziendale

Transcript

OpenVPN - Aggirare il firewall aziendale
OpenVPN through Proxy
ovvero come aggirare il firewall aziendale
“Il bisogno fa trottare la vecchia.”I Proverbio
0 - Premessa
Quest'opera è stata scritta da Michele <o-zone(at)zerozone.it> Pinassi basandosi sulla sua unica esperienza.
L'autore non si assume alcuna responsabilità in merito ad eventuali danni, problemi, licenziamenti, perdita
di dati ed altro. Il presente documento non ha scopo di incoraggiare la violazione delle regole aziendali e/o
azioni non permesse dal contratto di lavoro.
Questo documento è rilasciato sotto licenza Creative Commons per scopi non
commerciali (http://creativecommons.org/licenses/by-nc-sa/2.5/)
1 – Lo scenario
In questo documento teniamo in considerazione una infrastruttura di rete così:
Configurazione tipica di qualsiasi ufficio: ci sono n pc in intranet con IP privati (10.0.0.x), un firewall/router
che gestisce il masquerading con un proxy WEB sulla porta 8080.
In questo documento è fondamentale che il nostro utente:
– abbia accesso root al server remoto
– conosca le nozioni fondamentali delle reti TCP/IP
– abbia familiarità con l'installazione delle applicazioni
2 – La necessità
Supponiamo che un utente X debba connettersi con protocollo SSH (od altro protocollo non HTTP) sul server
OpenVPN through Proxy, ovvero come aggirare il firewall aziendale
Creative Common license (http://creativecommons.org/licenses/by-nc-sa/2.5/)
IP_SERVER ed il firewall blocchi le connessioni su tutte le porte ad esclusione dell'HTTP che viene gestita
attraverso il proxy sulla porta 8080. Oltretutto il grande fratello aziendale spia tutte le nostre mosse grazie ai
log che il solerte demone proxy lascia sul server !
Un pò di privacy, che diamine !
3 – Il PROXY
Il PROXY non è una bestiaccia cattiva ma una bestiolina ubbidiente che, si spera, fa bene il suo lavoro.
E' composto da un demone in ascolto su una porta TCP (in genere 8080 ma anche 3126 o altre) che accetta dei
comandi ed agisce di conseguenza. In particolar modo, accetta dal Ns browser un comando tipo:
CONNECT www.google.it:80 HTTP/1.1
ed il proxy lo interpreta come una richiesta di connessione alla posta 80 di www.google.it con protocollo HTTP
v 1.1. Percui alla fine avremo il Ns browser connesso con il proxy ed il proxy connesso con www.google.it.
Il proxy è un ponte tra il nostro browser ed il server web remoto, e permette all'amministratore di rete alcune
interessanti opzioni, tra cui:
– blocco dei siti non desiderati
– registrazione di tutte le attività sul web
– caching delle pagine web
– controllo sul traffico ed eventuali blocchi in caso di “sforamento”
– controllo antivirus dei contenuti web direttamente sul proxy
Tutto questo è OK per il normale utente che consulta la rete ma se voglio qualcosa di più e l'amministratore
di rete non ne vuole sentir parlare ?
4 – OpenVPN !
Ed eccoci arrivati allo scopo di questo documento: utilizzare OpenVPN per aggirare l'ostacolo ! La particolare
caratteristica di OpenVPN è di poter effettuare connessioni attraverso un proxy web. Come ? Bè...sfruttando
una caratteristica del proxy ! Infatti, come avrete notato, oltre all'indirizzo di destinazione possiamo indicare
al proxy su quale porta effettuare la connessione. Ovviamente un amministratore di sistema furbo sà che non
deve concedere l'utilizzo di porte differenti dalla 80 (HTTP) e 443 (HTTPS). In questo documento siamo nel
caso in cui l'amministratore è stato furbo :-)
4.1) Innanzitutto controlliamo che il Ns kernel abbia il supporto per il tunneling. In genere è un modulo che si
chiama “tun” e possiamo verificarne la presenza con questo comando (da shell):
lsmod | grep tun
che dovrebbe restituire qualcosa come:
tun
7680 1
Se tutto ok, saltiamo direttamente al punto 4.4 per continuare.
4.2) Se non restituisse nulla i casi sono tre: o il modulo non è caricato oppure non esiste oppure, ancora, è
compilato all'interno del kernel.
Togliamoci il dubbio della presenza del modulo con questo comando:
modprobe tun
OpenVPN through Proxy, ovvero come aggirare il firewall aziendale
Creative Common license (http://creativecommons.org/licenses/by-nc-sa/2.5/)
e poi torniamo al punto 4.1.
4.3) Se dovesse restituire un errore, se ne siamo capaci, andiamo ad attivare il modulo nel kernel e
compiliamolo nuovamente (solamente se ne siete realmente capaci !). Il modulo si trova, perlomeno nelle
versioni 2.6.x, sotto:
Device Drivers -> Network device support - > Universal TUN/TAP device driver support
l'help riporta:
TUN/TAP provides packet reception and transmission for user space programs. It can be viewed as a simple Point-toPoint or Ethernet device, which instead of receiving packets from a physical media, receives them from user space
program and instead of sending packets via physical media writes them to the user space program. When a program
opens /dev/net/tun, driver creates and registers corresponding net device tunX or tapX. After a program closed above
devices, driver will automatically delete tunXX or tapXX device and
all routes
corresponding
to
it.
Please
read
<file:Documentation/networking/tuntap.txt>
for
more
information. To compile this driver as a module, choose M here: the module will be called tun.
4.4) Installiamo OpenVPN su entrambe le nostre macchine: il server remoto ed il ns client. OpenVPN è
disponibile sia per macchine *NIX che per Windows, anche se nel Ns documento consideriamo solamente le
prime.
Lo scopo di questo documento NON E' INSEGNARVI ad installare le applicazioni. Leggetevi il file
INSTALL per sapere come procedere.
4.5) Ok, abbiamo installato correttamente OpenVPN su entrambe le macchine. Innanzitutto scelgo di
usufruire dell'autenticazione tramite shared key (http://openvpn.net/static.html):
openvpn --genkey --secret static.key
adesso abbiamo un file, static.key, che dobiamo copiare su entrambe le macchine che chiameremo CLIENT e
SERVER, rispetivamente il Ns PC aziendale ed il SERVER a cui dobbiamo connetterci.
4.6) Creiamo adesso una bella cartella mkdir /etc/openvpn, dove salvare tutti i files necessari, e copiamoci
static.key. Facciamo l'operazione su entrambe le macchine.
4.7) Adesso scriviamo i files di configurazione per il server (server.conf) ed il client (client.conf):
server.conf
client.conf
dev tun
comp-lzo
keepalive 10 60
ping-timer-rem
proto tcp-server
port SERVER_PORT
persist-tun
persist-key
ifconfig VPN_SIDE_A_IP VPN_SIDE_B_IP
secret static.key
daemon
dev tun
comp-lzo
remote SERVER_IP SERVER_PORT
ifconfig VPN_SIDE_B_IP VPN_SIDE_A_IP
secret static.key
proto tcp-client
http-proxy PROXY_IP PROXY_PORT
http-proxy-retry
resolv-retry infinite
daemon
OpenVPN through Proxy, ovvero come aggirare il firewall aziendale
Creative Common license (http://creativecommons.org/licenses/by-nc-sa/2.5/)
Ovviamente dobbiamo sostituire alcuni valori:
SERVER_PORT – La porta su cui il server ascolta. Nel mio caso la 443 per ovviare alle limitazioni del proxy.
SERVER_IP – L'indirizzo IL del server
VPN_SIDE_A_IP – Un IP privato del server, io ho 10.8.0.1*
VPN_SIDE_B_IP – Un IP privato del client, io ho 10.8.0.2*
PROXY_IP – Indirizzo del proxy aziendale, nel nostro caso 10.0.0.1
PROXY_PORT – Porta del proxy, in genere 8080
* dovere utilizzare IP destinati ad uso Intranet (definiti in RFC1918): 10.0.0.0 (10/8 prefix) 172.16.0.0 (172.16/12 prefix) 192.168.0.0
(192.168/16 prefix) e non in conflitto con altre reti presenti.
4.8) A questo punto ci siamo MA ATTENZIONE:
Avete detto al firewall sul server remoto di accettare connessioni TCP sulla SERVER_PORT ?
Avete configurato l'IP_FORWARD sul server ?
Se la risposta è SI iniziamo a lanciare il demone, come utente root, sul server:
cd /etc/openvpn
openvpn server.conf
e poi sul client:
cd /etc/openvpn
openvpn client.conf
se tutto è andato bene, con ifconfig, dovremmo vedere la nuova interfaccia di rete:
tun0
Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.8.0.2 P-t-P:10.8.0.1 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
RX packets:260 errors:0 dropped:0 overruns:0 frame:0
TX packets:358 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:128198 (125.1 KiB) TX bytes:25927 (25.3 KiB)
e dovremmo poter raggiungere l'altra macchina.
Se qualcosa non funziona controllate che il demone openvpn sia attivo con:
ps -ax | grep openvp
che dovrebbe ritornare
14269 ?
Ss
0:00 openvpn client.conf
Ss
0:00 openvpn server.conf
sul client e
i9575 ?
sul server (con alcune differenze, ovviamente !). Se non vedete questi processi vi consiglio di eliminare la riga
daemon dai due file di configurazione e tornare al punto 4.8, con la differenza che avrete in consolle il log
OpenVPN through Proxy, ovvero come aggirare il firewall aziendale
Creative Common license (http://creativecommons.org/licenses/by-nc-sa/2.5/)
delle operazioni. Se desiderate maggiori dettagli potete inserire il comando verb n (dove n è un numero tra 0
e 11):
Set output verbosity to n (default=1). Each level shows all info from the previous levels. Level 3 is recommended if you
want a good summary of what's happening without being swamped by output.
0 -- No output except fatal errors.
1 to 4 -- Normal usage range.
5 -- Output R and W characters to the console for each packet read and write, uppercase is used for TCP/UDP packets
and lowercase is used for TUN/TAP packets.
6 to 11 -- Debug info range (see errlevel.h for additional information on debug levels).
Ecco il log tipico di una connessione come quella descritta:
Server
Client
OpenVPN 2.0.9 i686-pc-linux [SSL] [LZO] built on Dec 7 2006
LZO compression initialized
TUN/TAP device tun0 opened
/sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Listening for incoming TCP connection on [undef]:SERVER_PORT
TCP connection established with PROXY_IP:[temp_proxy_port]
TCPv4_SERVER link local (bound): [undef]:SERVER_PORT
TCPv4_SERVER link remote: PROXY_IP:[temp_proxy_port]
Peer Connection Initiated with PROXY_IP:[temp_proxy_port]
Initialization Sequence Completed
OpenVPN 2.0.9 i686-pc-linux [SSL] [LZO] built on Dec 7 2006
LZO compression initialized
TUN/TAP device tun0 opened
/sbin/ifconfig tun0 10.8.0.2 pointopoint 10.8.0.1 mtu 1500
Attempting to establish TCPconnection with PROXY_IP:PROXY_PORT
TCP connection established with PROXY_IP:PROXY_PORT
TCPv4_CLIENT link local: [undef]
TCPv4_CLIENT link remote: PROXY_IP:PROXY_PORT
Peer Connection Initiated with PROXY_IP:PROXY_PORT
Initialization Sequence Completed
5 - Conclusioni
OpenVPN è un sistema rapido e semplice per create VPN sicure. Oltretutto ha queste interessanti possibilità
che lo rendono molto più flessibile di altre tecnologie consolidate, come IPSEC.
Anche se in questo documento ho descritto brevemente un caso, sul loro sito web trovate tutta la
documentazione che vi serve. Visitate http://www.openvpn.net prima di procedere con le operazioni descritte
quì.
Il sistema che vi ho descritto è molto interessante e può essere applicato ad una miriade di casistiche diverse.
Ovviamente assicuratevi che ciò che fate sia legale: se finite in galera non è per colpa mia o di quello che c'è
scritto in questo documento !
Michele <o-zone(at)zerozone.it> Pinassi
OpenVPN through Proxy, ovvero come aggirare il firewall aziendale
Creative Common license (http://creativecommons.org/licenses/by-nc-sa/2.5/)