ViewRevisions

IPv6 a qualsevol lloc amb tinc

Ja fa temps vaig descriure com fer servir 6to4 per a proporcionar una connexió IPv6 estable a una màquina dotada d’una adreça pública IPv4 fixa, un procediment realment simple (almenys en la seua configuració bàsica) que ens permet accedir a una nova Internet on hi ha abundància d’adreces i tothom pot oferir els seus propis serveis.

Tanmateix el procediment és gairebé una entelèquia perquè si la màquina disposa d’una adreça pública IPv4 fixa ja és capaç d’oferir serveis a Internet. En canvi, què hi ha dels ordinadors que tenim a casa darrere d’un dispositiu que fa NAT (i per tant tenen adreces privades), o d’aquells que portem amb nosaltres (i per tant tenen adreces variables)?

En aquest article descric com fer servir tinc per a estendre la connectivitat IPv6 d’una màquina amb una xarxa IPv6 pròpia (nativa o 6to4) a ordinadors domèstics i mòbils, de forma que aquests tinguen adreces públicament accessibles d’aquesta xarxa amb independència de la seua ubicació.

Topologia de la xarxa

Tinc és programari lliure destinat a construir xarxes privades virtuals (VPN) que es diferencia d’altres productes de VPN en que fa molt senzilla la configuració de xarxes de topologia distribuïda sense necessitar nodes centrals per a l’encaminament o l’autenticació. Cada node tinc defineix la seua pròpia subxarxa i el sistema s’encarrega d’intercanviar les rutes i claus necessàries per a que la comunicació tinga lloc de forma directa (si és possible) i segura entre nodes que no es coneixen explícitament.

Assumirem que tenim un node que anomenarem passareŀla amb una adreça pública IPv4 fixa i una xarxa IPv6 pròpia. Per a seguir amb l’exemple de l’article anterior, aquestes seran 1.2.3.4 i la seua xarxa 6to4 respectiva 2002:0102:0304::/48 (però podria ser qualsevol altra xarxa IPv6 pública). També assumirem que la resta de nodes no tenen connexió a la Internet IPv6 ni una adreça IPv4 pública i fixa.

Configurarem tinc per a que cada node de la xarxa done accés a la seua pròpia subxarxa 2002:0102:0304:N::/64 (amb N = 0 per a la passareŀla). Els nodes es connectaran a la passareŀla, que s’encarregarà així de connectar entre elles totes les subxarxes i de donar accés a la Internet IPv6 als nodes que escullen la xarxa tinc com a ruta per defecte.

Xarxes IPv4 i IPv6.

Observeu com cada node tindrà la mateixa adreça a la xarxa tinc i a la xarxa local a què donarà accés, cosa que aconseguim emprant dues màscares de xarxa diferents. En aquest sentit, el manual és una combinació d’aquest exemple i aquest article.

Configuració de la passareŀla

Per a configurar una passareŀla amb Debian o similar, en primer lloc hi instaŀlarem al paquet tinc. A continuació crearem el directori /etc/tinc/inet6 que contindrà els fitxers de configuració de la nostra xarxa, que ací anomenarem inet6 (tinc pot gestionar‐ne múltiples alhora).

Ara crearem el fitxer de configuració del servidor tinc per a aquest node, /etc/tinc/inet6/tinc.conf:

AddressFamily = ipv4
BindToAddress = gateway.example.net 655
Name = gateway

L’única opció realment necessària és Name, que ací estableix a gateway el nom únic d’aquest node en la xarxa tinc. L’opció AddressFamily fa que tinc només empre connexions IPv4, cosa raonable per a proporcionar IPv6 sobre ell. L’opció BindToAddress fixa l’adreça i port (TCP i UDP, 655 per defecte) on escoltarà tinc, i pot ser útil si la passareŀla té múltiples adreces IPv4 o si anem a gestionar més d’una xarxa amb tinc, ja que cadascuna necessita un port diferent.

Per a que dos nodes tinc es puguen connectar de forma segura han de conéixer amb anterioritat els seus respectius noms i claus públiques, així com les subxarxes a què donen accés. Si un node vol connectar amb un altre, necessitarà saber també l’adreça i port on escolta el servidor tinc d’aquest. Cada node defineix tots aquests paràmetres en un fitxer de configuració de l’estació que ha de ser copiat als nodes amb què es vulga connectar.

A continuació crearem el fitxer de configuració de l’estació per a la passareŀla, /etc/tinc/inet6/hosts/gateway. Caldrà crear primer el subdirectori hosts i és important que emprem per al fitxer el nom indicat anteriorment a Name.

Address = gateway.example.net 655
Subnet = 2002:0102:0304:0000:0:0:0:0/64
Subnet = 0:0:0:0:0:0:0:0/0

Naturalment els valors de Address són els indicats més a dalt. La subxarxa anunciada és 2002:0102:0304:0000::/64 (tinc no admet notació compacta) com mostra el diagrama així com ::/0, és a dir, tota la Internet IPv6.

Completarem el fitxer amb la clau pública del node, que generarem executant tincd -n inet6 -K i acceptant les respostes per defecte. Açò afegirà al final del fitxer un bloc BEGIN/END RSA PUBLIC KEY.

Tinc no afegeix automàticament cap adreça ni ruta a l’estació, sinó que delega una sèrie d’scripts per a la configuració de la xarxa. En el nostre cas, suposant que la passareŀla ja té configurades les interfícies i rutes IPv6, crearem els següents scripts /etc/tinc/inet6/tinc-up

#!/bin/sh
ip -6 link set "$INTERFACE" up mtu 1400
ip -6 addr add 2002:0102:0304:0000::1/48 dev "$INTERFACE"

i /etc/tinc/inet6/tinc-down

#!/bin/sh
ip -6 addr del 2002:0102:0304:0000::1/48 dev "$INTERFACE"
ip -6 link set "$INTERFACE" down

que s’executaran en iniciar i detenir la xarxa inet6 de tinc (no oblideu fer‐los executables amb chmod a+rx SCRIPT). Observeu com es limita la mida màxima (MTU) del datagrama IPv6 a 1400 octets: tenim en compte la sobrecàrrega introduïda per 6to4 (en el nostre cas) o tinc per a reduir la probabilitat de trobar‐nos amb problemes durant el procés de descobriment de l’MTU entre dues estacions IPv6. El valor més segur (i un poc menys eficient) és 1280. Vegeu aquest article per a més informació.

Finalment afegirem inet6 al fitxer /etc/tinc/nets.boot que llista les xarxes a iniciar automàticament amb l’script d’arrencada de tinc i la posarem en marxa executant invoke-rc.d tinc restart. Açò completa la configuració del propi tinc.

Si la passareŀla té configurat un tallafoc encara necessitarem uns retocs. Com que rebrà connexions d’uns altres nodes tinc és important obrir al tallafoc els ports TCP i UDP indicats a dalt amb les regles equivalents a les ordres següents:

# iptables -A INPUT -p udp -m udp --dport 655 -j ACCEPT
# iptables -A INPUT -p tcp -m tcp --dport 655 -j ACCEPT

La passareŀla també encaminarà tràfic IPv6, així que haurem de permetre al tallafoc el reenviament IPv6 amb la regla equivalent a:

# ip6tables -P FORWARD ACCEPT

I també haurem d’habilitar el reenviament IPv6 al nucli via sysctl, per exemple:

# cat > /etc/sysctl.d/local-forwarding.conf << EOF
net.ipv6.conf.all.forwarding=1
EOF
# sysctl -p /etc/sysctl.d/local-forwarding.conf

Configuració de la resta de nodes

Com he comentat abans tinc és un sistema distribuït i per tant no hi ha servidors i clients, només nodes que es connecten entre ells. En el nostre cas els nodes sense adreces IPv4 públiques i fixes iniciaran les connexions cap al node passareŀla. Però com veurem les configuracions són pràcticament les mateixes.

Instaŀlarem el paquet tinc i crearem el directori /etc/tinc/inet6. Al fitxer de configuració del servidor /etc/tinc/inet6/tinc.conf escriurem:

AddressFamily = ipv4
BindToAddress = * 655
Name = my_pc
ConnectTo = gateway

Com que aquest node iniciarà les connexions amb uns altres (i no a la inversa) no importa l’adreça on escoltarà tinc (per això el *). Tanmateix, com que cada xarxa de tinc necessita un port diferent no està de més fer‐lo explícit, i en el nostre cas l’emprarem més endavant. El més important ací torna a ser el nom d’aquest node (my_pc) i també les aparicions d’opcions ConnectTo que indiquen pel seu nom cap a quins nodes s’iniciaran connexions.

Crearem el fitxer de configuració de l’estació /etc/tinc/inet6/hosts/my_pc amb les subxarxes a què aquest node donarà accés

Subnet = 2002:0102:0304:0004:0:0:0:0/64

i invocarem tincd -n inet6 -K per a crear les claus del node. Per cert, si només volem donar accés a aquesta estació podem emprar una màscara /128, p.ex. 2002:0102:0304:0004:0:0:0:1/128.

Com connectarem amb el node passareŀla, haurem de copiar al seu directori hosts el fitxer d’estació d’aquest node, i alhora copiar al directori hosts d’aquest node el fitxer d’estació de la passareŀla. Compartir els fitxers d’estació pot ser el pas més molest de muntar una xarxa tinc, i si hi ha molts nodes amb una topologia de connexions complexa el més senzill és distribuir tots els fitxers d’estació de la xarxa junts (p.ex. emprant algun sistema distribuït de control de versions), cosa que també pot ajudar a triar nous noms i subxarxes únics.

Els scripts de configuració de xarxa només difereixen dels de la passareŀla (a més de l’adreça assignada, naturalment) en que afegeixen una ruta per defecte a la Internet IPv6 via la xarxa tinc. Així /etc/tinc/inet6/tinc-up:

#!/bin/sh
ip -6 link set "$INTERFACE" up mtu 1400
ip -6 addr add 2002:0102:0304:0004::1/48 dev "$INTERFACE"
ip -6 route add default dev "$INTERFACE"

i /etc/tinc/inet6/tinc-down:

#!/bin/sh
ip -6 route del default dev "$INTERFACE"
ip -6 addr del 2002:0102:0304:0004::1/48 dev "$INTERFACE"
ip -6 link set "$INTERFACE" down

Observeu com no s’indica l’adreça de l’encaminador per defecte, només la interfície per on cal enviar els paquets. En rebre un paquet, tinc s’encarrega de trobar el node que dóna accés a la subxarxa destinació adequada (i recordem que el node passareŀla anuncia la subxarxa ::/0).

Després d’habilitar amb chmod l’execució dels scripts, afegirem inet6 a /etc/tinc/nets.boot i reiniciarem tinc amb invoke-rc.d tinc restart. Als pocs segons hauríem de ser capaços de fer ping a la passareŀla:

$ ping6 2002:0102:0304:0000::1
PING 2002:0102:0304:0000::1(2002:102:304::1) 56 data bytes
64 bytes from 2002:102:304::1: icmp_seq=1 ttl=64 time=141 ms
64 bytes from 2002:102:304::1: icmp_seq=2 ttl=64 time=141 ms
64 bytes from 2002:102:304::1: icmp_seq=3 ttl=64 time=142 ms
64 bytes from 2002:102:304::1: icmp_seq=4 ttl=64 time=142 ms

--- 2002:102:304::1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 141.617/142.174/142.737/0.505 ms

Si hi ha cap problema, reviseu /var/log/daemon.log. Si funciona, podeu provar la vostra connectivitat amb la resta de la Internet IPv6 visitant ipv6-test.com o test-ipv6.com (:D), o SubnetOnline.com a qui podeu indicar la vostra adreça per a que hi faça ping. Recordeu doncs que el vostre ordinador estarà públicament accessible via IPv6, així que més vos val preparar una bona configuració de tallafoc. I parlant de tallafoc, si aneu a donar accés a més ordinadors a la vostra xarxa IPv6 local, recordeu habilitar el reenviament IPv6 al tallafoc i al nucli com s’indica anteriorment.

Connexió directa en la xarxa local

Si mireu el diagrama de la xarxa veureu que my_laptop es troba en la mateixa xarxa local que my_pc. Tanmateix, com que no són accessibles des d’Internet, si volen comunicar‐se entre ells via la xarxa IPv6 el tràfic haurà de passar forçosament per gateway, cosa no molt eficient. Tinc 1.0.17 o superior permet cercar nodes coneguts en la xarxa local, evitant salts innecessaris mentre es manté la seguretat de les dades. Açò pot ser interessant en xarxes locals WiFi sense xifrat.

Per a habilitar aquesta cerca afegirem al fitxer tinc.conf del node l’opció LocalDiscovery = yes. Açò farà que tinc difonga per la xarxa local paquets UDP adreçats al port configurat al mateix fitxer (per això convé fixar‐hi el valor del port), el que significa que aquest mecanisme només funcionarà si tots els nodes a la xarxa local empren el mateix port.

Per descomptat caldrà que els nodes contactats tinguen aquest port obert al tallafoc i que els nodes a connectar tinguen els fitxers d’estació dels altres. Una altra volta, el més còmode és que tots els nodes tinguen els fitxers d’estació de tots els nodes de la xarxa.

Pingback

[...] he comentat anteriorment (ací i ací) com l’abundància d’adreces amb IPv6 hauria de facilitar que qualsevol puga oferir serveis a [...]