iptables

iptables — команда управления межсетевым экраном в linux. Является утилитой для netfilter, для работы требует доступа уровня root. Состоит из пяти таблиц, в каждой из которых от двух до пяти цепочек.

Синтаксис iptables

iptables <таблица> <операция> <цепочка> <фильтр> <действие> <опции>

Не все фрагменты синтаксиса (кроме операции) обязательны к использованию, набор зависит от цели выполнения команды, это будет наглядно показано далее в примерах.

Операции iptables
Операция Описание
-L вывести список правил
-A добавить правило
-I вставить (добавить) правило по номеру
-D удалить правило
-F удалить все правила
-N создать новую цепочку
-X удалить цепочку
Фильтры iptables
Ключ Описание
-i входящий интерфейс пакета
-o исходящий интерфейс пакета
-s источник (ip или подсеть) пакета
-d получатель (ip или подсеть) пакета
-p протокол
Действия iptables

Применяются к пакету, попавшему под паттерн фильтров. Устанавливается с помощью ключа -j. Примеры — ACCEPT, DROP, REJECT, MASQUERADE и др.

Опции iptables

Дополнительные опции модификаторов вывода, не попавшие в предыдущие фрагменты. Примеры -v, --line-numbers.

Примеры команд

iptables -L - Вывести список правил iptables
iptables -L -v --line-numbers - Вывести список правил с дополнительной информацией (-v) и номерами строк (--line-numbers)

iptables -L -t nat - Вывести список правил таблицы NAT
iptables -L POSTROUTING -t nat - Вывести список правил цепочки POSTROUTING таблицы NAT
iptables -L INPUT - Вывести список правил цепочки INPUT таблицы FILTER (т.к. таблица не указана)

iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP - Сбросить пакеты со всех источников на eth0 для HTTP (TCP/80)
iptables -A INPUT -s 1.2.3.4 -p tcp --dport 80 -j DROP - Сбросить пакеты с определенного IP для HTTP (TCP/80)
iptables -A INPUT -s 1.2.3.0/24 -p tcp --dport 80 -j DROP - Сбросить пакеты Из подсети для для HTTP (TCP/80)

iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP - Запрещает все входящие SSH соединения
iptables -L INPUT --line-numbers - Покажет список правил с номерами
iptables -I INPUT 4 -i eth0 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT - Вставляем разрешающее правило выше запрещающего (вместо используем -I)

iptables -D INPUT 4 - Удалит по номеру в таблице INPUT
iptables -D INPUT -s 4.3.2.1 -j ACCEPT - Удалит правило по ip и действию
iptables -F OUTPUT - Удалит все правила в таблице OUTPUT

iptables -t nat -A POSTROUTING -s '10.20.30.0/24' -o eth0 -j MASQUERADE - Включит маскарадинг для соединений из локалки наружу (внешний интерфейс - eth0)

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -j DNAT --to-destination 10.20.30.10:22 - Проброс всех входящих соединений интерфейса eth0:2222 на внутренний ip 10.20.30.10:22
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 2222 -j DNAT --to-destination 10.20.30.10:22 - Проброс всех входящих соединений внешнего ip 1.2.3.4:2222 на внутренний ip 10.20.30.10:22

iptables -A OUTPUT -p tcp -d 4.3.2.1 -j DROP - Запретит исходящее соединение по целевому ip-адресу
iptables -A OUTPUT -p tcp -d www.abcdef.ru -j DROP - Запретит исходящее соединение по целевому dns-имени

iptables -A INPUT -p icmp -j ACCEPT - Разрешит пинги на всех интерфейсах
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT - Запретит FTP-соединения на внешнем интерфейсе

Сохранение правил iptables

Правила активируются сразу после выполнения команды, однако после перезагрузки они пропадут. В эпоху ifupdown решение было простым - достаточно было записать правила в файл с конфигом сетевого интерфейса. С приходом netplan приходится делать это таким образом:

  1. После создания очередного правила выгружаем перечень правил в файл:
    iptables-save > /etc/iptables.rules
  2. Создаем скрипт для восстановления правил и делаем его исполняемым:
    touch /etc/iptables.sh
    chmod +x /etc/iptables.sh
  3. Добавляем в файл команду:
#!/bin/sh
/usr/sbin/iptables-restore < /etc/iptables.rules
  1. Создаем конфиг в systemctl:
    systemctl edit --force --full restore-iptables-rules.service
[Unit]
Description=Restore IPTables Rules
After=multi-user.target

[Service]
Type=idle
ExecStart=/etc/iptables.sh                     

[Install]
WantedBy=multi-user.target
  1. Применяем изменения и добавляем новый сервис в автозагрузку.
    systemctl daemon-reload
    systemctl enable restore-iptables-rules.service