Описание работы брендмауэра iptables

Описание работы брендмауэра iptables

Описание работы брендмауэра 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