Популярно об iptables
В операционной системе Linux есть мощный инструмент для управления трафиком — межсетевой экран (firewall), который называется iptables. Помимо базовых возможностей, связанных с безопасностью, iptables и сопутствующие модули ядра могут использоваться для множества применений: обеспечения трансляции адресов и портов, установки приоритетов и т.д. Давайте рассмотрим примеры использования iptables для основных, базовых задач. Для начала — общий, базовый синтаксис вызова iptables для установки правил:
1 |
iptables -A очередь -s источник -j действие |
Удалить все правила с определенной очереди можно с помощью ключа -F:
1 |
iptables -F очередь |
Самая простая задача файрвола — блокировка всего трафика в сторону нашего сервера с определенного IP. Для этого необходимо выполнить такую команду:
1 |
iptables -A INPUT -s 1.2.3.4 -j DROP |
При установке такого фильтра все IP-пакеты с адреса 1.2.3.4 будут уничтожаться на входе. В том случае, если отправителю нужно указать, что для него узел недоступен, нужно использовать несколько видоизмененное правило:
1 |
iptables -A INPUT -s 1.2.3.4 -j REJECT |
В случае использования REJECT система на каждый приходящий пакет будет формировать специальный ответ, информирующий отправителя о невозможности доставки. Используйте REJECT только в необходимых случаях — при формировании этих ответов используются ресурсы сервера, поэтому в большинстве случаев достаточно использовать DROP.
В правилах можно использовать также фильтрацию по протоколам. Например, можно заблокировать только UDP с определенного отправителя:
1 |
iptables -A INPUT -p UDP -s 1.2.3.4 -j DROP |
В следующем примере рассмотрим, как можно указать номера портов. Воспользуемся ключем —dport (порт назначения, destination port) для того, чтобы запретить для хоста 1.2.3.4 подключение к нашему серверу по протоколу ssh на стандартный порт 22:
1 |
iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j DROP |
Есть возможность протоколировать работу определенных правил. Давайте сделаем так, чтобы в лог-файле (обычно — в /var/log/messages) были записи о работе фильтра. Первое правило протоколирует поступившие пакеты, второе — уничтожает их:
1 2 |
iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j LOG --log-prefix "SSH Filter:" iptables -A INPUT -p TCP -s 1.2.3.4 --dport 22 -j DROP |
В iptables можно указывать не только единичный адрес — возможно указать целую сеть. Для примера — заблокируем подключение к нашему вэбсерверу (порт 80) с диапазона адресов 10.1.2.* (в CIDR-нотации 10.1.2.0/24):
1 |
iptables -A INPUT -p TCP -s 10.1.2.0/24 --dport 80 -j DROP |
Следующий пример покажет, как можно использовать iptables для проверки содержимого IP-пакетов. Например, можно журналировать или уничтожать пакеты, в которых есть определенная последовательность символов, в данном примере — ‘hack.php’:
1 |
iptables -I INPUT -p TCP -m string --string "hack.php" -j LOG --log-prefix "HACK:" |
Рассмотрим еще одну практическую задачу — ограничение количества подключений в сторону нашего сервера за единицу времени. Это может быть полезно для борьбы с флудом или простыми атаками. Следующим правилом мы установим лимит в 5 одновременных подключений с одного IP к нашему серверу по протоколу ssh:
1 |
iptables -A INPUT -p TCP --syn --dport 22 -m connlimit --connlimit-above 5 -j REJECT |
Можно использовать другую конструкцию — следующее правило будет ограничивать количество новых соединений в сторону вэбсервера в 25 в минуту, причем этот лимит включится в том случае, если за предыдущую минуту было отмечено 100 соединений:
1 |
iptables -A INPUT -p TCP --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT |
Можно лимитировать соединения не по единичным адресам или в целом по системе, но и с использованием маски. В примере ниже мы установим блокировку для целой сети /24 в том случае, если ее адресов поступит более 20 соединений:
1 |
iptables -A INPUT -p TCP --dport 80 -m iplimit --iplimit-above 20 --iplimit-mask 24 -j REJECT |
В заключение рассмотрим, как сохранять запрограммированные правила iptables, чтобы при перезагрузке операционной системы они были снова установлены. В Centos достаточно выполнить команду
1 |
service iptables save |
Для Debian рекомендуется установить вспомогательный пакет iptables-persistent, его следует инсталлировать с помощью стандартного менеджера пакетов:
1 |
aptitude install iptables-persistent |
После установки iptables-persistent система будет автоматически сохранять актуальные правила при остановке операционной системы и восстанавливать их при запуске.
Напоследок хотим дать достаточно важную рекомендацию: при установке правил возможны ошибки, из-за которых вы можете заблокировать сами себя. Мы рекомендуем перед настройкой файрвола получить доступ к консоли вашего сервера (для выделенных серверов — запросить IP KVM, для VDS — воспользоваться встроенным VNC-клиентом). Если возникнет необходимость, вы всегда сможете с консоли восстановить доступ, «сбросив» ошибочные правила.