Exemples de configuracions amb Tinc i OpenVPN
De Guifi.net - Wiki Català
VPN amb Tinc (Linux)
A una xarxa ciutadana com guifi.net hi han molts casos on pot ser interessant conectar dos nodes (o mes) de forma remota entre ells, ja sigui per compartir una sortida a Internet amb la resta de nodes, o per fer extendre la xarxa local entre llocs distants, com per exemple la central d'una empresa amb les seves delegacions, dos amics o familiars que paguen a mitjes una conexio i la volen compartir tot i viure a pobles o ciutats diferents, etc.
Els gairebe 40000 km de territori cobert per guifi.net ofereixen una excelent oportunitat per muntar una VPN sense passar per Internet. Veurem un parell d'exemples, amb dues aplicacions diferents: OpenVPN i Tinc.Les dues son programari lliure i es poden executar en qualsevol sistema operatiu.
Xarxa VPN amb Tinc (entre nodes Linux)
Al primer exemple, volem compartir una sortida a Internet des d'un servidor Debian GNU/Linux amb un portatil amb Linux Mint. Els dos tenen conectivitat amb guifi.net des de nodes diferents, pero nomes el servidor esta conectat a Internet.
La configuracio sera igual o similar amb altres versions de Linux.
Volem que la conexio vagi xifrada i tenir opcions d'afegir mes nodes a la VPN, o inclus vincular-la mes endavant amb altres xarxes privades. L'opcio mes adhient en aquest cas es Tinc.
Servidor
Hostname: server
IP externa: 10.140.150.52
IP local: 192.168.1.2
IP VPN: 172.16.20.1
Portatil
Hostname: notebook
IP externa: 10.140.150.95
IP local: 192.168.2.2
IP VPN: 172.16.20.2
Comencem amb la configuracio del servidor Debian:
Fem una redirecció del port 655 TCP/UDP cap a l'IP local (192.168.1.2).
Instalem Tinc i les seves dependencies:
apitude update && aptitude install ncurses-dev libreadline-dev zlib1g-dev liblzo2-dev libcurl4-openssl-dev tinc
Comprovem que el modul tun estigui carregat al kernel:
lsmod | grep tun
En cas de no estar, afegir-ho al /etc/modules.conf:
alias char-major-10-200-tun
·Editem /etc/networks per tal que la xarxa obtingui un nom simbolic (en aquest exemple 'vpn', pot ser qualsevol altre).
vpn 172.16.20.0
·Afegim a /etc/services el servei, per tal de que sigui reconegut pel software (a les darreres versions de Debian/Ubuntu ja hi es):
- Local services
tinc 655/tcp TINC tinc 655/udp TINC
·Afegim el nom de la xarxa que s'ha d'aixecar en iniciar la maquina:
vim /etc/tinc/nets.boot
vpn
Creem l'arxiu de configuracio de tinc:
vim /etc/tinc/vpn/tinc.conf
Device=/dev/net/tun Name=server Mode=switch PrivateKeyFile=/etc/tinc/vpn/server.priv
La documentacio de la wiki de tinc, diu que amb:
tinc -n vpn init server
s'haurien de construir tots els arxius i directoris basics, pero aquesta comanda no funciona a la versio 1.0.21 (no existeix tinc, nomes tincd, i amb tincd no es creen). S'han de fer els directoris i les claus a ma:
·Fem el directori pels hosts:
mkdir -p /etc/tinc/vpn/hosts
·Generem el parell de claus public i privat:
tincd -n server -K
·Fem l'arxiu /etc/tinc/vpn/tinc-up
- !/bin/sh
ifconfig $INTERFACE 172.16.20.1 netmask 255.255.0.0
·Fem l'arxiu /etc/tinc/vpn/tinc-down
- !/bin/sh
ifconfig $INTERFACE down
Li donem permisos d'execucio:
chmod u+x /etc/tinc/vpn/tinc-up
chmod u+x /etc/tinc/vpn/tinc-down
S'ha de repetir el proces a tots els nodes de la mesh VPN, adaptant segons correspongui. IMPORTANT: En mode switch les subnets de cada node han de ser diferents (p.e. no poden tenir tots com subnet la 192.168.1.0/24). Per treballar tots els nodes amb els mateixos rangs de subnet, tinc hauria de configurar-se en mode bridge (si es necessita broadcast i trafic no ip, o amb arp proxy si no).
El tinc.conf dels "clients" ha de ser:
Device=/dev/net/tun
Name=notebook
ConnectTo=server
Mode=switch
PrivateKeyFile=/etc/tinc/vpn/notebook.priv
·Intercanviem les claus publiques (tot el directori /hosts) de tots els nodes
Conexio:
·Iniciem com a dimoni i amb debugging el servei al servidor amb
tincd -D -d -n vpn
·Iniciem tinc al client (depen de la plataforma)
Quan ja tenim clar que funciona be, es pot iniciar nomes amb:
tincd -n vpn
Enrutament:
Comprovem que esta l'ip forwarding activat a tots els nodes. Si no ho esta, l'activem:
echo 1 > /proc/sys/net/ipv4/ip_forwarding
Per redirigir la porta d'enllaç des del servidor cap als altres nodes, s'han de crear els seguents scripts a cada "client":
NOTA: Aquest procediment nomes esta documentat per Linux a la web de Tinc, si algu vol fer una adaptacio a com serien aquests scripts amb Windows, segur que li agrairan a la wiki de Tinc!!
vim /etc/tinc/vpn/hosts/server-up
- !/bin/sh
VPN_GATEWAY=172.16.20.1 ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route add $REMOTEADDRESS $ORIGINAL_GATEWAY ip route add $VPN_GATEWAY dev $INTERFACE ip route add 0.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE ip route add 128.0.0.0/1 via $VPN_GATEWAY dev $INTERFACE
vim /etc/tinc/vpn/hosts/server-down
- !/bin/sh
ORIGINAL_GATEWAY=`ip route show | grep ^default | cut -d ' ' -f 2-5`
ip route del $REMOTEADDRESS $ORIGINAL_GATEWAY ip route del $VPN_GATEWAY dev $INTERFACE ip route del 0.0.0.0/1 dev $INTERFACE ip route del 128.0.0.0/1 dev $INTERFACE
Els hi donem permisos d'execucio:
chmod u+x /etc/tinc/vpn/hosts/server-up chmod u+x /etc/tinc/vpn/hosts/server-down
I per ultim, afegim al /etc/tinc/vpn/hosts/server (a tots els nodes) la linia:
Subnet=0.0.0.0/0
Ja tenim Internet directe i segur des de qualsevol node!!