Permitir solo cierto tráfico saliente en ciertas interfaces

15

Tengo un problema bastante extraño. Tengo un servidor con dos interfaces de red eth0y eth1. Cada uno está conectado a una red diferente. Cada red tiene un portal de internet. El servidor tiene varias conexiones salientes : http (algunos scripts en los sitios web de raspado del servidor), cliente nfs, cliente samba, cliente dns y un buscador de correo electrónico para nombrar solo algunos.

Por razones por las que no voy a entrar, necesito dividir estos clientes salientes para que el tráfico saliente http, nfs, samba y dns solo se solicite eth0mientras todo lo demás pasa eth1.

He leído algunas búsquedas en Google y parece que iptableses lo que necesitaré, pero realmente no tengo ni idea. Solo estoy acostumbrado a administrar las reglas de firewall entrantes ufw.

¿Alguien podría comenzar con algunas reglas de ejemplo y decirme cómo hacer que el sistema adopte estas reglas en el arranque? Idealmente sin bloquear mi conexión SSH ( puedo obtener acceso físico, pero prefiero no hacerlo).

Editar Puedo dividir los clientes en dos usuarios si es posible limitar todo el tráfico saliente de una cuenta a una interfaz. en papel que parece que podría ser más fácil.

Oli
fuente

Respuestas:

12

Instalaría una tabla de enrutamiento separada y una política para enrutar paquetes marcados usando esa tabla y hacer que iptables / netfilter marque ciertos paquetes.

Crea una tabla: echo 1 known >> /etc/iproute2/rt_tables

Cree una regla de enrutamiento (el ipcomando es de iproute2 ): ip rule add from all fwmark 1 table known

Creamos una tabla llamada "conocida" y creamos una regla de enrutamiento que dice que cualquier paquete con una marca igual a 1 se enruta de acuerdo con la tabla "conocida". Solo lo llamé conocido porque es para la lista de protocolos conocidos; puedes nombrarlo como quieras. Ahora configuramos la tabla conocida para enrutar el camino correcto.

ip route add default dev eth0 table known

Crear reglas de iptables:

iptables -t mangle -I PREROUTING -p tcp --dport 111 -j MARK --set-mark 1
iptables -t mangle -I PREROUTING -p tcp --dport 2049 -j MARK --set-mark 1

El ejemplo marca los paquetes en los puertos NFS (111, 2049) con un 1. Estamos agregando esta regla al iptable 'mangle'. Esto es diferente de las tablas de enrutamiento y no se puede cambiar; la tabla mangle es específicamente para alterar paquetes de cualquier otra manera que no sea NAT.

Ahora, para enrutar todo lo demás a través de la otra interfaz, agregamos una ruta a la tabla de enrutamiento estándar.

ip route add default dev eth1

Para comprender realmente esto, lea las secciones 4 y 11 del tutorial de LARTC .

Shawn J. Goff
fuente
Bueno, eso es mucho más simple de lo que temía. La pila de red de Linux realmente es una bestia hermosa, ¿no? Le di a esto una prueba rápida y todo parece funcionar como se esperaba. Estoy monitoreando cada interfaz a través de iftopy cada una muestra el tipo correcto de tráfico. Muchas gracias.
Oli
No sé cómo iptables o iproute2 almacenan su configuración. ¿Tengo que disparar estas reglas en cada arranque?
Oli
@Oli Se borran cuando reinicias. Puede guardar y restaurar las reglas con iptables-savey iptables-restore. Si está utilizando NetworkManager, puede configurar scripts de despachador para automatizar el proceso. Desafortunadamente, la página oficial de NM no tiene documentación sobre la característica, pero la documentación de Ubuntu y Arch Linux la menciona.
Shawn J. Goff
5

Bueno, la forma " más fácil " debería ser instruir a los programas individuales para que usen una interfaz específica (o la ip de la interfaz. Por ejemplo:

ping -I eth1 8.8.8.8

indica a ping que use eth1 como interfaz de origen, mientras que

wget --bind-address 10.0.0.1 http://www.google.it/

indica a wget que pase por la interfaz que tiene 10.0.0.1como dirección IP.

Honestamente, no sé si es posible con todos los programas que necesita, pero es un comienzo para recortar las reglas para las que necesita escribir iptablesy los iprouteprogramas.

Para empezar, debería leer este tutorial sobre múltiples conexiones a Internet . Una buena lectura es también uno de los miles de tutoriales de iptables, EXPECIALLY en outbound filtering, process/ pid filteringy port filtering.

Señor shunz
fuente
4

La forma correcta de hacerlo es vincular () a la interfaz que desea utilizar para los paquetes salientes. Desde entonces, puede configurar rutas con los comandos ip routey ip rulepara controlar cómo se enrutan los paquetes en función de su interfaz de salida. Para mi ejemplo, asumiré la siguiente red:

  • eth0:
    • Dirección: 192.168.0.2/24
    • Gateway predeterminado: 192.168.0.1
  • eth1:
    • Dirección: 192.168.1.2/24
    • Gateway predeterminado: 192.168.1.1

Crearé dos tablas de enrutamiento, una para el tráfico saliente para eth0 llamado alternativo y una tabla para eth1 llamada main. La tabla principal de enrutamiento siempre existe y es la tabla normal que utilizan los comandos routey ip route. La mayoría de la gente nunca trata con otras mesas. Para crear la tabla llamada alternativa, agregaremos la siguiente línea a /etc/iproute2/rt_tables:

10    alternate

La tabla main tiene una prioridad predeterminada de 254. El ip rulecomando controla las reglas para las cuales la tabla de enrutamiento está vigente . De manera predeterminada, ese comando imprimirá una lista de reglas existentes que deberían verse así:

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

Básicamente, esto dice que buscará una ruta en la tabla, localque es una tabla especial mantenida por el núcleo para rutas locales, como mi propia dirección IP. Luego intentará la tabla principal y la tabla predeterminada. La tabla predeterminada normalmente está en blanco, por lo que si no hay coincidencia en main, no hay ruta al host. Primero, vamos a llenar la tabla alternativamente con las reglas para eth0.

sudo ip route add table alternate 192.168.0.0/24 dev eth0
sudo ip route add table alternate 192.168.1.0/24 dev eth1
sudo ip route add table alternate default via 192.168.0.1

Normalmente querrá que la alternatetabla se vea similar a la maintabla. Las únicas diferencias son cuando el enrutamiento debe ser diferente. Es posible que no desee incluir la segunda línea anterior si literalmente desea que todo el tráfico NFS, HTTP, etc. vaya a través de la puerta de enlace predeterminada en eth0, incluso si está destinado a la red en eth1. El siguiente paso es agregar una regla sobre cuándo usar esta tabla de enrutamiento alternativa:

sudo ip rule add from 192.168.0.0/24 pref 10 table alternate

Esta regla dice que cualquier tráfico proveniente de una dirección en la red 192.168.0 usará la alternatetabla de enrutamiento en lugar de la maintabla normal . El último paso es asegurarse de que todos los clientes que deben usar eth0estén vinculados. Con wget, por ejemplo, establecer --bind-address=192.168.0.2, para NFS establecer elclientaddr=192.168.0.2Opción de montaje. Si usa LibWWW con Perl, puede configurar la opción localaddr en LWP :: UserAgent para controlar la interfaz local a la que se une. Si tiene un cliente que no puede controlar, la fuente de enlace y compilación no es una opción, es posible que pueda usar una regla de iptables para modificar su dirección, pero esto es más un truco y puede no funcionar. Necesitaría una regla SNAT establecida en la cadena PREROUTING de la tabla nat o de la tabla mangle. Aún necesitará las tablas de enrutamiento modificadas dadas anteriormente para que esto funcione.

pingüino359
fuente