// DevOps
Что такое rp_filter и для чего он нужен?
Опубликовано 22.09.2026
В мире Linux и сетевых технологий существует множество неочевидных, но критически важных настроек ядра. Одна из таких настроек — rp_filter. Этот параметр, часто остающийся без внимания, играет ключевую роль в сетевой безопасности и корректной маршрутизации пакетов. Давайте разберемся, что это такое, как он работает и почему его понимание важно для каждого системного администратора.
Что такое rp_filter?
rp_filter расшифровывается как Reverse Path Filtering (фильтрация обратного пути). Это механизм ядра Linux, который проверяет входящие сетевые пакеты, чтобы убедиться, что они пришли с того интерфейса, на который, согласно таблицам маршрутизации, можно было бы отправить ответный пакет.
Проще говоря: когда на сетевой интерфейс приходит пакет, rp_filter смотрит, а можно ли было бы с этого сервера отправить ответ на IP-адрес отправителя этого пакета через тот же самый интерфейс, на который пакет пришёл.
Представьте аналогию: Вы получаете письмо, на котором в качестве обратного адреса указана улица “Ленина, дом 5”. Ваша почтовая служба проверяет: если бы вы отправляли письмо на “Ленина, дом 5”, вы бы отправили его через то же почтовое отделение, из которого только что получили это письмо? Если да, то всё в порядке. Если нет (например, “Ленина, дом 5” находится в другом городе, и для отправки туда письма используется совершенно другое почтовое отделение), то это письмо считается подозрительным.
Для чего нужен rp_filter? (Основная цель: Анти-спуфинг)
Главная цель rp_filter — это защита от IP-спуфинга (IP spoofing). IP-спуфинг — это техника, при которой злоумышленник подделывает исходный IP-адрес сетевых пакетов, выдавая себя за другой компьютер. Это может использоваться для:
- DDoS-атак: Скрытие истинного источника атаки.
- Обхода сетевых фильтров: Представление себя доверенным узлом.
- Man-in-the-Middle атак: Перехват и модификация трафика.
Когда rp_filter включен, он отклоняет входящие пакеты, если их исходный IP-адрес не соответствует ожидаемому обратному маршруту. Таким образом, он гарантирует, что пакеты, которые ваш сервер получает, действительно приходят с того места, откуда они заявляют, что пришли, или, по крайней мере, что путь до отправителя через этот интерфейс является “валидным” по вашей таблице маршрутизации.
Режимы работы rp_filter
rp_filter настраивается для каждого сетевого интерфейса отдельно (например, eth0, eth1), а также через общие ключи all и default (о том, как они сочетаются, — в разделе ниже). Параметр может принимать одно из трёх значений:
0(Disabled): Отключено. Фильтрация обратного пути не выполняется. Все пакеты принимаются независимо от обратного пути. Не рекомендуется для большинства сред, так как делает систему уязвимой к спуфингу.1(Strict mode - Режим строгой проверки): Включен строгий режим RFC3704. Система проверяет, что ответ на входящий пакет мог бы быть отправлен только через тот же интерфейс, на который пакет пришёл, и что это был бы лучший маршрут до источника пакета. Если нет, пакет отбрасывается.- Преимущества: Максимальная защита от спуфинга.
- Недостатки: Может вызывать проблемы в сложных сетевых конфигурациях, таких как асимметричная маршрутизация (когда входящий трафик идет по одному пути, а исходящий — по другому), а также при использовании некоторых видов балансировки нагрузки.
2(Loose mode - Режим свободной проверки): Включен свободный режим RFC3704. Система проверяет, что ответ на входящий пакет мог бы быть отправлен через любой интерфейс на этом сервере. Если есть хоть один маршрут до источника пакета, пакет принимается.- Преимущества: Хороший компромисс между безопасностью и гибкостью. Предоставляет защиту от спуфинга, но допускает асимметричную маршрутизацию и другие сложные сетевые сценарии.
- Недостатки: Менее строгая защита, чем в режиме
1.
Где находится и как настроить?
Параметры rp_filter находятся в /proc/sys/net/ipv4/conf/. Вы можете увидеть их для каждого интерфейса и для всех интерфейсов сразу:
/proc/sys/net/ipv4/conf/all/rp_filter(общее значение: при проверке пакета ядро сравнивает его со значением интерфейса и берёт большее из двух)/proc/sys/net/ipv4/conf/default/rp_filter(значение, которое получат интерфейсы, созданные после изменения параметра)/proc/sys/net/ipv4/conf/<interface_name>/rp_filter(например,/proc/sys/net/ipv4/conf/eth0/rp_filter)
Проверить текущее значение (например, для eth0):
cat /proc/sys/net/ipv4/conf/eth0/rp_filterИзменить значение временно (до перезагрузки):
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/eth0/rp_filterИзменить значение постоянно (после перезагрузки):
Для этого используйте sysctl. Откройте или создайте файл конфигурации (например, /etc/sysctl.d/99-rpfilter.conf):
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# Если нужно отдельное значение для интерфейса:
net.ipv4.conf.eth0.rp_filter = 1Комментарии в файлах sysctl.d пишутся только отдельной строкой, которая начинается с # или ;. Комментарий в конце строки со значением не допускается: текст после # будет считаться частью значения, и параметр не применится.
Затем примените изменения:
sudo sysctl -p /etc/sysctl.d/99-rpfilter.confКоманда sudo sysctl -p без аргументов читает только /etc/sysctl.conf. Чтобы применить все файлы из /etc/sysctl.d/, /run/sysctl.d/ и /usr/lib/sysctl.d/, используйте:
sudo sysctl --systemЕсли несколько файлов задают один и тот же параметр, действует значение из файла, имя которого идёт последним по алфавиту, поэтому свои настройки удобно класть в файл с префиксом 99-.
all против интерфейса: какое значение действует
Частая ошибка — считать, что net.ipv4.conf.all.rp_filter задаёт значение «по умолчанию», которое можно переопределить на конкретном интерфейсе. Это не так. По документации ядра при проверке пакета, пришедшего на интерфейс, используется максимальное из двух значений: conf/all/rp_filter и conf/<интерфейс>/rp_filter.
all | интерфейс | Действует на интерфейсе |
|---|---|---|
| 0 | 0 | 0 — проверка отключена |
| 0 | 2 | 2 — свободный режим |
| 1 | 0 | 1 — строгий режим |
| 2 | 1 | 2 — свободный режим |
Практические следствия:
- Чтобы ослабить проверку на одном интерфейсе (например, поставить
2на туннеле с асимметричной маршрутизацией), недостаточно изменить значение интерфейса:allдолжен быть не больше нужного значения. Обычно ставятall = 0и задают режим на каждом интерфейсе отдельно. - Чтобы ужесточить проверку везде сразу, достаточно поднять
all. - Ключ
defaultна уже существующие интерфейсы не влияет — только на созданные позже (туннели, VLAN, интерфейсы контейнеров).
Посмотреть, что действует на самом деле, можно одной командой:
sysctl -a 2>/dev/null | grep '\.rp_filter'На дистрибутивах с systemd поставляемый файл /usr/lib/sysctl.d/50-default.conf задаёт свободный режим (2) для default и всех интерфейсов, а all намеренно не трогает — он остаётся со значением ядра по умолчанию, 0. Поэтому на таких системах фактически действует режим 2, хотя cat /proc/sys/net/ipv4/conf/all/rp_filter показывает 0.
Рекомендации по настройке
- Для большинства серверов (один интерфейс, нет асимметричной маршрутизации): Используйте
rp_filter = 1(строгий режим). Это обеспечивает наилучшую защиту от спуфинга.confnet.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 - Для серверов с асимметричной маршрутизацией, несколькими IP-адресами на интерфейс, или сложными сетевыми конфигурациями (например, балансировщики нагрузки, VPN-серверы, некоторые виртуальные машины): Рассмотрите
rp_filter = 2(свободный режим). Он предоставляет разумный уровень защиты, но позволяет входящему трафику приходить по одному пути, а исходящему — идти по другому.confnet.ipv4.conf.all.rp_filter = 2 net.ipv4.conf.default.rp_filter = 2 - Если маршрутизация зависит от меток пакетов (fwmark), например при policy routing через
ip rule fwmarkили прозрачном проксировании, обратите внимание на параметрsrc_valid_mark. При значении1метка пакета учитывается при проверке обратного пути, иrp_filterработает корректно, когда метка используется для маршрутизации в обе стороны. При0(по умолчанию) метка не учитывается. Дляsrc_valid_markдействует то же правило максимума изallи интерфейса. - Никогда не используйте
rp_filter = 0, если у вас нет очень веских причин и вы полностью не осознаете риски.
Пример, где rp_filter часто мешает, — отправка трафика подсети через удалённый сервер по туннелю с policy routing; разбор такой схемы — в статье «Направляем трафик из локальной подсети через удалённый сервер (IPIP + Policy Routing)». Асимметричная маршрутизация при двух провайдерах разобрана в статье «Резервирование каналов связи: выход в интернет».
Заключение
rp_filter — это мощный инструмент для повышения сетевой безопасности вашего Linux-сервера за счет защиты от IP-спуфинга. Правильная настройка этого параметра критически важна, особенно в публично доступных средах. Всегда начинайте с наиболее строгого режима (1) и ослабляйте его до 2 только в случае возникновения проблем с легитимным трафиком в сложных сетевых конфигурациях. Помните: понимание сетевых настроек ядра — это ключ к стабильной и защищенной инфраструктуре.
// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related