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/)