Deshabilitar rp_filter en una interfaz

9

Tengo un servidor Ubuntu 16.04 que actúa como un enrutador con múltiples interfaces (VLAN). De forma predeterminada, rp_filter(filtrado de ruta inversa) está habilitado para todas las interfaces. Quiero mantenerlo así, pero hacer una excepción para exactamente una interfaz. (Se debe permitir que los paquetes de esta interfaz tengan una dirección IP de origen que no se corresponda con ninguna dirección de destino de enrutamiento de esta interfaz).

Digamos que esta interfaz tiene el nombre ens20.4, su vlan-raw-device es ens20, y se nombra la interfaz de destino (para probar el flujo de paquetes) ens20.2(aunque debería funcionar para cualquier interfaz de destino).

Traté de establecer la rp_filterpropiedad ens20.4solo, sin éxito:

echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Entonces, para fines de prueba, también desactivé rp_filterel dispositivo vlan-raw-device y la interfaz de destino de prueba:

echo 0 > /proc/sys/net/ipv4/conf/ens20/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.2/rp_filter

Aún sin éxito, los paquetes con una dirección IP de origen "falsificada" todavía se descartan. Solo si desactivo rp_filterpara todas las interfaces, los paquetes pasan a través de:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter

Sin embargo, todavía quiero mantener el filtro de ruta inversa para todas las demás interfaces, ¿qué me estoy perdiendo?

Cybran
fuente
Algunas pruebas más revelaron que el filtrado de ruta inversa está activo si rp_filter se establece en 1 para todas o la interfaz entrante. Sin embargo, todavía estoy buscando una respuesta definitiva o una referencia de documentación, que no pude encontrar hasta ahora.
Cybran

Respuestas:

12

Información allí: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

Tenga en cuenta la última oración que explicaría sus intentos:

El valor máximo de conf / {all, interface} / rp_filter se usa al validar la fuente en la {interface}.

Entonces esto debería funcionar:

for i in /proc/sys/net/ipv4/conf/*/rp_filter; do
    echo 1 > "$i"
done
echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens20.4/rp_filter

Ahora max (conf / {all, ens20.4} / rp_filter == 0: sin validación de fuente. Simplemente verifique que las otras interfaces todavía estén protegidas.

También puede verificar el rpf "suelto" con el valor 2. En caso de que el paquete normalmente sea enrutado por otra interfaz, sería mejor que ninguna validación.

AB
fuente
2
¡Gracias, eso lo explica muy bien! Un agradecimiento especial por la sugerencia rpf "suelta", que de hecho es la mejor opción para mi configuración. También hace innecesario establecer all / rp_filter en 0, lo cual es bienvenido.
Cybran