Esto podría considerarse una continuación de this earlier SO question.Linux: ¿Cómo forzar el uso de una interfaz de red específica?
Idealmente, me gustaría encarcelar un proceso para utilizar solo una determinada interfaz, sin importar qué. Hará conexiones TCP, enviará datagramas UDP y escuchará las transmisiones UDP. Actualmente, lo que estoy haciendo es:
- Determine la IP de la interfaz a usar.
- Crear una regla de política de propiedad intelectual para enrutar todos los paquetes procedentes de la interfaz a ese IP
- crear otra regla de política de propiedad intelectual para enrutar todos los paquetes que llegan desde esa IP a la interfaz de
- configurar una tabla de enrutamiento por defecto para cada regla
Ahora, esto funciona, en su mayoría, pero el proceso del cliente también debe estar dispuesto a seguirle el juego. Es decir, debe vincularse a la dirección IP específica de la interfaz que desea usar, y creo que también debo configurar SO_BINDTODEVICE
. (Sin embargo, sigo leyendo información contradictoria sobre si SO_BINDTODEVICE
realmente funciona cuando uso TCP o UDP.) Afortunadamente, la aplicación cliente es Python, y puedo extender la clase socket para hacer todo esto de forma transparente. Pero no estoy seguro de que sea una solución completa, especialmente con respecto a la recepción de transmisiones.
Mis preguntas son:
¿Se
SO_BINDTODEVICE
hacer lo que quiero aquí? ¿O solo es efectivo para tomas sin procesar? Alguien comentó que "SO_BINDTODEVICE
en un zócalo no garantiza que el zócalo solo reciba los paquetes que llegaron a la antena/cable de esa interfaz física". Si esto es cierto, entonces ¿qué haceSO_BINDTODEVICE
do?¿Hay alguna manera de hacer esto para que la IP local no tenga que ser única? Esto no sería un problema más que el hecho de que el servidor DHCP en una interfaz puede asignarle una IP que está siendo utilizada por otra interfaz, confundiendo así la tabla de enrutamiento.
¿Cómo recibo transmisiones solo desde una interfaz específica? La vinculación a una IP específica parece hacer que ignore las transmisiones, lo que tiene sentido, pero no es exactamente lo que estoy buscando.
Funciono en Ubuntu 8.04 con Linux kernel 2.6.26. Ser capaz de acceder a la misma subred en dos redes diferentes a través de dos interfaces diferentes simultáneamente es un requisito no negociable, por lo que es (en su mayoría) inmune a "no hacer eso". :)
No existe un equivalente de IPv6 para la variable sysctl 'net.ipv4.conf.all.rp_filter'; sin embargo, la funcionalidad correspondiente existe en la forma del módulo 'rpfilter' para netfilter. Está documentado en la página de comando man [iptables-extensions] (http://ipset.netfilter.org/iptables-extensions.man.html). [Moviendo rp_filter a netfilter] (http://www.strlen.de/talks/rpfilter.pdf) observa que es posible que 'rp_filter' sea eliminado del código de caché de enrutamiento completamente en un núcleo futuro. –