iptables — команда управления межсетевым экраном в linux. Является утилитой для netfilter, для работы требует доступа уровня root. Состоит из пяти таблиц, в каждой из которых от двух до пяти цепочек.
iptables <таблица> <операция> <цепочка> <фильтр> <действие> <опции>
Не все фрагменты синтаксиса (кроме операции) обязательны к использованию, набор зависит от цели выполнения команды, это будет наглядно показано далее в примерах.
Операция | Описание |
---|---|
-L | вывести список правил |
-A | добавить правило |
-I | вставить (добавить) правило по номеру |
-D | удалить правило |
-F | удалить все правила |
-N | создать новую цепочку |
-X | удалить цепочку |
Ключ | Описание |
---|---|
-i | входящий интерфейс пакета |
-o | исходящий интерфейс пакета |
-s | источник (ip или подсеть) пакета |
-d | получатель (ip или подсеть) пакета |
-p | протокол |
Применяются к пакету, попавшему под паттерн фильтров. Устанавливается с помощью ключа -j
. Примеры — ACCEPT
, DROP
, REJECT
, MASQUERADE
и др.
Дополнительные опции модификаторов вывода, не попавшие в предыдущие фрагменты. Примеры -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-соединения на внешнем интерфейсе
Правила активируются сразу после выполнения команды, однако после перезагрузки они пропадут. В эпоху ifupdown решение было простым - достаточно было записать правила в файл с конфигом сетевого интерфейса. С приходом netplan приходится делать это таким образом:
iptables-save > /etc/iptables.rules
touch /etc/iptables.sh
chmod +x /etc/iptables.sh
#!/bin/sh
/usr/sbin/iptables-restore < /etc/iptables.rules
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
systemctl daemon-reload
systemctl enable restore-iptables-rules.service