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 приходится делать это таким образом:
- После создания очередного правила выгружаем перечень правил в файл:
iptables-save > /etc/iptables.rules - Создаем скрипт для восстановления правил и делаем его исполняемым:
touch /etc/iptables.sh
chmod +x /etc/iptables.sh - Добавляем в файл команду:
#!/bin/sh
/usr/sbin/iptables-restore < /etc/iptables.rules
- Создаем конфиг в 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
- Применяем изменения и добавляем новый сервис в автозагрузку.
systemctl daemon-reload
systemctl enable restore-iptables-rules.service