Использование утилиты 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, выполните следующую команду:

iptables --list

Вывод:


Chain INPUT (policy DROP)
target     prot      opt   source       destination
f2b-sshd   tcp       --   anywhere      anywhere         multiport dports ssh
f2b-SSH    tcp       --   anywhere      anywhere         tcp dpt:ssh
ACCEPT     all       --   anywhere      anywhere         state RELATED,ESTABLISHED
ACCEPT     icmp      --   anywhere      anywhere
ACCEPT     all       --   anywhere      anywhere
ACCEPT     tcp       --   anywhere      anywhere         tcp dpt:ssh

Здесь:

  • 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 -t nat -A PREROUTING -d <внешний_ip-адрес> -p tcp -m tcp --dport <порт_подключения> -j DNAT --to-destination <целевой_внутренний_ip-адрес>:<целевой_порт>
iptables -t nat -A POSTROUTING -d <целевой_внутренний_ip-адрес> -p tcp -m tcp --dport <целевой_порт> -j SNAT --to-source <внутренний_ip-адрес_шлюза>
iptables -t nat -A OUTPUT -d <внешний_ip-адрес> -p tcp -m tcp --dport <целевой_порт> -j DNAT --to-destination <целевой_внутренний_ip-адрес>
iptables -I FORWARD 1 -i <внешний_ip-адрес> -o <внутренний_ip-адрес_шлюза> -d <целевой_внутренний_ip-адрес> -p tcp -m tcp --dport <целевой_порт> -j ACCEPT

Например:

iptables -t nat -A PREROUTING -d 11.22.121.10 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.1.2:85
iptables -t nat -A POSTROUTING -d 10.0.1.2 -p tcp -m tcp --dport 85 -j SNAT --to-source 10.0.1.1
iptables -t nat -A OUTPUT -d 11.22.121.10 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.1.2
iptables -I FORWARD 1 -i 11.22.121.10 -o 10.0.1.1 -d 10.0.1.2 -p tcp -m tcp --dport 85 -j ACCEPT

Минимальная конфигурация firewall

Конкретные правила фаервола зависят от сервисов, используемых на вашем сервере. Ниже приведен пример правил, подразумевающих использование вами веб-сервера. Прежде, чем применять правила 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

 


Средняя оценка: 5,0, всего оценок: 1