Описание работы брендмауэра iptables
Описание работы брендмауэра iptables
Основной синтаксис iptables:
iptables [опции] [таблица] [команда] [цепочка] [условия] [действия]
Основные таблицы (-t):
filter — основная таблица фильтрации (по умолчанию);
nat — трансляция адресов;
mangle — изменение заголовков пакетов;
raw — обработка до отслеживания состояний.
Основные команды:
-A (--append) — добавить правило в конец цепочки;
-I (--insert) — вставить правило (по номеру), если номер не указан, то вставит первым;
-D (--delete) — удалить правило;
-L (--list) — показать правила;
-F (--flush) — очистить все правила;
-P (--policy) — задать политику по умолчанию.
Цепочки:
INPUT — входящий трафик (для самой системы);
OUTPUT — исходящий трафик (от системы);
FORWARD — транзитный трафик (через систему).
Условия (критерии):
-p (--protocol) — протокол (tcp, udp, icmp…);
--dport — порт получателя;
--sport — порт отправителя;
-s (--source) — IP-адрес источника;
-d (--destination) — IP-адрес получателя;
-i (--in-interface) — входной интерфейс;
-o (--out-interface) — выходной интерфейс;
-m (--match) — подключение модулей (state, multiport).
Действия (-j):
ACCEPT — разрешить пакет;
DROP — отбросить пакет (без уведомления);
REJECT — отклонить пакет (с уведомлением);
LOG — записать в журнал;
RETURN — вернуть в предыдущую цепочку.
Примеры:
Установка iptables:
sudo apt install iptables
Посмотреть текущие правила:
sudo iptables -L -v -n
Очистить все правила:
sudo iptables -F
sudo iptables -X
Установить политики по умолчанию на ACCEPT:
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
Правила для входящего и исходящего трафика:
Разрешить весь исходящий трафик:
sudo iptables -A OUTPUT -j ACCEPT
Запретить весь входящий трафик:
sudo iptables -A INPUT -j DROP
Запретить входящий трафик для уже установленных соединений:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Разрешить SSH с конкретного IP (1.1.1.1):
sudo iptables -A INPUT -p tcp --dport 22 -s 1.1.1.1 -j ACCEPT
Закрыть SSH для всех (кроме разрешённых выше):
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
Разрешить SSH с для подсети 1.1.1.1/24:
sudo iptables -A INPUT -p tcp --dport 22 -s 1.1.1.1/24 -j ACCEPT
Разрешить диапазон портов 1000–2000 для TCP:
sudo iptables -A INPUT -p tcp --match multiport --dports 1000:2000 -j ACCEPT
Запретить диапазон портов 3000–4000 для UDP:
sudo iptables -A INPUT -p udp --match multiport --dports 3000:4000 -j DROP
Разрешить трафик из подсети 2.2.2.2/24:
sudo iptables -A INPUT -s 2.2.2.2/24 -j ACCEPT
Запретить трафик из подсети 2.2.2.2/24:
sudo iptables -A INPUT -s 2.2.2.2/24 -j DROP
Удаление правила по имени:
sudo iptables -D INPUT -p tcp --dport 22 -j DROP
Увидеть номер правила в таблице:
sudo iptables -L INPUT --line-numbers -n -v
Удаление правила по номеру:
sudo iptables -D INPUT 2
Вставить правило в конец цепочки:
sudo iptables -A INPUT -p tcp --dport 22 -j DROP
Вставить правило на 2-ю позицию:
sudo iptables -I INPUT 2 -p tcp --dport 22 -j DROP
Вставить правило на первую позицию (если не указать явно):
sudo iptables -I INPUT -p tcp --dport 22 -j DROP
Логирование правила (должно стоять раньше правила, которое логируем):
sudo iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_BLOCKED:" --log-level "4"
Поиск в логах:
sudo grep "SSH_BLOCKED" /var/log/kern.log
sudo tail -f /var/log/kern.log | grep SSH_BLOCKED
sudo journalctl -k | grep SSH_BLOCKED
**Сохранение и восстановление правил**
!!! После перезагрузки правила сбрасываются
Сохранить правила:
sudo iptables-save > /etc/iptables/rules.v4
Восстановить правила:
sudo iptables-restore < /etc/iptables/rules.v4
Чтобы автоматически восстанавливать правила, ставим пакет:
sudo apt install iptables-persistent
Сохранить правила:
sudo netfilter-persistent save
Включить службу:
sudo systemctl enable netfilter-persistent
Модуль iptables в Ansible
- name:
- iptables:
- chain: (обязательный) Цепочка правил: INPUT, OUTPUT, FORWARD
- protocol: Протокол: tcp, udp, icmp, all
- source: IP-адрес или подсеть: 192.168.10.1; 192.168.10.1/24
- in_interface: Интерфейс для входящего трафика
- out_interface: Интерфейс для исходящего трафика
- destination_port: Порт получателя/отправителя (число или диапазон) — 22 или 1000:20000
- jump: (обязательный) Действие при совпадении: ACCEPT, DROP, REJECT, LOG, RETURN
log_prefix — Префикс для записи в логах: "BLOCKED-SSH: ".
state — present — добавить правило; absent — удалить правило.
table — Таблица iptables: filter (по умолчанию), nat, mangle, raw.
comment — Комментарий к правилу (до 256 символов).
Параметры для работы с состояниями соединений:
ctstate — ESTABLISHED, RELATED, NEW, INVALID.
match — Подключение дополнительных модулей: state, multiport.
Параметры управления порядком правил:
action — Позиция правила в цепочке:
append — (по умолчанию) — добавить в конец;
insert — разместить в начале;
Репозитарий с ролью Ansible
- https://gitverse.ru/Lexa-nk/ansible-iptables.git
- ssh://git@gitverse.ru:2222/Lexa-nk/ansible-iptables.git