In questa guida spiegherò come configurare un raspberry (nel mio caso pi one) ed utilizzarlo come gateway.. Inoltre verrà installato il pacchetto openvpn per criptare il traffico in uscita. Il risultato sarà che esso fungerà da gateway ed instraderà i client all'interno di un tunnel vpn per "navigare" con un indirizzo ip differente rispetto al proprio ISP. L'attuale guida necessita di un account VPN gratuito e/o a pagamento, io ne ho utilizzato uno su surfshark (www.surfshark.com), per il primo mese è gratuito così volete fare delle prove va benissimo. Prima di tutto scaricate dal sito originale raspberry www.raspberrypi.org la versione desiderata del sistema operativo, io ho optato per Raspbian Buster Lite in quanto avevo in giro solo una SD da solo 8GB. Una volta scaricata e regolarmente trasferita sull'SD (dd o win32 disk imager) possiamo procedere alla configurazione del nostro rpi. Per comodità per i parametri base utilizzate pure il raspi-config (https://www.raspberrypi.org/documentation/configuration/raspi-config.md) Inizialmente andremo a configurare il nostro rpi da console tty successivamente via ssh. Raspian buster è progettato per avviarsi in DHCP quindi la prima cosa da fare è quella di modificare i parametri di rete per impostare un ip statico. Per comodità ho eseguito tutto da root, quindi andiamo a modificare il file dhcpcd.conf sotto etc. # /etc/dhcpcd.conf #lan interface enxb827eb50a95f static ip_address=192.168.1.254/24 static routers=192.168.1.1 static domain_name_servers=8.8.8.8 8.8.4.4 #wifi #interface wlxc83a35cdc66a #static ip_address=192.168.1.254/24 #static routers=192.168.1.1 #static domain_name_servers=8.8.8.8 8.8.4.4 *************************************** I parametri sono abbastanza semplici, interface è la vostra interfaccia di rete es. eth0 nel mio caso è enxb827eb50a95f rilevata con ifconfig, static ip è l'ip che volete mettere al vostro raspberry, static routers è/sono l'/gli ip del/dei router(s), è possibile impostarne più di uno per instradare il traffico su più interfacce qual'ora ne aveste, infine domain_name_servers sono i dns, io ho usato i pubblici di google per comodità. La wifi l'ho commentata con # in quanto non ho intenzione di usarla in questa guida. Per far si che non ci pesti i piedi il NetworkManager è buona cosa fermarlo e disattivarlo con qs comandi all'avvio: systemctl stop NetworkManager systemctl disable NetworkManager fatto questo è possibile riavviare così da accedere via ssh tramite ip statico al vostro rpi. Potevate farlo anche prima ma avreste dovuto cercare l'ip dell'rpi con nmap, con uno scanner di rete, pingando il broadcast o altro. Una volta ripartiti dobbiamo fare in modo che i client che si collegano ad esso possano navigare tramite l'rpi. Quindi prendiamo un ipotetico client windows o linux che sia, impostiamo un ip nella stessa rete es. 192.168.1.44 netmask 255.255.255.0 e come gateway invece che mettere il vostro router(es. 192.168.1.1) mettete l'ip del vostro raspberry con l'interfaccia ethernet configurata nella prima parte della guida es. 192.168.1.254. Eseguite un ping recursivo di un ip pubblico es. google 8.8.8.8 (win: ping 8.8.8.8 -t) e vedrete che i pacchetti verranno persi; Questo avviene perché ancora non abbiamo abilitato l'ip forward nel nostro rpi quindi in questo momento il pacchetto arrivano al nostro rpi e si fermano. Abilitiamo (temporaneamente) dunque il nostro rpi a far transitare i pacchetti con questo comando: echo 1 > /proc/sys/net/ipv4/ip_forward il risultato è il seguente: client(192.168.1.44)--->rpi(192.168.1.254)-->router(192.168.1.1) Quindi ora l'rpi fa transitare i pacchetti del client e li instrada al/ai gateway/s impostati nel dhcpcd.conf Ora il vostro ping recursivo funzionerà e quindi torneranno indietro i pacchetti del ping. L'attuale risultato ai vostri occhi conterà poco in questo momento in quanto sarebbe lo stesso che avrete usando il router direttamente, non fa altro che fare un "hop" in più sull'rpi. Ora arriva la parte interessante; Installeremo openvpn e tramite le iptables convoglieremo tutto il traffico all'interno del tunnel in maniera tale da mascherare i pacchetti in uscita e quindi "risultare" con l'ip pubblico della VPN e non con quello del vostro ISP. Aggiorniamo i repository: apt-get update Aggiorniamo l'rpi: apt-get upgrade Installiamo openvpn: apt-get install openvpn Installiamo lynx per fare test di navigazione da locale: apt-get install lynx ******************************************* Scaricate le configurazione ovpn dal sito dove vi siete registrati, esempio: vn-hcm.prod.surfshark.com_tcp.ovpn vn-hcm.prod.surfshark.com_udp.ovpn Esse contengono le informazioni che utilizzeremo con openvpn. Possiamo scriverle a mano ma è più comodo utilizzare queste in quanto contengono (nel mio caso) i certificati CA e TLS. Non tutti i distributori di account VPN è detto che rilascino certificati anche se, a mio avviso, andrebbero usati. Per fare una prova veloce potete lanciare a mano openvpn: openvpn vn-hcm.prod.surfshark.com_tcp.ovpn & vi verranno chieste le credenziali ricevute dal portale di registrazione(es. surfshark), inseritele. La & dopo il comando serve per mandare il processo in modalità background altrimenti dovreste aprire un'altra sessione ssh per continuare. Ora dobbiamo instradare tutti i pacchetti nel tunnel, per far ciò useremo le iptables. # Aggiungo le regole all'iptables # Questa regola server x mascherare il traffico in uscita sull'interfacca del tunnel iptables -A POSTROUTING -o tun0 -j MASQUERADE # Queste 2 regole servono per far transitare il traffico dall'interfaccia del tunnel all'ethernet e viceversa. # Sulla prima delle due, eplicito che l'accettazione deve avvenire solo se lo stato della connessione è STABILITA O CORRELATA iptables -A FORWARD -i tun0 -o enxb827eb50a95f -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -i enxb827eb50a95f -o tun0 -j ACCEPT # Log in /var/log/messages iptables -A FORWARD -j LOG ************************************* Terminata questa operazione e se non ci sono stati errori, dal client (descritto sopra con ip 192.168.1.44 e gateway 192.168.1.254) navigherete mascherati dal tunnel e quindi il vostro indirizzo ip pubblico (www.ping.eu) apparirà quello della VPN remota e non quello del vostro ISP. N.B. Se la VPN non è instaurata i pacchetti verranno cmq instradati nel tunnel ma non essendo su il risultato è che il pacchetto verrà perso. Sotto spiegherò come instradare o meno il routing nel tunnel. ************************************* Ora non vi resta definitivo ciò che è stato eseguito a mano in quanto, riavviando l'rpi perderete tutto :) # Modificare il file /etc/sysctl.conf e cambiare da 0 a 1 net.ipv4.ip_forward=1 ********************************* # Eseguire sysctl per dire al kerner di prendere il file di configurazione appena modificato sysctl -p /etc/sysctl.conf ********************************* #Create un file per le credenziali e all'interno scrivete nome utente e password ricevuti dal portale di registrazione (ripeto, nel mio caso da surfshark): vi /etc/openvpn/credenziali username password ********************************* salvate, chiudete e rendetelo disponibile solo a root, nessun'altro deve vedere le credenzali: chmod 400 /etc/openvpn/credenziali # Spostavi nella cartella dove avete scarcato le configurazioni ovpn e copiatelo in openvpn cp vn-hcm.prod.surfshark.com_tcp.ovpn /etc/openvpn/client.conf # Editate il file client.conf e specificate dove andare a prendere le credenziali auth-user-pass credenziali ********************************* In sostanza dovrà risultare così: #cat /etc/openvpn/client.conf client dev tun proto tcp remote vn-hcm.prod.surfshark.com 1443 resolv-retry infinite remote-random nobind tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 persist-key persist-tun ping 15 ping-restart 0 ping-timer-rem reneg-sec 0 remote-cert-tls server auth-user-pass credenziali #comp-lzo verb 3 pull fast-io cipher AES-256-CBC auth SHA512 #certificati vari (CA TLS AUTH ECC...) ********************************* Per comodità ho creato 2 file, uno chiamato firewall.sh dove sono contenute le regole di instradamento dei pacchetti nel tunnel e l'altro clean.sh che cancella e pulisce le regole, incluse le precedenti e permette di navigare solamente forwardati. ********************************* #firewall.sh root@gatewayVPN:/home/pi# cat firewall.sh #!/bin/bash DEPMOD=/sbin/depmod MODPROBE=/sbin/modprobe EXTIF="tun0" INTIF="enxb827eb50a95f" $DEPMOD -a echo -en "ip_tables, " $MODPROBE ip_tables echo -en "nf_conntrack, " $MODPROBE nf_conntrack echo -en "nf_conntrack_ftp, " $MODPROBE nf_conntrack_ftp echo -en "nf_conntrack_irc, " $MODPROBE nf_conntrack_irc echo -en "iptable_nat, " $MODPROBE iptable_nat echo -en "nf_nat_ftp, " $MODPROBE nf_nat_ftp echo "----------------------------------------------------------------------" echo "1" > /proc/sys/net/ipv4/ip_forward echo "1" > /proc/sys/net/ipv4/ip_dynaddr iptables-restore <<-EOF *nat -A POSTROUTING -o "$EXTIF" -j MASQUERADE COMMIT *filter :INPUT ACCEPT [0:0] :FORWARD DROP [0:0] :OUTPUT ACCEPT [0:0] -A FORWARD -i "$EXTIF" -o "$INTIF" -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i "$INTIF" -o "$EXTIF" -j ACCEPT -A FORWARD -j LOG COMMIT EOF ********************************* #clean.sh root@gatewayVPN:/home/pi# cat clean.sh iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT ********************************* #Scegliete poi voi come eseguire all'avvio firewall.sh, se è il caso di farlo partire con l'init.d oppure aggiungerlo al crontab come ho fatto io: crontab -e @reboot /home/pi/firewall.sh ********************************* Ok, avete completato, riavviate ed enjoy :) |