Настройка netfilter с помощью iptables

  • Михаил
  • 12 мин. на прочтение
  • 112
  • 20 Jun 2022
  • 20 Jun 2022

Утилита командной строки iptables используется для настройки брандмауэра netfilter, встроенного в систему на базе ядра Linux.

Данная инструкция подходит как для чайников, которые хотят разбираться в аспектах защиты сети, так и опытных специалистов в качестве шпаргалки.

Общий синтаксис
Ключи
Примеры
    Общие команды
    Разрешить все
    Работа с простыми правилами
    Проброс портов
    Стартовая настройка
    Сброс на стандартные настройки
Сохранение правил
Использование в Ubuntu и CentOS

Принцип настройки

Общий синтаксис использования iptables:

iptables -t <таблица> <команда> <цепочка> [номер] <условие> <действие>

<таблица>

Правила netfilter распределены по 4-м таблицам, каждая из которых имеет свое назначение (подробнее ниже). Она указывается ключом -t, но если данный параметр не указан, действие будет выполняться для таблицы по умолчанию — filter.

<команда>

Команды указывают, какое именно действие мы совершаем над netfilter, например, создаем или удаляем правило.

<цепочка>

В каждой таблице есть цепочки, для каждой из которых создаются сами правила. Например, для вышеупомянутой таблицы filter есть три предопределенные цепочки — INPUT (входящие пакеты), OUTPUT (исходящие) и FORWARD (транзитные).

[номер]

Некоторые команды требуют указания номера правила, например, на удаление или редактирование.

<условие>

Условие описывает критерии отработки того или иного правила.

<действие>

Ну и, собственно, что делаем с пакетом, если он подходит под критерии условия.

* справедливости ради, стоит отметить, что ключ с действием не обязан идти в конце. Просто данный формат чаще всего встречается в инструкциях и упрощает чтение правил.
 

Ключи iptables и примеры их использования

Для работы с таблицами (iptables -t)

Напоминаю, все правила в netfilter распределены по таблицам. Чтобы работать с конкретной таблицей, необходимо использовать ключ -t.

КлючОписание
-t filterТаблица по умолчанию. С ней работаем, если упускаем ключ -t. Встроены три цепочки — INPUT (входящие), OUTPUT (исходящие) и FORWARD (проходящие пакеты)
-t natДля пакетов, устанавливающий новое соединение. По умолчанию, встроены три цепочки — PREROUTING (изменение входящих), OUTPUT (изменение локальных пакетов перед отправкой) и POSTROUTING (изменение всех исходящих).
-t mangleДля изменения пакетов. Цепочки — INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING.
-t rawДля создания исключений в слежении за соединениями. Цепочки: PREROUTING, OUTPUT.

Команды

Нижеперечисленные ключи определяют действия, которые выполняет утилита iptables.

КлючОписание и примеры
-AДобавление правила в конец списка:
iptables -A INPUT -s 192.168.0.15 -j DROP
запретить входящие с 192.168.0.15.
-DУдаление правила:
iptables -D INPUT 10
удалить правило в цепочке INPUT с номером 10.
-IВставка правила в определенную часть списка:
iptables -I INPUT 5 -s 192.168.0.15 -j DROP
вставить правило 5-м по списку.
-RЗамена правила.
iptables -R OUTPUT 5 -s 192.168.0.15 -j ACCEPT
заменить наше 5-е правило с запрещающего на разрешающее. 
-FСброс правил в цепочке.
iptables -F INPUT
-ZОбнуление статистики.
iptables -Z INPUT
-NСоздание цепочки.
iptables -N CHAINNEW
-XУдаление цепочки.
iptables -X CHAINNEW
-PОпределение правила по умолчанию.
iptables -P INPUT DROP
-EПереименовывание цепочки.
iptables -E CHAINNEW CHAINOLD

Условия

Данные ключи определяют условия правила.

КлючОписание и примеры
-pСетевой протокол. Допустимые варианты — TCP, UDP, ICMP или ALL.
iptables -A INPUT -p tcp -j ACCEPT
разрешить все входящие tcp-соединения.
-sАдрес источника — имя хоста, IP-адрес или подсеть в нотации CIDR.
iptables -A INPUT -s 192.168.0.50 -j DROP
запретить входящие с узла 192.168.0.50
-dАдрес назначения. Принцип использования аналогичен предыдущему ключу -s.
iptables -A OUTPUT -d 192.168.0.50 -j DROP
запретить исходящие на узел 192.168.0.50
-iСетевой адаптер, через который приходят пакеты (INPUT).
iptables -A INPUT -i eth2 -j DROP
запретить входящие для Ethernet-интерфейса eth2.
-oСетевой адаптер, с которого уходят пакеты (OUTPUT).
iptables -A OUTPUT -o eth3 -j ACCEPT
разрешить исходящие с Ethernet-интерфейса eth3.
--dportПорт назначения.
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
разрешить входящие на порт 80.
--sportПорт источника.
iptables -A INPUT -p tcp --sport 1023 -j DROP
запретить входящие с порта 1023.

Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например,
iptables -A INPUT -s ! 192.168.0.50 -j DROP
запретит соединение всем хостам, кроме 192.168.0.50.

Действия

Действия, которые будут выполняться над пакетом, подходящим под критерии условия. Для каждой таблицы есть свой набор допустимых действий. Указываются с использованием ключа -j.

ТаблицаДействиеОписание
filterACCEPTРазрешает пакет.
DROPЗапрещает пакет.
REJECTЗапрещает с отправкой сообщения источнику.
natMASQUERADEДля исходящих пакетов заменяет IP-адрес источника на адрес интерфейса, с которого уходит пакет.
SNATАналогично MASQUERADE, но с указанием конкретного сетевого интерфейса, чей адрес будет использоваться для подмены. 
DNATПодмена адреса для входящих пакетов.
REDIRECTПеренаправляет запрос на другой порт той же самой системы.
mangleTOSВидоизменение поля TOS (приоритезация трафика).
DSCPИзменение DSCP (тоже приоритезация трафика).
TTLИзменение TTL (время жизни пакета).
HLАналогично TTL, но для IPv6.
MARKМаркировка пакета. Используется для последующей фильтрации или шейпинга.
CONNMARKМаркировка соединения.
TCPMSSИзменение значения MTU.

Примеры часто используемых команд iptables

Общие команды

Просмотр правил с их номерами:

iptables -L --line-numbers

Для каждой таблицы смотреть правила нужно отдельно: 

iptables -t nat -L --line-numbers

Удалить все правила:

iptables -F

Установить правила по умолчанию:

iptables -P INPUT DROP

iptables -P OUTPUT DROP

* в данных примерах по умолчанию для всех входящих (INPUT) и исходящих (OUTPUT) пакетов будет работать запрещающее правило (DROP).

Разрешить все

Способ 1. С помощью добавления правила:

iptables -I INPUT 1 -j ACCEPT

iptables -I OUTPUT 1 -j ACCEPT

iptables -I FORWARD 1 -j ACCEPT

* данные три команды создадут правила, которые разрешают все входящие, исходящие и транзитные пакеты.

Способ 2. Чисткой правил:

iptables -F

iptables -S

* здесь мы сначала удаляем все правила (-F), затем устанавливаем политику по умолчанию — разрешать входящие, исходящие и транзитные (-S).

Способ 3. Отключение сервиса (удобно для диагностики проблем на время отключить firewall):

service iptables stop

iptables stop

Работа с правилами

1. Добавить правило в конец списка:

iptables -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j ACCEPT

2. Добавить диапазон портов:

iptables -A INPUT -p tcp --dport 3000:4000 -j ACCEPT

* в данном случае, от 3000 до 4000.

3. Вставить правило:

iptables -I FORWARD 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j ACCEPT

4. Заблокировать определенный IP-адрес для подключения по 25 порту:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP

5. Разрешить несколько портов:

iptables -A INPUT -p tcp --match multiport --dports 20,21,25,80,8080,3000:4000 -j ACCEPT

Проброс портов (port forwarding)

Рассмотрим пример проброса одного порта и диапазона портов.

Один порт (одинаковые порты)

Существует два способа настройки.

1. Правила PREROUTING + POSTROUTING:

iptables -t nat -A PREROUTING -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:22
iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 22 -j SNAT --to-source 19.8.232.80:22

* где 19.8.232.80 — адрес, на котором слушаем запросы на подключение; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

2. Правила PREROUTING + FORWARD:

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 22 — порт для проброса; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Один порт (разные порты)

Рассмотрим ситуацию, когда мы слушаем один порт, а пробрасываем на другой.

iptables -t nat -A PREROUTING -p tcp -i eth1 --dport 8022 -j DNAT --to-destination 192.168.1.15:22
iptables -A FORWARD -p tcp -d 192.168.1.15 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 8022 — порт для проброса, на котором будем слушать запросы; 22 — порт для проброса на внутренний адрес; 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Диапазон портов

При необходимости пробросить диапазон портов, используем команды:

iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1000:5000 -j DNAT --to-destination 192.168.1.15:1000-5000
iptables -A FORWARD -d 192.168.1.15 -i eth1 -p tcp -m tcp --dport 1000:5000 -j ACCEPT

* где eth1 — сетевой интерфейс, на котором слушаем запросы; 1000:5000 — порты для проброса (от 1000 до 5000); 192.168.1.15 — внутренний IP-адрес, на который переводим все запросы.

Стартовая настройка

Мы можем начать настройку брандмауэра на сервере с этих команд.

Разрешаем SSH:

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Создаем правила для нормальной работы apt-get или yum:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешаем ICMP (для выполнения команды ping):

iptables -A INPUT -p icmp -j ACCEPT

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

iptables -A INPUT -i lo -j ACCEPT

Ставим политику запрета на входящие и разрешаем все исходящие:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT

Настройка по умолчанию

Если мы хотим вернуть настройки в первоночальное значение (разрешено все, правил нет), выполняем команды ниже.

Сначала ставим разрешающую политику для основных цепочек:

iptables -S

Удаляем все правила во всех таблицах:

iptables -F
iptables -t nat -F
iptables -t mangle -F

Удаляем все цепочки, которые не используются:

iptables -X

Сохранение правил (permanent)

По умолчанию, все правила перестают работать после перезапуска сети или компьютера. Для сохранения правил после перезагрузки есть несколько способов настройки.

Способ 1. iptables-save (универсальный)

Сохраняем правила в файл:

iptables-save > /etc/iptables.rules

Открываем настройки сети:

vi /etc/network/interfaces

и добавляем строку:

pre-up iptables-restore < /etc/iptables.rules

Способ 2. iptables-persistent (Debian/Ubuntu)

Ставим пакет iptables-persistent:

apt-get install iptables-persistent

Для сохранения правил вводим команду:

netfilter-persistent save

Способ 3. service iptables (CentOS)

Работает в старых версиях Linux и CentOS. Необходима установка пакета:

yum install iptables-services
apt-get install iptables-services

* первая команда для CentOS, вторая — для Ubuntu.

Сохраняем правила командой:

service iptables save

* правила будут сохранены в файл /etc/sysconfig/iptables.

Чтобы правила восстанавливались автоматически при старте компьютера, разрешаем автозапуск сервиса.

а) в более новых версиях Linux:

systemctl enable iptables

б) в версиях постарше:

chkconfig iptables on

update-rc.d iptables defaults

* первая команда для CentOS, вторая для Ubuntu.

Ubuntu и CentOS

В современных операционных системах Ubuntu и CentOS по умолчанию нет iptables. Необходимо его установить или пользоваться более новыми утилитами.

В CentOS

В качестве штатной программы управления брандмауэром используется firewall-cmd. Подробнее читайте инструкцию Как настроить firewalld в CentOS.

Если необходимо пользоваться iptables, устанавливаем пакет с утилитой:

yum install iptables-services

Отключаем firewalld:

systemctl stop firewalld

systemctl disable firewalld 

Разрешаем и запускаем iptables:

systemctl enable iptables

systemctl start iptables

В Ubuntu

Для управления брандмауэром теперь используется ufw.

Для работы с iptables, устанавливаем следующий пакет:

apt-get install iptables-persistent

Отключаем ufw:

ufw disable