Enrutamiento del tráfico público ipv6 a través del túnel openvpn

13

Lo que intento hacer es enrutar el tráfico IPv6 a través de un túnel vpn. De esa manera, debería poder usar IPv6 en una red que no sea compatible con IPv6.

Tengo un VPS que tiene un bloque IPv6 asignado. Parte de este bloque que quiero usar para clientes openvpn. El rango que tenía en mente era 2001:db8::111:800:0/112(el prefijo es anónimo), porque openvpn solo admite / 64 y / 112 como subredes.

IPv6 a través del túnel ya está funcionando, desde el cliente, puedo hacer ping al servidor ( 2001:db8::111:800:1), y también a las interfaces en el servidor ( 2001:db8::111:100:100y 2001:db8:216:3dfa:f1d4:81c0).

Sin embargo, cuando intento hacer ping a google.com desde el cliente, no obtengo respuesta (tiempo de espera de ping). Para depurar este problema, he usado tcpdump para capturar el tráfico en el servidor, y puedo ver los paquetes de ping saliendo, pero no hay respuestas que vuelvan. Agregar reglas de registro a ip6tables muestra lo mismo, paquetes saliendo, pero nada entrando.

Utilicé una herramienta de trazado de ruta en línea que obtiene un tiempo de espera de mi servidor. También intenté configurar la ip directamente en la interfaz, lo que hace que se 2001:db8::111:800:1001pueda acceder a la ip ( ), así que creo que este es un problema de enrutamiento.

He habilitado el reenvío para ipv6 a través /proc/sys/net/ipv6/conf/all/forwarding. ip6tables tiene políticas permitidas para todas las cadenas.

Mi pregunta es, ¿qué se necesita exactamente para que Linux acepte ese paquete para una IP que no está asignada a una interfaz y lo enruta más? Solo una ruta que existe no parece suficiente.

Aquí está la configuración para mi cliente y servidor. Hágale saber si se necesita más información.

Cliente

# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1001/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 routes
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2000::/3 dev tun0  metric 1024 

Servidor

# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic 
       valid_lft 86254sec preferred_lft 14254sec
    inet6 2001:db8::111:100:100/128 scope global 
       valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 route
2001:db8::111:100:100 dev eth0  proto kernel  metric 256 
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2001:db8::/64 dev eth0  proto kernel  metric 256  expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0  proto ra  metric 1024  expires 1594sec
Ikke
fuente
Posible que estés buscando POSTROUTING ... MASQUERADEen la natmesa. Pero no estoy seguro de entender por completo. ¿Estás tratando de tunelizar el tráfico IPv6? Si es así, ¿tiene las respectivas instalaciones establecidas? ¿Están -p ipv6permitidos los paquetes en las reglas IPv4 (!)?
0xC0000022L
¿Tiene la configuración de IP del enrutador (en eth0)? ¿Controlas el enrutador? (¿puedes agregar rutas?)
ysdx
Intente usar el TRACEobjetivo de tabla sin formato de iptables (tal vez no tanto aquí) ip neighbour, y ip route get. Además, especifique quién está haciendo ping google.ca.
pilona
Hacer ping a google.com o goole.com.
totti
@totti google.com, fue un error tipográfico
Ikke

Respuestas:

12

Debe indicarle a su enrutador que use su servidor para esta subred VPN: la solución correcta a su problema es agregar una ruta en el enrutador para la subred OpenVPN.

Si no puede hacer esto porque no puede tocar el enrutador, otra solución es configurar un proxy NDP para los clientes en el eth0enlace.

Como está utilizando un VPS, probablemente no pueda agregar rutas al enrutador: probablemente tenga que usar la segunda solución.

Agregar una ruta para la subred

La solución correcta a su problema es decirle al enrutador que la subred VPN debe enrutarse a través del servidor OpenVPN (esto es para Linux):

ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100

Debe habilitar el reenvío de IPv6 en el servidor:

sysctl sys.net.ipv6.conf.all.forwarding=1

Proxy NDP

Parece que el enrutador está configurado para enviar todo su rango de IPv6 en el eth0enlace: puede configurar un proxy NDP.

Debería ver las solicitudes NDP en la eth0interfaz del servidor para su subred OpenVPN cuando intente acceder al resto de Internet desde el cliente.

También debe habilitar el reenvío IPv6 en el servidor y el proxy NDP:

sysctl -w net.ipv6.conf.all.proxy_ndp = 1

subred NDP proxy

El kernel de Linux no permite agregar un proxy NDP para una subred, sino solo para IP individuales. Puede usar un demonio (como ndppd para configurar un proxy NDP para una subred completa (nunca lo usó).

Por proxy IP NDP

Otra solución es agregar un proxy NDP para cada IPv6 de la subred VPN:

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

Esto debería funcionar ya que tiene una cantidad relativamente pequeña de IP en la subred OpenVPN.

Proxy NDP dinámico con ganchos OpenVPN

Debería poder usar enlaces de OpenVPN para agregar dinámicamente el proxy NDP.

Agregar gancho en el servidor OpenVPN conf:

learn-address /etc/openvpn/learn-address

Con el siguiente learn-addressscript:

#!/bin/sh

action="$1"
addr="$2"

case "$action" in
    add | update)
        ip neigh replace proxy "$addr" dev tun0
        ;;
    delete)
        ip neigh del proxy "$addr" dev tun0
        ;;
esac

Ver este hilo .

Respuesta corta

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done
ysdx
fuente
1
Gracias, lo investigaré. Ahora entiendo el problema. ipsidixit.net/2010/03/24/239 contiene más detalles sobre esto.
Ikke
Tengo la ip del cliente como proxy vecino. He habilitado sys.net.ipv6.conf.all.proxy_ndp, pero aún no puedo hacer ping a google.com. Cuando reviso el servidor, veo paquetes de soluciones ndp entrando en eth0, pero no salen anuncios.
Ikke
1
Después de instalar y configurar npd6, ¡de repente funciona!
Ikke