Blackhold

NAT64/DNS64

Posted on abril 14th, 2014 by admin

Si quieres implantar una red sólo con IPv6 perfecto! pero nos vamos a encontrar con un pequeño problema, que en internet aún hay mucho contenido que sólo es accesible por IPv4. La solución pasa pues para usar NAT64 y DNS64 para permitir a los hosts IPv6 comunicarse con los hosts IPv4.
El funcionamiento básicamente consiste en crear una cache de DNS (DNS64) que convierte las IPv4 en IPv6 para que los equipos de nuestra red accedan a estos hosts IPv4 con una IPv6 y el NAT64 servirá para acceder a estos hosts IPv4, algo similar a una red local, en la que todos los equipos con una IP de la red 192.168.1.0/24 salen a internet con una única IPv4 pública.

Para el DNS64 vamos a usar bind9 y para NAT64 Tayga.

Lo primero es instalar bind9

root@murzim-dnsnat64:/# apt-get install bind9

Lo siguiente es configurar una IPv6 en nuestro servidor

root@murzim-dnsnat64:~# vi /etc/network/interfaces
iface eth123 inet6 static
        address 2a00:1508:6001::101
        netmask 64
        up ip r add default via 2a00:1508:6001::1 dev eth123
root@murzim-dnsnat64:~# ifconfig eth123
eth123    Link encap:Ethernet  HWaddr 52:33:49:19:ff:35  
          inet addr:5.10.205.131  Bcast:5.10.205.191  Mask:255.255.255.192
          inet6 addr: 2a00:1508:6001::101/64 Scope:Global
          inet6 addr: fe80::5033:49ff:fe19:ff35/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3889 errors:0 dropped:0 overruns:0 frame:0
          TX packets:102 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:195690 (191.1 KiB)  TX bytes:7971 (7.7 KiB)

Ahora dejamos /etc/bind/named.conf.options similar a esto:

options {
        directory "/var/cache/bind";
        auth-nxdomain no;
        listen-on-v6 { any; };
        allow-query { any; };
        dns64 2a00:1508:6001:efff::/96 {
                clients { any; };
        };
};

Si os fijáis estamos usando un /96 del /64 asignado en nuestro equipo.

Ahora lo siguiente es instalar el NAT64, tayga y vtun

root@murzim-dnsnat64:~# apt-get install tayga vtun

Y configuramos tayga

root@murzim-dnsnat64:/etc# vi tayga.conf 
[...]
tun-device nat64
ipv4-addr 192.168.255.1
prefix 2a00:1508:6001:efff::/96
dynamic-pool 192.168.255.0/24
[...]

Ahora vamos a crear un script llamado start64.sh con este contenido (por costumbre los dejo en /root/scripts/

#!/bin/bash
tayga --mktun
ip link set nat64 up
ip addr add 192.168.255.1 dev nat64
ip addr add 2a00:1508:6001::1 dev nat64
ip route add 192.168.255.0/24 dev nat64
ip route add 2a00:1508:6001:efff::/96 dev nat64
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
iptables -t nat -A POSTROUTING -o eth138 -j MASQUERADE
iptables -A FORWARD -i eth138 -o nat64 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i nat64 -o eth138 -j ACCEPT
tayga
/etc/init.d/bind9 start

Si nos fijamos la primera IPv6 que sale es la IP de nuestra máquina (la que será el resoledor de DNS de nuestra red) y la segunda es la IP que hemos definido en bind.

Y lo preparamos para que se ejecute al iniciar la maquina

root@murzim-dnsnat64:~/scripts# chmod +x start64.sh
root@murzim-dnsnat64:~/scripts# vi /etc/rc.local
/root/scripts/start64.sh

Reiniciamos la maquina y todo debería funcionar correctamente.

NOTA: Si estamos instalando el nat64/dns64 dentro de un contenedor openvz será preciso ejecutar esto:

CTID=101
vzctl set $CTID --devnodes net/tun:rw --save
vzctl set $CTID --devices c:10:200:rw --save
vzctl set $CTID --capability net_admin:on --save
vzctl exec $CTID mkdir -p /dev/net
vzctl exec $CTID mknod /dev/net/tun c 10 200
vzctl exec $CTID chmod 600 /dev/net/tun

Y modificamos el fichero /etc/vz/vz.conf y reemplazamos la línea

IPTABLES="ip_tables ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_LOG ipt_conntrack ipt_helper ipt_state iptable_nat ip_nat_ftp ip_nat_irc ipt_TOS"

Y añadimos el modulo ipt_MASQUERADE

# vi /etc/modules
ipt_MASQUERADE

(el módulo este lo cargo a parte, ya que no lo tengo claro que iptables se coma este módulo directamente en el listado de arriba ya que añadiendo el módulo directamente con el siguiente comando no me lo aceptaba)

Ahora ejecutamos lo siguiente para cargar los módulos al arrancar el contenedor

vzctl set 100 --iptables "ip_tables ipt_REJECT ipt_tos ipt_limit ipt_multiport iptable_filter iptable_mangle ipt_TCPMSS ipt_tcpmss ipt_ttl ipt_length ip_conntrack ip_conntrack_ftp ip_conntrack_irc ipt_LOG ipt_conntrack ipt_helper ipt_state iptable_nat ip_nat_ftp ip_nat_irc ipt_TOS" --save

Ahora lo siguiente es poner en un ordenador que sólo tenga IPv6 la IP del servidor DNS64, en este caso 2a00:1508:6001::101.

Teóricamente, ahora ya podríamos salir a internet con ipv6 sólo y debería hacer la traslación, pero al tener IPv4 en el servidor remoto queda pendiente hacer la prueba!

De momento todo lo que puedo probar es esto:

root@centre:/etc/squid3# dig AAAA marsupi.org

; <> DiG 9.8.4-rpz2+rl005.12-P1 <> AAAA marsupi.org
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44417
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 0

;; QUESTION SECTION:
;marsupi.org.			IN	AAAA

;; ANSWER SECTION:
marsupi.org.		5445	IN	AAAA	2a00:1508:6001:ffff::4df6:b69c

;; AUTHORITY SECTION:
marsupi.org.		84644	IN	NS	fermat.blogxpopuli.org.
marsupi.org.		84644	IN	NS	cobalt.marsupi.org.

;; Query time: 7 msec
;; SERVER: 2a00:1508:6001::101#53(2a00:1508:6001::101)
;; WHEN: Mon Apr 14 04:28:34 2014
;; MSG SIZE  rcvd: 111

Pero parece que tengo algún problema de configuración en el router que hace de gateway ya que ping6 me suelta esto:

root@centre:/etc/squid3# ping6 2a00:1508:6001:ffff::4df6:b69c
PING 2a00:1508:6001:ffff::4df6:b69c(2a00:1508:6001:ffff::4df6:b69c) 56 data bytes
From 2a00:1508:6001:ff00::a15 icmp_seq=1 Time exceeded: Hop limit
From 2a00:1508:6001:ff00::a15 icmp_seq=2 Time exceeded: Hop limit
From 2a00:1508:6001:ff00::a15 icmp_seq=3 Time exceeded: Hop limit
From 2a00:1508:6001:ff00::a15 icmp_seq=4 Time exceeded: Hop limit
From 2a00:1508:6001:ff00::a15 icmp_seq=5 Time exceeded: Hop limit
^C
--- 2a00:1508:6001:ffff::4df6:b69c ping statistics ---
5 packets transmitted, 0 received, +5 errors, 100% packet loss, time 4006ms

Fuente: ipvsix.me

Actualización: Para que el sistema funcione, la máquina dónde esté instalado el NAT64 tiene que ser el GW de la red que queremos que salga a internet a buscar las IPv4!!!

Para verificar que funciona:

root@nat64:~/scripts# ping6 2a00:1508:6000:efff::8.8.8.8
PING 2a00:1508:6000:efff::8.8.8.8(2a00:1508:6000:efff::808:808) 56 data bytes
64 bytes from 2a00:1508:6000:efff::808:808: icmp_seq=1 ttl=40 time=38.3 ms
64 bytes from 2a00:1508:6000:efff::808:808: icmp_seq=2 ttl=40 time=37.8 ms
64 bytes from 2a00:1508:6000:efff::808:808: icmp_seq=3 ttl=40 time=38.3 ms
^C
--- 2a00:1508:6000:efff::8.8.8.8 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2003ms
rtt min/avg/max/mdev = 37.857/38.159/38.316/0.213 ms

This entry was posted on dilluns, abril 14th, 2014 at 04:06 and is filed under IPv6, Linux. You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

« »

guy fawkes