Настройка фаервола с помощью iptables за пять минут
Я несколько раз сталкивался с тем, что даже неглупые в общем-то люди делают совершенно непростительные ошибки. Например, открывают всему интернету порт, на котором крутится база данных. Часто так бывает у начинающих DevOps, которые всю жизнь писали код, а теперь в их обязанности входит еще и настройка серверов. В сети есть хорошие туториалы по базовой настройке фаервола в Linux и других *nix, но часто это простыни на множество экранов. Так что, надеюсь, этот более лаконичный туториал кому-нибудь пригодится.
Важно! Очень легко по ошибке так зафаерволить машину, что вы на нее больше не зайдете. Особенно это касается облачных хостингов. Например, если в AWS вы закроете все порты с 1024 по 65536, у машины после ребута почему-то оказываются закрыты вообще всепорты. Если вы хоститесь в облаках, настраивайте лучше фаервол через предоставляемый хостингом веб-интерфейс.
Небольшое замечание по терминологии. Фаервол, встроенный в ядро Linux, называется Netfilter, а iptables — утилита для управления этим фаерволом. Многие ошибочно полагают, что фаервол называется iptables. Это не так. Говоря что-нибудь наподобие «я фильтрую пакеты с помощью iptables», вы показываете окружающим свою безграмотность.
Вообще, какие примерно задачи можно решать с помощью Netfilter:
- Разрешать/запрещать входящий трафик на определенные порты по определенным протоколам (IPv4/IPv6, TCP/UDP) с указанных адресов (IP, MAC) или подсетей;
- Все то же самое в отношении исходящего трафика;
- Можно, например, полностью игнорировать все ICMP пакеты;
- Настройка NAT, см пост про установку и настройку OpenVPN;
- Слышал, что настоящие гуру умеют настраивать защиту от DDoS и брутфорса, ограничивать доступ в сеть конкретным приложениям, пользователям или группам, и делать другие чумовые вещи;
Отмечу, что утилита iptables мне лично первое время казалась исключительно неудобной по сравнению с ipfw во FreeBSD. К счастью, поработав с ней какое-то время, все это множество флагов вроде -A, -D, -j и прочих становятся привычны, так что, наберитесь терпения. Рассмотрим основные команды.
Показать все правила:
iptables -L -n
Вы можете заметить, что в Netfilter есть какие-то «цепочки» (chains) — как минимум INPUT, OUTPUT и FORWARD. У меня лично на машине есть еще и цепочка DOCKER. На первое время можно думать о первых двух, как обо всем входящем и исходящем трафике соответственно, а об остальных временно забыть. Велика вероятность, что они вообще никогда вам не понадобятся.
Удалить все правила:
iptables -F
Изменить политику (поведение по умолчанию) цепочки:
iptables -P INPUT DROP
iptables -P INPUT ACCEPT
Запретить доступ с хоста/подсети:
iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/16 -j DROP
Также можно использовать доменные имена:
iptables -A INPUT -s example.ru -j DROP
Запрет исходящих соединений:
iptables -A OUTPUT -d 123.45.67.89 -j DROP
В правилах можно использовать отрицания:
iptables -A INPUT ! -s 123.45.67.89 -j DROP
Удаление правила по его номеру в цепочке:
iptables -D INPUT 1
Удаление правила на основе того, что оно делает:
iptables -D INPUT -s 123.45.67.89 -j DROP
Опция -p указывает на протокол. Можно использовать all, icmp, tcp, udp или номер протокола из /etc/protocols. Флаг –sport указывает порт, с которого был прислан пакет, а –dport указывает порт назначения:
iptables -A INPUT -p tcp --sport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Вставка (insert) правила в начало цепочки:
iptables -I INPUT ...
Или можно указать конкретную позицию:
iptables -I INPUT 3 ...
Сохранить правила:
iptables-save > /etc/iptables.rules
Восстановить правила:
iptables-restore < /etc/iptables.rules