В инструкции описана расширенная информация об утилите iptables, приведена ее структура и примеры использования для настройки брандмауэра на виртуальном сервере Linux.
Что это такое?
Iptables - чрезвычайно гибкая утилита межсетевого экрана, предназначенная для операционных систем Linux. Iptables основана на правилах (rules), которые контролируют входящие и исходящие пакеты, а также использует цепочки правил для разрешения или блокировки трафика. По умолчанию никакие правила не установлены, пользователь может создавать, добавлять и редактировать правила.
iptables почти всегда предустановлена на любом дистрибутиве Linux. Чтобы обновить или установить, просто загрузите пакет iptables с помощью пакетного менеджера, например apt-get:
Необходимо быть предельно осторожным при настройке правил 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
Например:
Чтобы вывести правила с нумерацией используется дополнительный ключ --line-numbers:
iptables -L --line-numbers
Для создания собственной цепочки используйте команду:
Например:
iptables -N MY_CHAIN
Блокировка ip-адресов
Часто возникает задача блокирования ip-адресов. Например, вы заметили, что IP 11.22.121.122 постоянно пытается атаковать ваш сервер, и вы хотите его заблокировать. Нужно просто заблокировать все входящие пакеты с этого IP-адреса. Чтобы это сделать, нужно добавить следующее правило в цепочку INPUT таблицы filter. В примере имя таблицы указано явно, без использования ключа t правило попадает в таблицу по умолчанию:
Здесь:
- t - указывает, в какую таблицу будет входить правило;
- A - указывает на добавление (Append) правила в цепочку INPUT;
- s - указывает источник;
- j - указывает iptables на отклонение трафика с помощью цели REJECT.
Также можете блокировать диапазоны IP-адресов, используя CIDR-нотацию. Если необходимо заблокировать все IP-адреса от 11.22.121.0 до 11.22.121.255, это можно сделать с помощью команды:
Если необходимо заблокировать исходящий трафик на конкретный ip, используется цепочка OUTPUT и флаг -d для указания ip-адреса назначения:
Удаление правил
Теперь, скажем, вы заблокировали IP-адрес 11.22.121.0/24 по ошибке. Чтобы удалить существующее правило используйте команду:
Здесь ключ -D (Drop) означает удаление правила из цепочки.
Также можно удалять правила по номерам строк. Если вы хотите удалить второе правило из цепочки INPUT, команда будет следующей:
Примечание: при удалении правил нумерация изменяется.
Также возможно удалить все правила цепочки - с помощью опции F:
Вставка и замена правил
Поскольку iptables обрабатывает правила в цепочках одно за другим, возможно вставить правила в определенное место в цепочке. Например, следующая команда вставляет блокировку указанного ip-адреса на первое место:
Для замены правила стоящем на определенном месте, необходимо использовать ключ -R. Следующая команда заменит правило стоящее на 1 месте:
Протоколы, модули, интерфейсы
Например, чтобы заблокировать весь входящий TCP-трафик, нужно с помощью ключа -p указать протокол следующим образом:
Более полезный пример - блокировка доступа по ssh для диапазона ip-адресов. Для начала необходимо сопоставить трафик TCP, как в примере выше. Затем нужно проверить предназначен ли трафик для SSH порта, используя --dport. Таким образом, вся команда будет:
Для того, чтобы заблокировать доступ одновременно и к SSH и VNC для диапазона адресов, нужно использовать модуль multiport и ключ --dports. Команда:
Чтобы открыть порт, например 80, для подключения по http, используйте команду:
Для разрешения всех входящих соединений с адаптера, например с eth1, используйте следующее правило:
Пример перенаправления портов
Довольно часто возникает необходимость перенаправления портов и ip-адресов в целях безопасности в локальной сети. Например, чтобы перенаправить трафик с порта 80 сервера, который имеет выход в глобальную сеть, на 85 порт локальной машины.
Для перенаправления необходимо выполнить следующий набор правил:
Например:
Минимальная конфигурация firewall
Конкретные правила фаервола зависят от сервисов, используемых на вашем сервере. Ниже приведен пример правил, подразумевающих использование вами веб-сервера. Прежде, чем применять правила iptables, спланируйте их исходя из вашей вашей конфигурации.
Примечание: восклицательный знак `!` используется для инверсии правил.
Для начала разрешите все входящие подключения:
Затем необходимо очистить все правила Iptables:
Чтобы не потерять соединение по SSH, откройте 22 порт:
Следующие правила зависят от ваших потребностей:
Разрешить весь трафик c loopback (lo0):
Перенаправить трафик на localhost, который исходит не из lo0.
Разрешить ping:
Разрешить соединения HTTP и HTTPS:
Разрешить входящий трафик из установленных соединений:
Отклонить все остальные входящие пакеты:
Сохранение правил
После перезагрузки системы правила iptables очищаются, поэтому после их применения их необходимо сохранить.
На операционных системах Ubuntu и Debian можно использовать утилиту netfilter-persistent (или iptables-persistent):
Примечание: если у Вас включен uwf, необходимо его отключить:
Для сохранения правил на серверах Centos спользуйте команду:
Примечание: если при использовании этой команды на Centos у вас возникает следующая ошибка:
То необходимо отключить firewalld, который введен для управления iptables, установить пакет iptables-services и запустить его: