# Teredo

Teredo és un mecanisme de transició a IPv6 que dona connectivitat completa IPv6 als ordinadors que estan connectats a la Internet IPv4 però que no tenen connexió directa amb una xarxa IPv6. Comparat amb altres protocols similars, el seu avantatge és que pot dur a terme la seva funció fins i tot darrere de dispositius que facin NAT com ara els routers domèstics.
Teredo funciona amb un protocol de tunelització independent de la plataforma, que està dissenyat per donar connectivitat IPv6 encapsulant-ne els paquets dins de paquets UDP IPv4. Aquests datagrames es poden encaminar per la Internet IPv4 i per dispositius NAT. D'altres nodes Teredo anomenats relleus Teredo que tenen accés directe a la xarxa IPv6 reben els paquets, els desencapsulen, i els tornen a encaminar, ara ja en IPv6 nadiu.
Teredo està dissenyat com a tecnologia de transició d'últim recurs, amb la intenció que sigui una mesura temporal: a la llarga, tots els ordinadors IPv6 han d'acabar utilitzant connectivitat IPv6 nativa. Per tant, Teredo s'ha d'inhabilitar quan s'aconsegueix connectivitat directa IPv6.
El va desenvolupar Christian Huitema de Microsoft, i el va estandarditzar la IETF amb la RFC 4380. El servidor Teredo té assignat el port UDP 3544.

## Objectiu

6to4, el protocol de tunelització d'IPv6 sobre IPv4 més comú, requereix que el punt extrem del túnel tingui una adreça IPv4 pública. Això no obstant, actualment molts ordinadors es connecten a la Internet IPv4 passant per un o alguns dispositius NAT (com ara el típic router ADSL domèstic), degut a l'escassetat d'adreces IPv4. En aquesta situació, l'única adreça IPv4 disponible està assignada al dispositiu NAT, i llavors caldria implementar l'extrem del túnel 6to4 al mateix dispositiu NAT. Hi ha, però, molts dispositius NAT desplegats, que no es poden actualitzar perquè implementin 6to4, per motius tècnics o econòmics.
Teredo alleuja aquest problema encapsulant paquets IPv6 dins de datagrames UDP en IPv4, que la majoria dels NATs poden encaminar correctament. D'aquesta manera, ordinadors amb IPv6 que estan darrere d'un NAT es poden utilitzar com a extrems de túnel Teredo encara que no tinguin una adreça pública IPv4 dedicada. De fet, un ordinador amb Teredo pot obtenir connectivitat IPv6 sense cap ajuda de la seva xarxa local.
Teredo ha de ser temporal: a la llarga, tots els ordinadors hauran d'utilitzar connectivitat nativa IPv6. El protocol Teredo inclou preparacions per a un procediment de crepuscle: cal que les implementacions de Teredo donin una manera de deixar d'utilitzar la connectivitat Teredo quan IPv6 hagi madurat i hi hagi connectivitat amb mecanismes menys fràgils.

## Resum

El protocol Teredo duu a terme diferents funcions:
* Diagnostica la connectivitat d'UDP sobre IPv4 (UDPv4) i descobreix quin tipus de NAT hi ha present (utilitzant una versió simplificada del protocol STUN)
* Assigna una adreça IPv6 única pública enrutable globalment a cadascun dels ordinadors que l'utilitzen
* Encapsula paquets IPv6 dins de datagrames UDPv4 per transmetre'ls per una xarxa IPv4 (travessant el NAT, si cal)
* Encamina el trànsit entre ordinadors Teredo i ordinadors nadius IPv6 (o no-Teredo)

### Tipus de node

Teredo defineix diferents tipus de node:

#### Client Teredo

    Un ordinador que té connectivitat IPv4 amb la Internet des de darrere d'un NAT i utilitza el protocol de tunelització Teredo per arribar a la Internet IPv6. Els clients Teredo reben una adreça IPv6 que comença amb el prefix Teredo (2001:0::/32).

#### Servidor Teredo

    Un ordinador conegut que s'utilitza per a la configuració inicial d'un túnel Teredo. Un servidor Teredo no mou mai trànsit per al client (a part dels pings IPv6) i, per tant, té requeriments d'amplada de banda molt poc exigents (com a molt, uns quants cents de bits per segon), cosa que permet que un únic servidor pugui gestionar un gran nombre de clients. A més, un servidor Teredo es pot implementar sense estat, de manera que utilitzi la mateixa quantitat de memòria independentment dels clients que estigui gestionant.

#### Relleu Teredo

    L'extrem remot d'un túnel Teredo. Un relleu Teredo ha d'ocupar-se de moure totes les dades dels clients que està servint, amb l'excepció dels intercanvis directes entre clients Teredo. Per tant, un relleu requereix molta amplada de banda i només pot gestionar un nombre limitat de clients simultanis. Cada relleu Teredo dona servei a un grup d'ordinadors IPv6 (per exemple, un únic campus o empresa, un proveïdor d'Internet, tota la xarxa d'un operador, o fins i tot tota la Internet IPv6); traspassa el trànsit entre qualsevol client Teredo i qualsevol ordinador dins del seu grup.

#### Relleu Teredo específic d'un ordinador

    Un relleu Teredo el rang de servei del qual està limitat al mateix ordinador on s'executa. Com a tal, no té requeriments d'amplada de banda ni d'encaminament. Un ordinador amb un relleu específic utilitzarà Teredo per comunicar-se amb clients Teredo, però utilitzarà el seu proveïdor principal de connectivitat IPv6 per arribar a la resta de la Internet IPv6.

### Adreçament IPv6

Cada client Teredo rep una adreça IPv6 pública, que es construeix de la manera següent (el bit d'ordre major comença per 0):
* Els bits 0 a 31 són el prefix Teredo (normalment 2001:0000::/32).
* Els bits 32 a 63 contenen l'adreça IPv4 primària del servidor Teredo que es fa servir.
* Els bits 64 a 79 es poden utilitzar per definir algunes opcions. Ara mateix, només s'utilitza el bit més alt. Es posa a 1 si el client Teredo és darrere d'un NAT, i a 0 si no. Per les implementacions de Windows Vista i Windows Server 2008, es fan servir més bits.
* Els bits 80 a 95 contenen el número de port UDP dissimulat UDP. És el número del port que el NAT desvia cap al client Teredo amb tots els bits invertits.
* Els bits 96 a 127 contenen l'adreça IPv4 dissimulada. És l'adreça pública IPv4 del NAT amb tots els bits invertits.
Taula d'adreçament Teredo IPv6
| Bits | 0 - 31 | 32 - 63 | 64 - 79 | 80 - 95 | 96 - 127 |
| Llargada | 32 bits | 32 bits | 16 bits | 16 bits | 32 bits |
| Descripció | Prefix | IPv4 del servidor Teredo | Opcions | Port UDP dissimulat | IPv4 pública del client |
Per exemple, l'adreça IPv6 2001:0000:4136:e378:8000:63bf:3fff:fdd2 es refereix a un client Teredo:
* que fa servir el servidor Teredo que hi ha a l'adreça 65.54.227.120 (4136e378 en hexadecimal),
* situat darrere un NAT en con (el bit 64 està actiu),
* que utilitza el port UDP mapejat 40000 al seu NAT (en hexadecimal 63bf xor ffff dona 9c40, que en decimal és 40000),
* que fa un NAT darrere l'adreça IPv4 pública 192.0.2.45 (3ffffdd2 xor ffffffff dona c000022d, és a dir 192.0.2.45).
Taula d'exemple de l'IPv6 de Teredo
| Bits | 0 - 31 | 32 - 63 | 64 - 79 | 80 - 95 | 96 - 127 |
| Llargada | 32 bits | 32 bits | 16 bits | 16 bits | 32 bits |
| Descripció | Prefix | IPv4 del servidor Teredo | Opcions | Port UDP dissimulat | IPv4 pública del client |
| Part | 2001:0000 | 4136:e378 | 8000 | 63bf | 3fff:fdd2 |
| Decodificat | | 65.54.227.120 | NAT en con | 40000 | 192.0.2.45 |

### Servidors

    Per una llista actualitzada de servidors Teredo, vegeu la llista a Enllaços externs.
Els clients Teredo utilitzen els servidors Teredo per autodetectar el tipus de NAT (o no) darrere el qual estan situats, mitjançant un procediment de qualificació simplificat semblant al de STUN. Els clients Teredo també mantenen una vinculació al seu NAT amb el seu servidor Teredo, enviant-li un paquet UDP en intervals de temps regulars. Això assegura que el servidor sempre pot posar-se en contacte amb qualsevol dels seus clients, cosa que cal perquè els "forats al NAT" funcionin bé.
Si un relleu Teredo (o un altre client Teredo) ha d'enviar un paquet IPv6 a un client Teredo, primer enviarà un paquet de bombolla Teredo al servidor Teredo del client, l'adreça IP del qual es pot deduir a partir de l'adreça IPv6 del client Teredo. Llavors, el servidor pot fer arribar la bombolla al client, i així el programari del client Teredo destí sap que s'ha d'obrir un forat al NAT en direcció cap al relleu Teredo.
Els servidors Teredo també poden transmetre paquets ICMPv6 de clients Teredo cap a la Internet IPv6. A la pràctica, quan un client Teredo vol contactar un node nadiu IPv6, ha d'esbrinar on és el seu relleu Teredo corresponent (és a dir, cap a quina adreça IPv4 pública i quin port UDP ha d'enviar els paquets IPv6 encapsulats). Per fer-ho, el client construeix un paquet Echo Request ICMPv6 (un ping) cap al node IPv6, i l'envia mitjançant el servidor Teredo que té configurat. El servidor Teredo desencapsula el ping i l'envia cap a la Internet IPv6, de manera que ha d'acabar arribant al node IPv6. Llavors, el node IPv6 hauria de contestar amb un Echo Reply ICMPv6, com mana la RFC 2460. Aquest paquet de resposta s'enviarà cap al relleu Teredo més proper, que finalment provarà de contactar el client Teredo.
Mantenir un servidor Teredo requereix poca amplada de banda, perquè no s'impliquen en la transmissió ni la recepció dels paquets de trànsit IPv6. A més, no necessita cap mena d'accés als protocols d'encaminament de la Internet. Els únics requeriments per un servidor Teredo són:
* la capacitat d'enviar paquets ICMPv6 amb una adreça origen que pertanyi al prefix Teredo
* dues adreces IPv4 públiques diferents (encara que no està escrit a l'especificació oficial, els clients Windows esperen que les dues adreces siguin consecutives); la segona adreça IPv4 cal per a la detecció de NAT
Servidors Teredo públics:
* teredo.remlab.net / teredo-debian.remlab.net (França)
* teredo.autotrans.consulintel.com (Espanya)
* teredo.ipv6.microsoft.com (Estats Units, Redmond) (predeterminat per als sistemes WindowsXP/2003/Vista/2008)
* teredo.ngix.ne.kr (Corea del Sud)
* teredo.managemydedi.com (Estats Units, Chicago)
* teredo.trex.fi (Finlàndia)

### Relleus

Un relleu Teredo pot requerir potencialment molta amplada de banda. A més, ha d'anunciar una ruta cap al prefix IPv6 Teredo (2001:0::/32) als altres ordinadors IPv6. D'aquesta manera, el relleu Teredo rebrà trànsit dels ordinadors IPv6 amb destinació qualsevol client Teredo, i l'haurà d'enviar per UDP/IPv4. De forma simètrica, rebrà paquets de clients Teredo amb destinació cap a ordinadors amb IPv6 nadiu per UDP/IPv4, i els haurà d'injectar a la xarxa nativa IPv6.
A la pràctica, els administradors de xarxa poden preparar un relleu Teredo privat per a la seva empresa o campus; això proporcionarà un camí curt entre la seva xarxa IPv6 i qualsevol client Teredo. Això no obstant, muntar un relleu Teredo a una escala que superi una sola xarxa requereix la capacitat d'exportar rutes BGP IPv6 cap als altres sistemes autònoms.
Al contrari de 6to4, on cada meitat d'una connexió pot utilitzar relleus diferents, el trànsit entre un node IPv6 nadiu i un de Teredo utilitzarà el mateix relleu Teredo, en concret el que sigui més a prop de l'ordinador IPv6 nadiu en termes de xarxa. L'ordinador Teredo no pot localitzar un relleu tot sol (perquè no pot enviar paquets IPv6 per si mateix); si li cal iniciar una connexió amb un ordinador IPv6 nadiu, enviarà el primer paquet pel servidor Teredo, que envia un paquet cap a l'ordinador nadiu IPv6 utilitzant l'adreça IPv6 Teredo del client. L'ordinador nadiu IPv6 contestarà llavors de manera normal a l'adreça IPv6 Teredo del client, cosa que farà que el paquet de tornada acabi trobant un relleu Teredo, i aquest iniciarà una connexió cap al client (possiblement utilitzant el servidor Teredo per travessar el NAT). A partir d'aquest punt, el relleu es farà servir per a la comunicació entre els dos ordinadors tant de temps com calgui. Aquest disseny significa que ni el servidor Teredo ni el client ha de saber l'adreça IPv4 de cap relleu Teredo; se'n troba una d'apropiada automàticament mitjançant la taula d'encaminament global IPv6, perquè tots els relleus Teredo anuncien la xarxa 2001:0::/32.
    Per informació en temps pràcticament real sobre Teredo i BGP, vegeu els Enllaços externs.
El primer trimestre de 2009, la xarxa de Hurricane Electric, un dels ISPs pioners d'IPv6, va habilitar 14 relleus Teredo en una implementació anycast i anunciant de forma global 2001::/32. Els relleus estaven ubicats a Seattle, Fremont, Los Angeles, Chicago, Dallas, Toronto, Nova York, Ashburn, Miami, Londres, París, Amsterdam, Frankfurt i Hong Kong.
S'espera que els grans operadors de xarxa mantindran relleus Teredo. Com amb 6to4, encara no és clar, però, si el servei Teredo escalarà si una proporció alta d'ordinadors comencen a utilitzar IPv6 amb Teredo a més d'IPv4.
Encara que Microsoft ha tingut en funcionament un grup de servidors Teredo des que es va presentar el primer pseudo-túnel Teredo per a Windows XP, no ha proporcionat mai cap servei de relleu Teredo per a tota la Internet IPv6.

## Limitacions

Teredo no és compatible amb tots els dispositius NAT. Per dir-ho amb la terminologia de l'RFC 3489, se suporten els dispositius NAT full cone, restricted i port-restricted, mentre que els NAT symmetric no. La Universitat Nacional Chiao Tung ha proposat SymTeredo que millora el protocol Teredo original per suportar NATs simètrics, i les implementacions de Microsoft i Miredo tenen algunes extensions no especificades i fora de l'estàndard que milloren el suport per a NATs simètrics. Això no obstant, la connectivitat entre un client Teredo que estigui al darrere d'un NAT simètric, i un client Teredo que estigui al darrere d'un NAT simètric o port-restricted continua semblant impossible.
De fet, Teredo assumeix que quan dos clients intercanvien paquets IPv6 encapsulats, els números de port UDP mapejat i extern utilitzats seran els mateixos que s'havien utilitzar per posar-se en contacte amb el servidor Teredo (i per construir l'adreça IPv6 Teredo). Sense aquesta suposició, no seria possible d'establir una comunicació directa entre els dos clients, i caldria utilitzar un relleu costós que fes un encaminament en triangle. Una implementació de Teredo provarà de detectar el tipus de NAT quan s'engega, i no funcionarà si el NAT sembla simètric. (Aquesta limitació de vegades es pot resoldre configurant manualment una regla de transmissió de port al NAT, cosa que requereix tenir accés administratiu al dispositiu).
Teredo només pot proporcionar una única adreça IPv6 per cada extrem de túnel. Per tant, no és possible d'utilitzar un únic túnel Teredo per connectar múltiples ordinadors, al contrari de 6to4 i alguns túnels IPv6 punt a punt.
L'amplada de banda disponible per a tots els clients Teredo cap a la Internet IPv6 està limitada per la disponibilitat de relleus Teredo (que en això són iguals als relleus 6to4).

## Alternatives

6to4 necessita una adreça IPv4 pública, però proporciona un prefix IPv6 gran de 48 bits per a cada extrem del túnel, i es perd menys en l'encapsulació.
Els túnels punt a punt poden ser més fiables i són més gestionables que Teredo, i típicament proporcionen adreces IPv6 permanents que no depenen de l'adreça IPv4 de l'extrem del túnel. Alguns tunnel brokers permeten a més l'encapsulació d'UDP per travessar NATs (per exemple, el protocol AYIYA pot fer-ho). D'altra banda, els túnels punt a punt requereixen inscriure-s'hi, normalment. Hi ha eines automatitzades (com ara AICCU) per facilitar l'ús de túnels punt a punt.

## Consideracions sobre la seguretat
### Exposició

Teredo augmenta la superfície d'atac en assignar adreces IPv6 públiques a ordinadors situats al darrere de dispositius NAT, que si no fos per això, no serien accessibles des d'Internet. En fer-ho, Teredo posa en perill qualsevol aplicació amb suport d'IPv6 que tingui un port obert cap a l'exterior. També exposa la pila IPv6 i el programari de tunelització Teredo a atacs si tinguessin alguna vulnerabilitat explotable de forma remota.
La pila IPv6 de Microsoft té una opció de connector de "nivell de protecció". Això permet que les aplicacions especifiquin si estan disposades a gestionar trànsit que vingui del túnel Teredo des de qualsevol lloc excepte Teredo (predeterminat), o només des de la Intranet local.

### Tallafocs, filtres i bloquejos

Perquè un pseudo-túnel Teredo funcioni correctament, no s'han de filtrar els paquets UDP sortints. A més, les respostes a aquests paquets (és a dir, "trànsit demanat") tampoc no s'han de filtrar. Això correspon a la configuració típica d'un NAT i la seva funcionalitat de tallafocs amb estats.
El programari de tunelització Teredo detectarà un error fatal i s'aturarà si es bloqueja el trànsit UDP IPv4 sortint.

### Denegacions de servei via bucles d'encaminament

S'han descobert alguns mètodes nous per fer atacs de denegació de servei provocant bucles d'encaminament amb túnels Teredo. Són relativament fàcils d'evitar.

## Implementacions

Hi ha disponibles unes quantes implementacions de Teredo:
* Windows XP SP2 inclou un client i un relleu host-specific (també són a l'Advanced Networking Pack del Service Pack 1).
* Windows Server 2003 té un relleu i un servidor proporcionats sota el programa Beta de Microsoft.
* Windows Vista i Windows 7 tenen incorporat el suport de Teredo amb una extensió no especificada per travessar NATs simètrics. Això no obstant, si només hi ha una adreça local a l'enllaç i Teredo, aquests sistemes operatius no intentaran resoldre registres DNS de tipus AAAA. Però fins i tot si té una adreça unicast IPv6, només sortirà en IPv6 si hi ha un registre DNS de tipus A, i en aquest cas s'utilitzarà IPv4. Per tant, típicament, només utilitzaran Teredo les URLs amb una adreça IPv6 literal. Aquest comportament es pot modificar tocant una clau del registre.
* Miredo és un client, relleu i servidor per a Linux, BSD i Mac OS X,
* ng_teredo és un relleu i servidor basat en netgraph per a FreeBSD, de la Universitat LIP6 i 6WIND.
* NICI-Teredo és un relleu per al nucli de Linux i un servidor Teredo que no necessita drets d'administrador, desenvolupats a la Universitat Nacional Chiao Tung.

## Etimologia del nom

El nom inicial del protocol Teredo era shipworm, és a dir, cuc de vaixell. Es refereix als mol·luscos que viuen en forats a la fusta dels vaixells i els fan malbé. La idea era que el protocol foradaria els dispositius NAT igual que aquests mol·luscos ho fan amb la fusta. No són animals gaire apreciats, però Christian Huitema, a l'esborrany original escrivia que "l'animal només sobreviu en aigües relativament netes i no contaminades; el fet que es torni a veure en alguns ports nord-americans és testimoni de la recuperació de la netedat. De manera similar, foradant els NATs, el servei contribuiria a una transparència recuperada a Internet".
De seguida, però, Christian Huitema va modificar el nom a Teredo per evitar confusions amb els cucs informàtics. Teredo navalis és el nom científic d'una de les espècies de cuc de vaixell més conegudes.

## Referències

* ↑ RFC 4380, punts 3.2.3 i 5.3
* ↑ Levy, Martin. «Hurricane Electric's experience in deploying Teredo and 6to4 relays». LACNIC-XII/FLIP6 2009 Conference, Panama City, Panama, 28-05-2009. Arxivat de l'original el 2011-09-27. [Consulta: 15 octubre 2011].
* ↑ Gont, Fernando. «Internet-Draft - Teredo routing loops - Mitigating Teredo Rooting Loop Attacks» p. 2. ietf.org, 08-09-2010.
* ↑ «Testing Teredo» (en anglès). [Consulta: 16 octubre 2011].
* ↑ Kabassanov, Konstantin; Jardin, Vincent. (22 d'octubre de 2003). ...Teredo for FreeBSD.... Arxivat 2005-03-06 a Wayback Machine. www-rp.lip6.fr.
* ↑ "Solomon, Aaron". (29 de novembre de 2004). NICI-Teredo. Sourceforge.
* ↑ Huitema, Christian. «(ngtrans) Renaming Shipworm as Teredo?». IETF ngtrans wg mailing list, 19-12-2001.

## Enllaços externs

* Resum de Teredo a Microsoft TechNet
* Teredo relays: llist de relleus Teredo a BGPmon.net
* TEREDO-MNT: llista d'operadors que anuncien el prefix Teredo via BGP
* Llist de servidors Teredo Arxivat 2006-10-26 a Wayback Machine. mantinguda per SixXS
* Teredo: Tunneling IPv6 over UDP through Network Address Translations (NATs). RFC 4380, C. Huitema. February 2006.