múltiples interfaces físicas con IP en la misma subred

13

Tengo una caja de Linux con 9 NIC, y quiero que ocho tengan direcciones únicas en la misma subred, por ejemplo:

ifconfig eth1 192.168.123.1 netmask 255.255.0.0
ifconfig eth2 192.168.123.2 netmask 255.255.0.0
ifconfig eth3 192.168.123.3 netmask 255.255.0.0
...
ifconfig eth8 192.168.123.8 netmask 255.255.0.0

El comportamiento predeterminado de ARP es extremadamente contraproducente en este caso, ya que resulta en todo el tráfico para todas las IP que pasan exclusivamente eth1, que es casi exactamente lo contrario de lo que quiero.

Así que rebusqué y terminé haciendo algunos cambios en sysctl como este:

net.ipv4.conf.all.arp_filter=1
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

Eso impidió eth1hacerse pasar por todos los demás, pero aún así no puedo hacer ping a otra cosa que no sea eth1la dirección de éxito. (por ejemplo, desde una segunda computadora en el mismo conmutador, solo 192.168.123.1responde al ping)

Supongo que necesito hacer algo con arptables o iproute o ALGO, pero estoy perdido en el mar en este campo.

Puntos de bonificación: la solución debe ser compatible con Linux 2.6.27.27. (Más específicamente, Slax 6.1.2)

frustrated_tester
fuente
¿Puedes publicar la tabla de enrutamiento?
ponsfonze
2
¿Cuál es su propósito al crear esta configuración? ¿Qué estás tratando de lograr?
David Schwartz
de esta manera yace la locura.
Sirex
si desea vincular estas interfaces, tendrá que vincularlas realmente.
resmon6
1
@DavidSchwartz No, se supone que la máquina no debe actuar como un interruptor (o enrutador). Piense que es más como correr 8 máquinas virtuales con una tarjeta de red física dedicada para cada máquina virtual ( Nota: estoy no máquinas virtuales en ejecución, esto es sólo una analogía ). Desde el punto de vista de otra caja en la misma red, mi PC individual debe ser completamente indistinguible de ocho PC discretas.
frustrated_tester

Respuestas:

17

Necesita un modelo de sistema final fuerte . Linux se basa fundamentalmente en un modelo de sistema de envío débil, por lo que realmente no es una buena opción de sistema operativo para esta aplicación.

Tendrá que fingir cada parte del comportamiento que necesita, desde ARP hasta el enrutamiento de políticas y la selección de la dirección de origen. También necesitará filtros para evitar que se acepten paquetes si llegan a la interfaz incorrecta.

Los pasos definitivamente necesarios son:

  1. Configure arp_filter = 1 y arp_ignore = 2 en todas las interfaces.

  2. Agregue enrutamiento basado en la fuente por interfaz para el tráfico saliente. (La interfaz de destino debe elegirse en función de la dirección de origen).

  3. Agregue el filtrado de ingreso por interfaz para descartar silenciosamente los paquetes recibidos en la interfaz incorrecta. (Paquetes con una dirección de destino asignada a otra interfaz).

Desafortunadamente, no hay consenso sobre si estos tres pasos son todo lo que se necesita. El modelo de sistema de extremo débil está integrado en toda la pila de TCP / IP de Linux, y no está claro qué podría salir mal con problemas sutiles como la multidifusión.

No está claro cómo elegiría la interfaz de salida para las transmisiones, por ejemplo. ¿Debería salir a todos ellos? Tal vez. ¿Cuál es el comportamiento correcto si la pila recibe una transmisión saliente con una dirección de origen no asignada a una de las interfaces?

Una vez más, ha elegido la herramienta incorrecta para el trabajo.

David Schwartz
fuente
6

Es más probable que desee crear un puente con las interfaces 8/9 y luego asignar una dirección IP a ese puente (paquete bridge-utils, comando 'brctl add').

De esta manera, el puente actuará como un interruptor y puede tener una dirección IP en su subred.

Be2eB
fuente
AFAIK, esta debería ser la respuesta correcta para Linux. Linux resuelve muchos de los problemas mencionados en la respuesta de David mediante el uso de dispositivos puente (también conocido como evitar problemas L3 mediante la construcción de una mejor red lógica L2).
Dave
4

Recomendaría unir las interfaces físicas y luego configurar todas las direcciones en la interfaz unida.

También necesitará soporte en el conmutador.

Aquí hay un mini tutorial que puede usar para comenzar.

bahamat
fuente
4

Parece que quiere un entorno de prueba equivalente a 9 máquinas separadas, y cree que 9 interfaces en una máquina podrían emular eso. En Linux simplemente no puede hacer esto a través de una sola pila por las razones que describió David Schwartz. BTDT y tiene las cicatrices. Ya era bastante malo con 2 interfaces.

Una mejor solución podría ser ejecutar 8 o 9 máquinas virtuales discretas en su único host, y unir 8 o 9 interfaces a estas máquinas virtuales.

Skaperen
fuente
Recursos de lectura: Programación en red Unix: API de redes de sockets, por Stevens, Fenner y Rudoff. Ver también RFC1122 y RFC4907.
Skaperen
0

Sí, es posible siguiendo la sugerencia de David Schwartz:

echo -ne 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter
echo -ne 0 > /proc/sys/net/ipv4/conf/eth3/rp_filter

// Para una funcionalidad adecuada, es decir, las respuestas ARP de eth1 se generan cuando eth0 y eth1 están en la misma subred

echo -ne 0 > /proc/sys/net/ipv4/conf/all/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth0/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth0/arp_ignore
echo -ne 0 > /proc/sys/net/ipv4/conf/eth1/arp_filter
echo -ne 2 > /proc/sys/net/ipv4/conf/eth1/arp_ignore

//Create a table called "new_rt_table" and create a routing rule that says any packet with a mark equal to '1' gets routed according to the "new_rt_table"(can name it whatever you want) table. The file /etc/iproute2/rt_tables is the only source of table names on the system. Internally, routing tables have integer identifiers.

echo 1 new_rt_table >> /etc/iproute2/rt_tables
ip rule add from all fwmark 1 table new_rt_table

// configura la tabla "new_rt_table" para enrutar los paquetes a través de eth1

ip route add default dev eth1 table new_rt_table
ip route show table new_rt_table

// marca los paquetes para que 'ip route' pueda enrutarlo a través de eth1

iptables -F -t mangle
iptables -t mangle -I OUTPUT -s <ip addr of eth1> -o eth0 -j MARK --set-mark 1

// habilita el soporte para múltiples tablas de enrutamiento en la configuración del kernel.

Configuración del kernel

→ Soporte de red → Opciones de red

[*] IP: enrutador avanzado

[*] IP: enrutamiento de políticas

CONFIG_IP_ADVANCED_ROUTER

CONFIG_IP_MULTIPLE_TABLES

// los pasos anteriores redirigen los paquetes destinados a salir de eth0 para salir correctamente de eth1.

Sugiera amablemente cualquier otro método si alguien lo hace funcionar.

noel av
fuente