Creando una NAT 1:1 con iptables

Creando una NAT 1:1 con iptables

Estoy tratando de aprender un poco sobre las traducciones NAT en Linux, pero no he visto ninguna prueba de concepto que se haya reducido a lo más básico posible.

De todos modos. Aquí hay un dibujo de mi configuración:

red simple con dos subredes

Tengo un enrutador muy básico para Internet. Básicamente sólo puede hacer 2 cosas:

  • Establece una conexión a Internet.
  • Dirección IP del folleto solo en 1 subred.

Élno puedohacer enrutamiento estático en absoluto.

... ¡y ni siquiera sabe cómo es una dirección IPv6! (¡En serio!)

Lo que quiero es poder conectarme a Internet desde Raspberry 3, pero también poder conectarme desde My Computerél Raspberry 3o cualquier otro dispositivo en la otra subred.

Eso me dio la idea de implementar una NAT 1:1 en mi Raspberry 4, donde todas las direcciones IP del rango 192.168.10.x/24 se traducen al rango 192.168.1.x/24.

De esa manera, al menos desde el punto de vista de mi enrutador, parece que todos los hosts de la red pertenecen a la misma subred, ya que el grupo de direcciones de 192.168.0.0/23 es de 192.168.0.0 a 192.168.1.255.

¿Pero cómo hacerlo?

¿Es suficiente simplemente agregar dos reglas a iptables en raspberry 4 como:

iptables -t nat -A PREROUTING -d 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

¿O necesito ser un poco más explícito acerca de la dirección de los paquetes IP?

Actualizar:

Para ayudar con la resolución de problemas, puedo informar que Raspberry 4 actúa como servidor DHCP para mis dos subredes.

Se anuncia a sí mismo como el primer salto al realizar un rastreo de ruta desde cualquier máquina a Internet, en cualquiera de las redes.

Un traceroute desde My computerdigamos que Google mostrará algo como:

  • 1: frambuesa 4
  • 2: enrutador primitivo
  • 3: puerta de enlace del ISP
  • 4: ...
  • ...
  • n: google.com

Sin embargo, traceroute falla cuando se realiza desde mi archivo Raspberry 3.

El primer salto será el Raspberry 4, así que no hay sorpresa, pero la ruta no dará respuesta al ping, ya que no sabe cómo llegar a la subred 192.168.10.0/24.

Para su información, Raspberry 4ya actúo como un cliente VPN de sitio a sitio, por lo que si todo lo demás falla, entonces puedo hacer enrutamiento basado en fuentes y enviar todo el tráfico a través de mi conexión VPN, aunque con una penalización de velocidad significativa (alrededor del 70 % de la velocidad). gota).

Actualización 2:

Salida de Raspberry 4:

# ip rule show

0:      from all lookup local
32766:  from all lookup main
32767:  from all lookup default

# ip route show table main

default via 192.168.0.1 dev eth0 src 192.168.0.136 metric 202
192.168.0.0/23 dev eth0 proto dhcp scope link src 192.168.0.136 metric 202
192.168.100.0/24 dev tun-ipv6 proto kernel scope link src 192.168.100.10
  • El enrutador reside en 192.168.0.1.
  • La subred 192.168.100.0/24 está dentro de mi VPN.

Esa parte funciona bien ya que no tengo intenciones de enviar todo el tráfico a través de mi VPN.

Es trivial para mí crear una nueva tabla de enrutamiento para redirigir desde 192.168.10.0/24 a través de VPN, ya que ya hice ese truco en particular una vez antes para usar IPv6 en mi LAN local. :-)

Sin embargo, la solución de Tom Yan se parece bastante a lo que yo buscaba, en particular su sugerencia sobre "AnyIP". :-)

Necesito hacer algunas pruebas, pero aceptaré su respuesta. :-)

Respuesta1

En primer lugar, la NAT de origen debería ser:

iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j NETMAP --to 192.168.1.0/24

( POSTROUTINGcon una -scerilla)

y el NAT de destino debe ser:

iptables -t nat -A PREROUTING -d 192.168.1.0/24 -j NETMAP --to 192.168.10.0/24

( PREROUTINGcon una -dcerilla)

Nota: AFAIK, la regla NAT de destino solo es necesaria para el tráfico "NUEVO" (desde dentro de la LAN). La regla NAT de origen es suficiente para el tráfico de retorno, ya que la NAT de destino para cualquiera de ellos está "implícita" en ella.

Pero luego está el problema: ¿cómo se My Computersabe Primitive Routerque el tráfico 192.168.1.0/24(que en realidad es 192.168.10.0/24) debe dirigirse Raspberry Pi 4a un enrutamiento adicional?

La respuesta es que debe Raspberry Pi 4responder a las solicitudes ARP de 192.168.1.0/24.

Una de las formas de lograrlo es configurar algo llamado "AnyIP" (al menos ese es el término que he oído hablar). Básicamente, eso significa agregar una ruta de subred de tipo localpara 192.168.1.0/24:

ip r add local 192.168.1.0/24 dev eth0

Nota: No recuerdo exactamente si esto funcionaría con arp_ignoresysctl configurado en, por ejemplo 1, .

Asegúrese de habilitar el reenvío de IP (v4) con sysctl y de que ningún firewall Raspberry Pi 4bloquee el reenvío del tráfico que desee (según una regla o la política de cadena).

Respuesta2

Estoy tratando de aprender un poco sobre las traducciones NAT en Linux, pero no he visto ninguna prueba de concepto que se haya reducido a lo más básico posible.

Aquí está mi script lo más básico posible que uso en mi PC de escritorio para "compartir Internet" cuando conecto otro dispositivo a través de LAN:

#!/bin/bash

# masquerade $1 (e.g. eth0, ppp0) as $2 (default wlan0)

INTIF="$1"
EXTIF=${2:-wlan0}

echo $INTIF $EXTIF

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT 
iptables -P FORWARD DROP
iptables -F FORWARD 
iptables -t nat -F
iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT
iptables -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE

Debes llamarlo con la interfaz "interna" (la red con clientes que necesitan NAT) y la interfaz "externa" (hacia internet). La configuración de la interfaz interna, DHCP, etc. no está incluida (solo preguntaba sobre NAT).

Eso me dio la idea de implementar una NAT 1:1 en mi Raspberry 4, donde todas las direcciones IP del rango 192.168.10.x/24 se traducen al rango 192.168.1.x/24.

Eso es mucho más difícil que la "NAT básica".

Pero no es necesario que haga eso y, de hecho, no funcionaría bien con su combinación primitiva de enrutador/Raspberry Pi 4. En su lugar, simplemente haga NAT básica en Raspberry Pi 4. Esto significará que todo en 192.168.10.*/24 será NAT a 192.168.0.0, y el enrutador lo entenderá perfectamente.

(Y en la vida real, simplemente conectaría los dos conmutadores y tendría una única subred proporcionada desde su enrutador. Por cierto, si su enrutador primitivo puede actualizarse con OpenWRT, etc., también podrá hacerlo, bueno, enrutamiento).

Respuesta3

No, agregar las reglas NAT no es suficiente. Porque el descubrimiento de hosts IPv4 en la red local (segmento de transmisión) funciona mediante ARP. El tráfico de transmisión de ARP no cruzaría su caja NAT interna y la caja NAT tampoco respondería. Para que responda necesitas proxy_arp.

Sin embargo, no está claro qué se lograría con este tipo de configuración. Simplemente coloque todo en una red o agregue rutas a las PC (en lugar del enrutador) y ENMASCARÉ solo al enrutador externo.

información relacionada