¿Usar iptables para reenviar ipv6 a ipv4?

15

Actualmente tengo una configuración en la que, debido a la configuración que tardaría una eternidad en solucionar, tengo un servidor al que solo se puede acceder por ipv4. Sin embargo, también tengo un servidor al que se puede acceder por ipv6. Me preguntaba si podría usar iptables para reenviar tráfico ipv6 en un determinado puerto desde uno de los servidores a otro servidor que use tráfico ipv4.

Eli
fuente
2
Lo que estás buscando se llama NAT64, que no creo que haga iptables (todavía).
Chris S
Chris tiene razón: los RFC NAT64 se acaban de publicar, le daría un tiempo hasta que algo realmente lo respalde. Dicho esto, es posible que pueda lograr su objetivo de una manera diferente, pero no tenemos suficientes detalles para saberlo con certeza. Por ejemplo, si se trata de un servidor HTTP, puede hacer un proxy inverso de las solicitudes entre protocolos.
Shane Madden

Respuestas:

16

IPtables actualmente no puede hacer esto, por lo que necesita un proceso de espacio de usuario para proxy de las conexiones. socat es una herramienta adecuada para esto:

socat TCP6-LISTEN:1234,fork TCP4:1.2.3.4:1234
mgorven
fuente
1
gracias, esto fue útil! En caso de que alguien esté buscando una solución UDP: socat UDP6-RECVFROM: 64444, fork UDP4-SENDTO: localhost: 64443 funcionó para mí
Alexander
10

Como se señaló en los comentarios sobre su pregunta , NAT64 está lejos de estar listo, incluso 3 años después.

Sin embargo, podría intentarlo 6tunnel, como sugiere la perplejidad.

Afortunadamente, está presente en los repositorios de Debian y Ubuntu, por lo que puede instalarlo muy fácilmente sudo apt-get install 6tunnel. Si está utilizando otro sistema, deberá compilarlo desde la fuente .

Construir desde la fuente realmente no es difícil, y solo es cuestión de ejecutar algunos comandos (como root):

git clone https://github.com/wojtekka/6tunnel && cd 6tunnel && ./autogen.sh && make && make install

Aquí está su sintaxis, simplificada:

6tunnel [-4|-6] [-l local-host] original-port destination-host destination-port
  • El [-4|-6]es opcional y le permite especificar si vinculará (escuchará) en IPv4 o IPv6 (respectivamente).
  • -lTambién es opcional. Le permite elegir en qué dirección (IPv4 o IPv6) desea vincular.
  • El puerto original es el puerto en el que se unirá.
  • El host de destino es donde reenviará el tráfico. Puede estar en cualquier lugar: localhost o en otro lugar de su red o en Internet.
  • El puerto de destino es el puerto en el host de destino que recibirá su tráfico reenviado.

Por ejemplo, si desea permitir que se acceda a un servidor solo IPv4, que escucha en el puerto 1337, a través de IPv6, use:

6tunnel -6 1337 localhost 1337

El comando anterior escuchará en el puerto 1337 en IPv6 y reenviará el tráfico al puerto 1337 en la misma máquina a través de IPv4. Luego se ejecutará en segundo plano, por lo que no tiene que preocuparse por eso.

En realidad, debe configurar un trabajo cron para asegurarse de que todavía se esté ejecutando. 6tunnel¡proporciona un ejemplo para su conveniencia! Ejecutarlo en el arranque tampoco debería ser una mala idea.

Para más documentación, ejecute 6tunnel -ho man 6tunnel.

Léo Lam
fuente
¡Publicarlo como nueva respuesta porque editar la respuesta actual por perplejidad cambiaría demasiado, y podría ser rechazado como una edición sugerida!
Léo Lam
5

Las versiones recientes de xinetdtambién pueden escuchar en IPv6 y luego reenviar la conexión a una dirección IPv4.

Una configuración de muestra que escucha las conexiones IPv6 en el puerto 3389 y las reenvía al puerto 3389 de una dirección IPv4 interna:

service rdp_port_forward
{
    flags           = IPv6
    disable         = no
    type            = UNLISTED
    socket_type     = stream
    protocol        = tcp
    user            = nobody
    wait            = no
    redirect        = 10.187.20.42 3389
    port            = 3389
}

Esto puede ser útil en entornos más restringidos, ya que xinetdes probable que se instale con su sistema base o esté disponible en repositorios de proveedores aprobados.

Michael Hampton
fuente
3

Quería comentar sobre la respuesta y voto de Leo Lams, pero no tengo suficiente reputación. Antes que nada: ¡Muchas gracias Leo Lam!

Para cualquiera que se acerque a este hilo: mi ISP cambió mi conexión de IPv4 a IPv6 con Dual Stack Lite, lo que significa que ya no tengo mi propia dirección IPv4. Este fue un problema ya que quiero acceder a mi cámara IP desde cualquier lugar que no sea compatible con IPv6. Para resolver esto probé lo siguiente:

  1. Habilitar IPv6 Forward para el puerto 99 en mi enrutador a mi máquina Ubuntu.
  2. Máquina Ubuntu (red doméstica): sudo 6tunnel -6 99 192.168.178.35 80
  3. vServer Debian con dirección estática IPv4 e IPv6: sudo 6tunnel -4 99 IPV6PREFIXROUTER:IPV6INTERFACEIDUUBUNTUMACHINE 99
  4. vServer Debian: Permitir conexiones TCP entrantes en el puerto 99 en iptables

El prefijo ipv6 se denotó en mi enrutador y la identificación de la interfaz se asignó en el proceso de reenvío de IPv6.

Ahora puedo acceder a la cámara desde cualquier lugar utilizando el dominio vServer example.com:99 .. ¡Perfecto! Planeo obtener una frambuesa que cumpla este trabajo o un plátano pi m3 para otras tareas también.

Crumar
fuente
1
Ahora sabe qué hacer cuando necesita otra cámara IP. Es 2015; comprar uno que no sea compatible con IPv6 es una completa pérdida de dinero.
Michael Hampton
no es como si la cámara
tuviera
2

Más para el beneficio de las personas que encuentran esta página que el OP necesariamente (vine aquí buscando una solución para la conectividad IPv6 para una aplicación IPv4 (Twisted)), una posibilidad es la aplicación 6tunnel, escucha IPv6 y reenvía solicitudes a otra interfaz y Puerto.

perplejidad
fuente