Записки системного администратора

Ещё один блог о системном администрировании, операционных системах, СУБД, сетях, костылях-велосипедах и пр.

Iptables - основные понятия и примеры использования

В данной статье я коротко опишу, что такое Iptables, зачем эта утилита нужна, и дам парочку примеров. Для меня Iptables является самой удобной и мощной утилитой для упраления межсетевым экраном, в отличие от ufw, ipfw во FreeBSD или firewalld в новых версиях CentOS.

И так, начнем.

Iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана Netfilter в Linux. С её помощью системный администратор создает и изменяет правила, которые управляют фильтрацией и перенаправлением пакетов. Для использования утилиты Iptables требуются привилегии суперпользователя (root).

Основные понятия

Основными ключевыми понятиями в iptables являются правило, цепочка, таблица.

Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен.

  • Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И».
  • Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила.
  • Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.

Цепочка — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.

  • Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).
  • Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.

Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.

# Дамп правил таблицы filter
$ sudo iptables-save -c -t filter > iptables.bak
$ cat iptables.bak
# Таблица filter
*filter
# Цепочки INPUT, FORWARD, OUTPUT, их политики и счётчики
:INPUT ACCEPT [18112:9423469]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2362737:1247588532]
# Правило: "[17:1020]" - счётчик правила, "-A INPUT" - цепочка, "-i em1 -p tcp -m tcp --dport 22" - критерии, "-j ACCEPT" - действие
[17:1020] -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
COMMIT

Цепочки

Существует 5 типов стандартных цепочек, встроенных в систему:

  • PREROUTING — для изначальной обработки входящих пакетов.
  • INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу).
  • FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING).
  • OUTPUT — для пакетов генерируемых локальными процессами.
  • POSTROUTING — для окончательной обработки исходящих пакетов.

Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables.

Таблицы

Цепочки организованны в 4 таблицы:

  • raw — просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT.
  • mangle — содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL (Time to live), TOS (Type of Service), и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек.
  • nat — просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, и POSTROUTING.
  • filter — основная таблица, используется по умолчанию если название таблицы не указано. Содержит цепочки INPUT, FORWARD, и OUTPUT.

Цепочки с одинаковым названием, но в разных таблицах — совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил; пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING.

Состояния

В системе netfilter, каждый пакет проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний:

  • NEW — пакет открывает новый сеанс. Классический пример — пакет TCP с флагом SYN.
  • ESTABLISHED — пакет является частью уже существующего сеанса.
  • RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP, клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21).
  • INVALID — все прочие пакеты.

Примеры

С терминологией разобрались, теперь давайте перейдем к примерам.

1. Показать сатаус

# iptables -L -n -v

где:

  • L - показать список правил.
  • v - отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
  • n - отображать IP адрес и порт числами (не используя DNS сервера для определения имен).

Для того, чтобы отобразить статус с номерами строк, выполняем:

# iptables -n -L -v --line-numbers

Для того, чтобы отобразить статус с номерами строк, к примеру, таблицы nat, выполняем:

# iptables -t nat -n -L -v --line-numbers

где:

  • t - указывает на определенную таблицу

Для того, чтобы отобразить статус цепочки INPUT или FORWARD:

# iptables -L INPUT  -n -v --line-numbers
# iptables -L FORWARD  -n -v --line-numbers

2. Добавить правило в файрвол

Если необходимо вставить правило в цепочку INPUT, к примеру, между третьей и четвертой строкой, то необходимо выполнить следующее:

# iptables -I INPUT 3 -s 172.217.21.14 -j DROP

Не забудьте проверить, добавилось ли правило цепочку:

# iptables -L INPUT  -n -v --line-numbers

3. Удалить правило из файрвола

К примеру, необходимо удалить третью строку из цепочки правил INPUT. Не вопрос:

# iptables -D INPUT 3

Ну или найдем адрес источника и удалим правило:

# iptables -D INPUT 3 -s 172.217.21.14 -j DROP

4. Сохранить правила файрвола в файл

# iptables-save > /etc/iptables.rules

5. Восстановить правила файрвола из файла

# iptables-restore < /etc/iptables.rules

6. Блокировать входящие запросы на определенный порт

Отбросим пакеты, приходящие на порт 80, на всех интерфейсах:

# iptables -A INPUT -p tcp --dport 80 -j DROP

На интерфейсе eth0:

# iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP

Приходящие с определеннного адреса:

# iptables -A INPUT -i eth0 -p tcp -s 172.217.21.14 --dport 80 -j DROP

7. Блокировать запросы на определенный адрес

# iptables -A OUTPUT -p tcp -d 173.252.74.68 -j DROP

Также можно заблокировать по DNS-имени ресурса, например:

# iptables -A OUTPUT -p tcp -d fаcebook.com -j DROP

8. Блокировать или разрешать трафик с определенных MAC-адресов

Блокировать:

# iptables -A INPUT -m mac --mac-source 00:E0:4D:A1:E4:58 -j DROP

Разрешить на порт 22:

# iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:E0:4D:A1:E4:58 -j ACCEPT

9. Записать событие в лог-файл и сбросить

Для того, чтобы записать движение пакетов с определенного адреса в лог-файл и затем сбросить, выполняем:

# iptables -A INPUT -i eth0 -s 172.16.1.2/24 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth0 -s 172.16.1.2/24 -j DROP

Чтобы не переполнить раздел раздутым лог-файлом, ограничим количество записей. К примеру, чтобы записывать каждые 5 минут максимум 10 строк:

# iptables -A INPUT -i eth1 -s 172.16.1.2/24 -m limit --limit 5/m --limit-burst 10 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 172.16.1.2/24 -j DROP

Смотрим в журнал:

# tail -f /var/log/messages

или:

# tail -f /var/log/messages | grep -i --color 'IP_SPOOF' /var/log/messages

10. Открыть диапазон портов

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000:8020 -j ACCEPT

или несколько в одной строчке:

# iptables -A INPUT -s 192.168.11.10 -p tcp -m multiport --ports 22,80,443,8000,10050 -j ACCEPT

11. Разрешить для диапазона адресов

Разрешаем подключение к порту 3389, если адрес в диапазоне от 10.1.1.100 до 10.1.1.200 ##

# iptables -A INPUT -p tcp --destination-port 3389 -m iprange --src-range 10.1.1.100-10.1.1.200 -j ACCEPT

Тоже самое, только для nat:

# iptables -t nat -A POSTROUTING -j SNAT --to-source 10.1.1.100-10.1.1.200

12. Ограничить количество параллельных соединений к серверу для одного адреса

Для ограничений используется модуль connlimit. Если необходимо разрешить только 3 ssh соединения на одного клиента:

# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Установить количество запросов HTTP до 20:

# iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

Где:

  • --connlimit-above 3 - указывает, что правило действует только если количество соединений превышает 3.
  • --connlimit-mask 24 - указывает маску сети.

13. Блокировать или разрешить ICMP запросы

Блокируем ping:

# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j DROP

Разрешаем только часть ICMP запросов (предполагается, что политики по умолчанию для всех входящих блокируются, то есть установлены в DROP):

# iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Разрешаем пинговать только с определенных адресов:

# iptables -A INPUT -s 10.127.3.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Проверка правил

Для проверки работы правил iptables можно воспользоваться утилитами telnet, netstat, nmap и др.:
Проверка с помощью telnet: $ telnet example.com 80 Проверим доступность портов с помощью netstat:

# netstat -tulpn

или если нам нужно проверить опеределенный порт:

# netstat -tulpn | grep :80

Что-то вроде заключения

В заключении хочется сказать, что Iptables - довольно простой и мощный инструмент. Конечно же в этой статье описаны не все возможности и примеры использования данной утилиты. Ниже я оставил ссылки на источники, которыми пользовался. Для дополнительной информации можно воспользоваться гуглом, ну и конечно же:

# man iptables

Для подготовки статьи были использованы следующие источники:

Комментарии (RSS)

Отличная статья, помогла разобраться. Спасибо!)

Ответить Отменить ответ

Спасибо за отзыв! Удачи в настройке ваших файерволов)

Ответить Отменить ответ

HTML Preview:

Коротко о себе:

Привет! Меня зовут Вадим. В этом блоге я пишу об интересующих меня вещах, о проблемах, с которыми сталкиваюсь во время работы, и о путях их решения.

Связаться со мной можно, написав письмо на адрес vadim@adminbook.click