Брандмауэр на хосте - это только половина дела. Вторая половина живёт глубже, в самом сетевом стеке ядра Linux. Параметры sysctl определяют, верит ли ваша машина чужим маршрутам, отвечает ли на широковещательный пинг, защищена ли от SYN-флуда и как ведёт себя IPv6, который во многих дистрибутивах включён по умолчанию и про который часто забывают. В этом уроке мы разберём, какие именно ключи ядра закрывают классические сетевые атаки (спуфинг, ICMP-редиректы, отравление ARP), как отключить неиспользуемые протоколы на уровне модулей, и кратко посмотрим на безопасность Wi-Fi и аутентификацию через FreeRADIUS. Задача администратора - сделать так, чтобы стек по умолчанию не доверял сети, в которой стоит сервер.

Как это работает
Сетевые параметры ядра доступны через псевдо-файловую систему /proc/sys/net и через утилиту sysctl. Запись в /proc/sys/net/ipv4/... меняет поведение немедленно, но не переживает перезагрузку. Чтобы изменения были постоянными, их кладут в файлы внутри /etc/sysctl.d/ (а исторический /etc/sysctl.conf оставлен для совместимости). При загрузке systemd-sysctl применяет эти файлы по порядку имён, поэтому именуйте свой файл с числовым префиксом, например 90-hardening.conf.
Защита от спуфинга строится на rp_filter (reverse path filtering). Когда приходит пакет, ядро проверяет: а ушёл бы ответный пакет обратно через тот же интерфейс, с которого пришёл запрос? Если маршрут асимметричный или адрес источника явно поддельный, пакет отбрасывается. Режим 1 - строгая проверка (RFC 3704 strict), режим 2 - нестрогая (loose), которая допустима на роутерах с несколькими аплинками.
ICMP-редиректы - это сообщения вида "ходи к этой сети через другой шлюз". Принимая их, хост позволяет любому в сегменте переписать свою таблицу маршрутизации - классический MITM. На обычном сервере приём и отправку редиректов отключают полностью. SYN cookies решают другую проблему: при SYN-флуде очередь полуоткрытых соединений переполняется, и ядро вместо хранения состояния кодирует его в начальный номер последовательности (ISN), не выделяя память до прихода ACK.
ARP работает на L2 и не имеет аутентификации - отсюда ARP spoofing. Полностью защититься средствами sysctl нельзя, но arp_ignore и arp_announce ограничивают, на какие ARP-запросы хост отвечает и какой адрес объявляет, снижая утечку адресов между интерфейсами.
Команды и примеры
Посмотреть и временно изменить параметр:
Код: Выделить всё
sysctl net.ipv4.conf.all.rp_filter
sysctl -w net.ipv4.conf.all.rp_filter=1
sysctl -a | grep -E 'rp_filter|accept_redirects'
Код: Выделить всё
# Anti-spoofing: строгий reverse path filter
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
# ICMP redirects - не принимаем и не шлём
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
# Source routing - запрещаем
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
# SYN flood
net.ipv4.tcp_syncookies = 1
# Игнорировать broadcast ping (smurf) и битые ICMP
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
# Логировать марсианские пакеты (подделанные адреса)
net.ipv4.conf.all.log_martians = 1
# IPv6 hardening: не принимать RA, если хост не роутер
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0
Код: Выделить всё
# Загрузить конкретный файл (современный способ)
sysctl --system
# или адресно
sysctl -p /etc/sysctl.d/90-network-hardening.conf
Код: Выделить всё
# /etc/modprobe.d/blacklist-rare-net.conf
install dccp /bin/true
install sctp /bin/true
install rds /bin/true
install tipc /bin/true
Код: Выделить всё
# в /etc/sysctl.d/
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
FreeRADIUS обеспечивает централизованную аутентификацию (AAA) для сетевого оборудования и Wi-Fi через 802.1X/EAP. Конфиг в RHEL лежит в /etc/raddb/, в Debian - в /etc/freeradius/3.0/. Тестовый запуск с отладкой:
Код: Выделить всё
# Debian/Ubuntu
apt install freeradius
freeradius -X
# RHEL/Fedora
dnf install freeradius
radiusd -X
Частые грабли
- rp_filter в режиме 1 ломает асимметричную маршрутизацию (multi-homing, policy routing). На роутерах с несколькими аплинками ставьте 2 или настраивайте per-interface.
- Установка только net.ipv4.conf.all.* не покрывает уже поднятые интерфейсы и новые - нужно дублировать в .default, а иногда и в конкретный интерфейс (.eth0).
- disable_ipv6=1 не выгружает модуль и может ломать приложения, которые слушают ::1. Часто лучше укрепить IPv6, а не вырубать.
- send_redirects по умолчанию включён - на не-роутере это лишний отпечаток сети, отключайте.
- Изменение /proc/sys напрямую теряется после reboot - всегда дублируйте в /etc/sysctl.d/.
- Порядок применения файлов в sysctl.d по алфавиту: ваш 90- может быть переопределён более поздним. Проверяйте sysctl -a после загрузки.
- FreeRADIUS в фоне маскирует ошибки конфига; всегда отлаживайте через -X перед запуском сервиса.
- Снимите текущие значения: sysctl net.ipv4.conf.all.rp_filter и net.ipv4.tcp_syncookies, запишите исходное состояние.
- Создайте /etc/sysctl.d/90-network-hardening.conf с набором ключей из урока.
- Примените sysctl --system и убедитесь, что значения изменились через sysctl -a | grep redirects.
- С другой машины (или из netns) отправьте broadcast-ping и проверьте, что хост молчит.
- Включите log_martians, отправьте пакет с поддельным src и найдите запись в journalctl -k.
- Создайте blacklist в /etc/modprobe.d/, перезагрузитесь и проверьте lsmod, что dccp не загружен.
- Поднимите freeradius -X, добавьте тестового клиента и пользователя, проверьте аутентификацию утилитой radtest.
- Чем отличается rp_filter в режиме 1 от режима 2 и когда строгий режим недопустим?
- Какой ключ sysctl защищает от SYN-флуда и за счёт какого механизма он не выделяет память до ACK?
- Почему приём ICMP-редиректов опасен и какие два ключа его контролируют для IPv4?
- Как через modprobe.d запретить загрузку модуля протокола и чем install /bin/true отличается от blacklist?
- Какие параметры IPv6 нужно укрепить на хосте, который не является маршрутизатором, и почему accept_ra=0 важен?
- В чём роль FreeRADIUS в схеме 802.1X и почему WPA2-PSK уступает WPA3-Enterprise с EAP-TLS?