Отключение rp_filter на одном интерфейсе

9

У меня есть сервер Ubuntu 16.04, который действует как маршрутизатор с несколькими (VLAN) интерфейсами. По умолчанию rp_filter(фильтрация обратного пути) включена для всех интерфейсов. Я хочу, чтобы так было, но сделаю исключение только для одного интерфейса. (Пакеты из этого интерфейса должны иметь исходный IP-адрес, который не соответствует ни одному адресу назначения маршрута этого интерфейса.)

Допустим, у этого интерфейса есть имя ens20.4, его vlan-raw-device ens20и интерфейс назначения (для тестирования потока пакетов) назван ens20.2(хотя он должен работать для любого интерфейса назначения).

Я попытался установить rp_filterсвойство ens20.4только для , но безуспешно:

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

Итак, для целей тестирования я также отключил rp_filtervlan-raw-device и интерфейс назначения тестирования:

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

По-прежнему безуспешно, пакеты с «поддельным» IP-адресом источника по-прежнему отбрасываются. Только если я отключу rp_filterдля всех интерфейсов, пакеты проходят:

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

Однако я все еще хочу сохранить фильтрацию обратного пути для всех остальных интерфейсов - что мне не хватает?

Cybran
источник
Еще одно тестирование показало, что фильтрация обратного пути активна, если rp_filter установлен в 1 для всего или для входящего интерфейса. Тем не менее, все еще ищу точный ответ или ссылку на документацию, которую я пока не смог найти.
Кибран

Ответы:

12

Информация там: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/tree/Documentation/networking/ip-sysctl.txt?h=v4.9#n1090

Обратите внимание на последнее предложение, которое объясняет ваши попытки:

Максимальное значение из conf / {all, interface} / rp_filter используется при проверке источника в {interface}.

Так что это должно работать:

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

Теперь max (conf / {all, ens20.4} / rp_filter == 0: нет проверки исходного кода. Просто дважды проверьте, что другие интерфейсы все еще защищены.

Вы также можете проверить «свободный» rpf со значением 2. В случае, если пакет обычно маршрутизируется другим интерфейсом, это было бы лучше, чем отсутствие проверки.

AB
источник
2
Спасибо, это очень хорошо объясняет! Отдельное спасибо за «свободный» совет rpf, который действительно является лучшим выбором для моей установки. Также избавляет от необходимости устанавливать all / rp_filter в 0, что приветствуется.
Кибран