GNU/Linux como router: Reenvío de paquetes y NAT

per Victor Carceler darrera modificació 2023-10-01T18:24:42+02:00

Suponga de un modo no totalmente hipotético que necesita preparar un host con GNU/Linux para que haga de router en una red. Claro está que sobre este asunto hay mucho que decir, pero aquí se va a tratar un caso de lo más corriente que sucede en las clases prácticas.

La cuestión es que se debe proporcionar acceso a la red a una MV que se encuentra en una red privada a través de un host que conecta la red privada con la red del aula.

Por ejemplo:

esquema-gateway-nat.png

En este caso se han preparado dos máquinas virtuales:

  • La primera (MV1 Gateway) con dos interfaces de red:
    • enp0s3 en modo puente y conectada a la LAN del aula.
    • enp0s8 en modo red interna.
  • La segunda (MV Cliente) únicamente tiene una interfaz de red en modo red interna.

Resulta evidente que la segunda máquina virtual necesitará utilizar a la primera como puerta de enlace para acceder al exterior de su propia red interna.

Pues bien, para que MV1 Gateway actúe como puerta de enlace es necesario:

  1. Activar el reenvío de paquetes.
  2. Activar el NAT en la interfaz enp0s3.

Activar el reenvío de paquetes.

En el núcleo Linux el fichero/proc/sys/net/ipv4/ip_forwardsirve para:

  1. Consultar el estado del reenvío de paquetes.
    usuario@laika:~$ cat /proc/sys/net/ipv4/ip_forward
    0
    usuario@laika:~$
  2. Activar o desactivar el reenvío de paquetes.
    root@laika:/home/usuario# echo 1 >/proc/sys/net/ipv4/ip_forward
    root@laika:/home/usuario# cat /proc/sys/net/ipv4/ip_forward
    1
    root@laika:/home/usuario#

Cuando el fichero contiene el valor 1 está activo el reenvío de paquetes y el host aceptará trabajar como gateway para otros equipos. Si se fija el valor de /proc/sys/net/ipv4/ip_forward con el comando echo, cuando se reinicie el equipo se volverá al estado por defecto.

Si se quiere hacer persistente el cambio entonces será necesario descomentar la siguiente línea del fichero /etc/sysctl.conf:

#net.ipv4.ip_forward=1

Y utilizar el comando sysctl -p para aplicar los cambios o reiniciar el equipo.

Activar el NAT en la interfaz enp0s3

Con el paso anterior se consigue que la MV1 retransmita el tráfico de la MV2. Pero en general la MV2 aún no tendrá una buena conexión al exterior y la cuestión es que, al utilizar una dirección de red privada, quien reciba sus paquetes no sabrá a quién debe contestar. Para solucionar este problema se necesita hacer NAT en la interfaz enp0s3 de MV1 Gateway.

Así cuando se retransmita tráfico a través de MV1 Gateway, en el momento de dejar los paquetes en su interfaz de salida (enp0s3) se cambiará en el paquete la dirección de origen (inicialmente la de MV2 Cliente) para utilizar como dirección de origen la propia IP que tenga enp0s3 en MV1 Gateway. De este modo quien reciba el paquete sabrá a quien contestar y, MV1 Gateway, tratará la respuesta de la manera adecuada para que acabe llegando al origen del tráfico (MV2 Cliente).

La regla para activar un NAT de tipo MASQUERADE en la interfaz de red enp0s3 es:

iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

Más información: