Trasformare un vecchio raspberry pi 1 in un gateway... vpn :)


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


Articolo tratto da: HCP.IT - http://www.hcp.it/
URL di riferimento: http://www.hcp.it/index.php?mod=none_News&action=viewnews&news=1576665716