Управление сетевыми пакетами с помощью утилиты iptables на LinuxРешение задач маршрутизации входящего и исходящего трафика путем использования утилиты iptables на виртуальном сервере Linux
В инструкции описана расширенная информация об утилите iptables, приведена ее структура и примеры использования для настройки брандмауэра на виртуальном сервере Linux.
Что это такое?
Iptables - чрезвычайно гибкая утилита межсетевого экрана, предназначенная для операционных систем Linux. Iptables основана на правилах (rules), которые контролируют входящие и исходящие пакеты, а также использует цепочки правил для разрешения или блокировки трафика. По умолчанию никакие правила не установлены, пользователь может создавать, добавлять и редактировать правила.
iptables почти всегда предустановлена на любом дистрибутиве Linux. Чтобы обновить или установить, просто загрузите пакет iptables с помощью пакетного менеджера, например apt-get:
sudo apt-get install iptables
Необходимо быть предельно осторожным при настройке правил iptables, особенно если вы используете ssh на сервере, потому что одна неправильная команда может заблокировать подключение по ssh, но на наших виртуальных серверах это можно просто исправить, подключившись к web-консоли.
Основные конфигурационные файлы:
/etc/init.d/iptables – скрипт инициализации для запуска, остановки, перезапуск и сохранения наборов правил;
/etc/sysconfig/iptables – файл, в который сохраняются правила;
/sbin/iptables – бинарный файл, в котором находится утилита.
В структуре iptables существует 4 таблицы:
Filter - таблица по умолчанию;
NAT - предназначена для преобразования сетевых адресов;
Mangle - предназначена для внесения специализированных изменений в пакеты;
Raw - предназначена для конфигурационных исключений.
Filter
Filter - это таблица по умолчанию для iptables. Если вы не определяете собственную таблицу, то будет использоваться эта таблица правил. Таблица Filter использует три разные цепочки: INPUT, FORWARD и OUTPUT.
INPUT
Цепочка, которая используется для управления входящими соединениями. Например, если пользователь пытается подключиться по ssh к вашему серверу, iptables попытается сопоставить IP-адрес и порт с правилом в цепочке input.
FORWARD
Эта цепочка используется для входящих соединений, которые фактически не доставляются локально. Такая ситуация может возникнуть на маршрутизаторе - данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора, т.е. маршрутизатор просто перенаправляют данные.
OUTPUT
Цепочка, предназначенная для обработки исходящих соединений. Например, если пользователь попытается выполнить команду ping до определенного хоста, то iptables проверит output-цепочку, чтобы разрешить или отклонить попытку подключения.
NAT
Таблица NAT имеет следующие встроенные цепочки: PREROUTING, POSTROUTING, OUTPUT.
PREROUTING
Изменяет пакеты перед маршрутизацией. Перенаправление предназначено для пакетов поступающих в систему (например в локальную или частную сеть). Цепочка позволяет определить действительный IP-адрес назначения пакетов. Используется для DNAT (NAT назначения). DNAT изменяет целевой адрес пакета.
POSTROUTING
Изменяет пакеты после маршрутизации. Перенаправление предназначено для пакетов покидающих систему. Цепочка подменяет исходный адрес пакетов. Это используется для SNAT (источник NAT). SNAT изменяет исходный адрес пакета.
OUTPUT
Изменяет пакеты после маршрутизации. Перенаправление предназначено для локальных пакетов. Цепочка изменяет целевой адрес пакетов.
Правила
Правила содержат критерии и цель.
Если критерии сопоставляются, то действия применяются к целевому объекту.
Если критерии не сопоставляются, то происходит переход к следующему правилу.
Ниже приведены возможные целевые объекты:
ACCEPT
Входящий пакет обрабатывается
DROP
Входящий пакет отбрасывается, при сканировании порт фильтруется
QUEUE
Пакет передается в пользовательское пространство
RETURN
Прекращается выполнение набора правил в текущей цепочке для этого пакета, элемент управления возвращается вызывающей цепочке
REJECT
Входящий пакет отправляется на адрес источника с информацией, что сервиса не существует
DENY
Входящий пакет отбрасывается, ответ не отправляется
NEW
Установка нового соединения, первый пакет, который мы видим
RELATED
Соединение, связанное с другим, имеющим статус ESTABLISHED
ESTABLISHED
Установленное сетевое соединение
Для того, чтобы посмотреть текущую конфигурацию iptables, выполните следующую команду:
target - специальная целевая переменная, как видно из вывода, это может быть собственное значение, первые два правила ссылаются на собственные цепочки;
prot - протоколы;
opt - специальные опции;
source - исходный ip-адрес;
destination - ip-адрес назначения.
Примечание: по умолчанию правила попадают в таблицу filter.
Чтобы посмотреть правила конкретной таблицы используйте следующую команду:
iptables -t <имя_таблицы> --list
Например:
iptables -t filter --list
Чтобы вывести правила с нумерацией используется дополнительный ключ --line-numbers:
iptables -L --line-numbers
Для создания собственной цепочки используйте команду:
iptables -N <имя_цепочки>
Например:
iptables -N MY_CHAIN
Блокировка ip-адресов
Часто возникает задача блокирования ip-адресов. Например, вы заметили, что IP 11.22.121.122 постоянно пытается атаковать ваш сервер, и вы хотите его заблокировать. Нужно просто заблокировать все входящие пакеты с этого IP-адреса. Чтобы это сделать, нужно добавить следующее правило в цепочку INPUT таблицы filter. В примере имя таблицы указано явно, без использования ключа t правило попадает в таблицу по умолчанию:
iptables -t filter -A INPUT -s 11.22.121.122 -j REJECT
Здесь:
t - указывает, в какую таблицу будет входить правило;
A - указывает на добавление (Append) правила в цепочку INPUT;
s - указывает источник;
j - указывает iptables на отклонение трафика с помощью цели REJECT.
Также можете блокировать диапазоны IP-адресов, используя CIDR-нотацию. Если необходимо заблокировать все IP-адреса от 11.22.121.0 до 11.22.121.255, это можно сделать с помощью команды:
iptables -A INPUT -s 11.22.121.0/24 -j REJECT
Если необходимо заблокировать исходящий трафик на конкретный ip, используется цепочка OUTPUT и флаг -d для указания ip-адреса назначения:
iptables -A OUTPUT -d 31.13.78.35 -j DROP
Удаление правил
Теперь, скажем, вы заблокировали IP-адрес 11.22.121.0/24 по ошибке. Чтобы удалить существующее правило используйте команду:
iptables -D INPUT -s 11.22.121.0/24 -j REJECT
Здесь ключ -D (Drop) означает удаление правила из цепочки.
Также можно удалять правила по номерам строк. Если вы хотите удалить второе правило из цепочки INPUT, команда будет следующей:
iptables -D INPUT 2
Примечание: при удалении правил нумерация изменяется.
Также возможно удалить все правила цепочки - с помощью опции F:
iptables -F INPUT
Вставка и замена правил
Поскольку iptables обрабатывает правила в цепочках одно за другим, возможно вставить правила в определенное место в цепочке. Например, следующая команда вставляет блокировку указанного ip-адреса на первое место:
iptables -I INPUT 1 -s 11.22.121.10 -j ACCEPT
Для замены правила стоящем на определенном месте, необходимо использовать ключ -R. Следующая команда заменит правило стоящее на 1 месте:
iptables -R INPUT 1 -s 11.22.121.11 -j ACCEPT
Протоколы, модули, интерфейсы
Например, чтобы заблокировать весь входящий TCP-трафик, нужно с помощью ключа -p указать протокол следующим образом:
iptables -A INPUT -p tcp -j DROP
Более полезный пример - блокировка доступа по ssh для диапазона ip-адресов. Для начала необходимо сопоставить трафик TCP, как в примере выше. Затем нужно проверить предназначен ли трафик для SSH порта, используя --dport. Таким образом, вся команда будет:
iptables -A INPUT -p tcp --dport 22 -s 11.22.121.0/24 -j DROP
Для того, чтобы заблокировать доступ одновременно и к SSH и VNC для диапазона адресов, нужно использовать модуль multiport и ключ --dports. Команда:
iptables -A INPUT -p tcp -m multiport --dports 22,5901 -s 59.45.175.0/24 -j DROP
Чтобы открыть порт, например 80, для подключения по http, используйте команду:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Для разрешения всех входящих соединений с адаптера, например с eth1, используйте следующее правило:
iptables -A INPUT -i eth1 -j ACCEPT
Пример перенаправления портов
Довольно часто возникает необходимость перенаправления портов и ip-адресов в целях безопасности в локальной сети. Например, чтобы перенаправить трафик с порта 80 сервера, который имеет выход в глобальную сеть, на 85 порт локальной машины.
Для перенаправления необходимо выполнить следующий набор правил:
Конкретные правила фаервола зависят от сервисов, используемых на вашем сервере. Ниже приведен пример правил, подразумевающих использование вами веб-сервера. Прежде, чем применять правила iptables, спланируйте их исходя из вашей вашей конфигурации.
Примечание: восклицательный знак `!` используется для инверсии правил.
Для начала разрешите все входящие подключения:
iptables --policy INPUT ACCEPT
Затем необходимо очистить все правила Iptables:
iptables -F
Чтобы не потерять соединение по SSH, откройте 22 порт:
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
Следующие правила зависят от ваших потребностей:
Разрешить весь трафик c loopback (lo0):
iptables -A INPUT -i lo -j ACCEPT
Перенаправить трафик на localhost, который исходит не из lo0.
iptables -A INPUT ! -i lo -s 127.0.0.0/8 -j REJECT
Разрешить ping:
iptables -A INPUT -p icmp -m state --state NEW --icmp-type 8 -j ACCEPT
Разрешить соединения HTTP и HTTPS:
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j ACCEPT
Разрешить входящий трафик из установленных соединений:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Отклонить все остальные входящие пакеты:
iptables -A INPUT -j REJECT
Сохранение правил
После перезагрузки системы правила iptables очищаются, поэтому после их применения их необходимо сохранить.
На операционных системах Ubuntu и Debian можно использовать утилиту netfilter-persistent (или iptables-persistent):
sudo netfilter-persistent save
Примечание: если у Вас включен uwf, необходимо его отключить:
sudo ufw disable
Для сохранения правил на серверах Centos спользуйте команду:
service iptables save
Примечание: если при использовании этой команды на Centos у вас возникает следующая ошибка:
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
То необходимо отключить firewalld, который введен для управления iptables, установить пакет iptables-services и запустить его:
systemctl stop firewalld
systemctl mask firewalld
yum install iptables-services
systemctl enable iptables
systemctl start iptables
service iptables save