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:
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 3
o 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 computer
digamos 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 4
ya 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
( POSTROUTING
con una -s
cerilla)
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
( PREROUTING
con una -d
cerilla)
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 Computer
sabe Primitive Router
que el tráfico 192.168.1.0/24
(que en realidad es 192.168.10.0/24
) debe dirigirse Raspberry Pi 4
a un enrutamiento adicional?
La respuesta es que debe Raspberry Pi 4
responder 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 local
para 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_ignore
sysctl 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 4
bloquee 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.