Назад | Перейти на главную страницу

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

У меня есть сервер 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_filter для vlan-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

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

Информация там: 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. Если пакет обычно должен маршрутизироваться другим интерфейсом, это лучше, чем отсутствие проверки.