¿Cómo puedo usar Linux como puerta de enlace?


16

NOTA: Si los dispositivos cliente ( computer Ben este ejemplo) desean obtener Internet a través de la computadora de la puerta de enlace, tal vez aún necesiten configurar la resolución del servidor de nombres. Esto no se explica aquí (una puerta de enlace no necesariamente sirve a Internet).

Estoy tratando de entender los fundamentos del enrutamiento de redes.
Así que estoy experimentando con mi LAN (no necesito internet por ahora, solo comunicaciones LAN).

Sé que las cuestiones de configuración de red son bastante complejas, pero solo estoy tratando de hacer que una computadora (digamos A) actúe como puerta de enlace para otra (digamos B) (ambas ejecutan Ubuntu Linux).
Solo necesito que B sea capaz de alcanzar el enrutador, eso solo es accesible para A.

Este es el caso:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

La computadora A se conecta bien al enrutador .
La computadora A y B se conectan bien (ping, SSH ... etc.) entre ellas .
La computadora B no puede alcanzar el enrutador para la computadora A.

Estaba pensando que solo agregando la computadora B A como puerta de enlace predeterminada y activando el reenvío de IP en A haría que B pudiera alcanzar el enrutador para A:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

Y en la computadora A (la puerta de enlace intermedia):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

La computadora B todavía puede hacer ping a la computadora A, pero el enrutador para A no responde:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Sin respuesta de ping)

¿Es este el procedimiento correcto para hacer que una computadora con Linux funcione como una puerta de enlace para otra computadora de una manera simple?

Respuestas:


21

Ya casi está allí, solo necesita asegurarse de que el tráfico regrese a B. En este momento ha reenviado el tráfico de B al mundo exterior, pero A no sabe cómo regresar el tráfico a B. Necesita A para mantener un estado sobre Las conexiones que lo atraviesan. Para hacer esto, querrás habilitar NAT . Ya tienes el primer paso que es permitir el reenvío. Luego debe agregar algunas reglas de firewall con iptables:

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

Esto dice: en la tabla de traducción de direcciones de red, después de haber descubierto el enrutamiento de un paquete en la salida eth0 (la externa), reemplace la información de la dirección de retorno con la nuestra para que los paquetes de retorno nos lleguen. Además, recuerde que hicimos esto (como una tabla de búsqueda que recuerda esta conexión).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Permita que los paquetes que desean provenir de eth1 (la interfaz interna) salgan de eth0 (la interfaz externa).

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Use esa tabla de búsqueda que teníamos antes para ver si el paquete que llega a la interfaz externa pertenece realmente a una conexión que ya se inició desde la interna.


Una explicación concisa, de hecho. ¿Deben ejecutarse todos los bloques de código en la computadora A?
Sopalajo de Arrierez

@SopalajodeArrierez Sí, todos estos están ejecutados en la computadora "gateway". El sistema B no necesita saber nada sobre el enrutamiento que no sea si desea llegar a cualquier otra máquina, envía los paquetes a B (es GW predeterminado).
user1794469

Probado trabajando en Ubuntu v14 en escritorio y Ubuntu v12 en Utilite Pro (un dispositivo integrado de CompuLabs). Muchas gracias por ampliar lo que hace exactamente cada línea. Investigué y encontré muchas explicaciones largas, largas, largas que no funcionaban. Espero que este hilo de preguntas y respuestas pueda ser útil para otros en el futuro.
Sopalajo de Arrierez

@ user1794469 ¿es lo mismo cuando la interfaz de la puerta de enlace es virtual, es decir, una interfaz táctil? ¿Puedes echar un vistazo aquí ?
ram

1

Para que el enrutamiento funcione correctamente entre dos computadoras Linux que actúan como puertas de enlace, hay varias cosas que deben implementarse:

  • Ambas puertas de enlace deben tener un enlace físico entre sí (o virtual si está vinculando máquinas virtuales).
  • Las rutas deben agregarse a ambas interfaces en el enrutador.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • Se debe especificar una puerta de enlace local para la red remota en ambas puertas de enlace. Esto permite que las computadoras en la red local sepan dónde enviar paquetes para la red remota. La puerta de enlace debe ser la dirección IP de la computadora que enviará paquetes a la red remota.

  • Las computadoras que desean enviar tráfico entre las redes también deben ser conscientes de qué puerta de enlace local maneja el tráfico hacia y desde la red remota. Esto generalmente se hace a través del Protocolo de control dinámico de host (DHCP), sin embargo, si tiene la intención de usar una puerta de enlace separada para Internet, deberá especificar tanto en las computadoras que necesitan acceso a Internet como a la otra red (por ejemplo, la puerta de enlace de Internet a través de DHCP y la puerta de enlace de la otra red a través de una ruta).
  • El reenvío de IP debe estar activo para ambas puertas de enlace.
  • El enmascaramiento de IP debe estar habilitado para permitir que NAT funcione entre las puertas de enlace.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Es posible que deba especificar un origen y un destino ya que está utilizando la misma interfaz para enmascarar:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    y la otra puerta de entrada:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Para cada puerta de enlace, el tráfico de la red local debe aceptarse en la interfaz apropiada como esta:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    o

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Existen numerosos enlaces y preguntas similares a las que se puede hacer referencia para resolver los problemas que tiene.

Lo que parece estar mal en este caso particular es que la configuración de ruta y puerta de enlace no está completa en ambas computadoras y la traducción de direcciones de red (NAT) no se ha habilitado usando iptables, lo que permite que las puertas de enlace lleven la solicitud desde una computadora en la otra subred de su parte.

Hacer esto también es fundamental al configurar una conexión a Internet, ya que usted es responsable de un extremo de la conexión (por ejemplo, usar una computadora Linux como puerta de enlace para una conexión PPPoE).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.