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ó eth1
hacerse pasar por todos los demás, pero aún así no puedo hacer ping a otra cosa que no sea eth1
la dirección de éxito. (por ejemplo, desde una segunda computadora en el mismo conmutador, solo 192.168.123.1
responde 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)
fuente
Respuestas:
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:
Configure arp_filter = 1 y arp_ignore = 2 en todas las interfaces.
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).
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.
fuente
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.
fuente
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.
fuente
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.
fuente
Sí, es posible siguiendo la sugerencia de David Schwartz:
// Para una funcionalidad adecuada, es decir, las respuestas ARP de eth1 se generan cuando eth0 y eth1 están en la misma subred
// configura la tabla "new_rt_table" para enrutar los paquetes a través de eth1
// marca los paquetes para que 'ip route' pueda enrutarlo a través de eth1
// 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.
fuente