From d651e1d6afab557384c9465d1a542f26809ed90f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BE=D0=BB=D0=B3=D0=B8=D0=B9=20=D0=90=D1=80=D1=82?= =?UTF-8?q?=D1=91=D0=BC?= Date: Thu, 16 May 2024 14:24:49 +0300 Subject: [PATCH] mod --- iptables.md | 222 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 221 insertions(+), 1 deletion(-) diff --git a/iptables.md b/iptables.md index 5529e09..9d432f8 100644 --- a/iptables.md +++ b/iptables.md @@ -1,5 +1,20 @@ # iptables +- [iptables](#iptables) + - [Таблицы](#таблицы) + - [Цепочки](#цепочки) + - [Правила - условия и действия](#правила---условия-и-действия) + - [Просмотр](#просмотр) + - [Управление правилами и цепочками](#управление-правилами-и-цепочками) + - [Примеры](#примеры) + - [Пример первоначальной настройки](#пример-первоначальной-настройки) + - [Сброс всех правил цепочки filter](#сброс-всех-правил-цепочки-filter) + - [Отладка](#отладка) + - [Логирование отклоненных пакетов journald](#логирование-отклоненных-пакетов-journald) + - [Логирование отклоненных пакетов Rsyslog](#логирование-отклоненных-пакетов-rsyslog) + +*** + ## Таблицы - `filter` - основная таблица для фильтрации пакетов, используется по умолчанию; @@ -54,6 +69,9 @@ - `--ttl-eq N` - TTL пакета равен N; - `--ttl-lt N` - TTL пакета меньше N; - `--ttl-gt N` - TTL пакета больше N +- `-m multiport` - указать в правиле несколько портов, диапазон или набор: + - `-m multiport --dports 8080,22,80` - применяется к указанным портам; + - `-m multiport --dports 1024:65535` - применяется к диапазону портов Действия: @@ -64,7 +82,7 @@ - `--reject-with` - тип ответа, RFC 793 или `iptables -j REJECT -h` - `RETURN` - возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию -## Примеры +## Просмотр - Просмотр текущих правил @@ -72,10 +90,212 @@ iptables -L ``` +только для конкретной цепочки + +```bash +iptables -L INPUT +``` + более наглядно ```bash iptables -vnL --line-numbers ``` +- Список текущих правил + +```bash +iptables -S +``` + +- Очистка правил + +```bash + iptables -F +``` + +очистка правил конкретной цепочки + +```bash + iptables -F INPUT +``` + +**Стоит иметь ввиду, что очистка правил не изменяет правило по-умолчанию, если оно установлено в DROP, после очистки всех правил можно потерять доступ к узлу.** + +- Для полной очистки правил и отключения фильтрации + +```bash +iptables -P INPUT ACCEPT +iptables -P OUTPUT ACCEPT +iptables -P FORWARD ACCEPT +iptables -F +``` + +## Управление правилами и цепочками + +Добавить правило (разрешить весь трафик с tun интерфейсов) в конец цепочки INPUT (-A, --append): + +```bash +iptables -A INPUT -i tun+ -j ACCEPT +``` + +Вставить правило в позицию 2 цепочки INPUT (-I, --insert): + +```bash +iptables -I INPUT 2 -i lo -j ACCEPT +``` + +Установить политику по умолчанию DROP для цепочки INPUT (-P, --policy): + +```bash +iptables -P INPUT DROP +``` + +Создание новой цепочки правил: + +```bash +iptables -N LOGGING +``` + +## Примеры + +Предположим что для цепочки `INPUT` политика по умолчанию `DROP`, это значит что все входящие пакеты будут отброшены, но нам нужен некоторый входящий трафик. + +Разрешим трафик на локальный DNS сервер, без этого могут быть долгие подключения по ssh: + +```bash +iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT +``` + +Разрешим движение трафика из интерфейсов создаваемых Docker (при политиках по умолчанию `DROP`, контейнеры не смогут общаться с другими интерфейсами): + +```bash +iptables -A INPUT -i br+ -j ACCEPT +``` + +Разрешим любой входящий трафик из `localhost` и откроем `http/https` порты (80/443), например для случая когда у нас есть веб-сервер и наши сайты должны быть доступны снаружи: + +```bash +iptables -A INPUT -i lo -j ACCEPT +iptables -A INPUT -p tcp --dport 80 -j ACCEPT +iptables -A INPUT -p tcp --dport 443 -j ACCEPT +``` + +*Если не разрешить входящий трафик от `localhost` то могут быть странные задержки с ответами, а при дебаге можно увидеть отклоенные пакеты от 127.0.0.1* + +Теперь локальный DNS на 53 порту доступен, docker контейнеры тоже, с localhost трафик разрешен, и для внешнего мира открыты 80 и 443 порты для наших сайтов. Но это все только для установления соединения и рукопожатия. Теперь нам нужно разрешить все установленные и связанные с ними соединения чтобы трафик действительно пошел (еще вот): + +```bash +iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT +``` + +### Пример первоначальной настройки + +```bash +iptables -P INPUT ACCEPT +iptables -P OUTPUT ACCEPT +iptables -P FORWARD ACCEPT +iptables -F + +iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT +iptables -A INPUT -p tcp -m multiport --dports 8080,22,80 -j ACCEPT +iptables -A INPUT -p udp --dport 69 -j ACCEPT +iptables -A INPUT -p tcp --dport 5000:5678 -j ACCEPT + +iptables -P INPUT DROP + +iptables --line-numbers -L -v -n +``` + +### Сброс всех правил цепочки filter + +```bash +iptables -P INPUT ACCEPT +iptables -P OUTPUT ACCEPT +iptables -P FORWARD ACCEPT +iptables -F +``` + +## Отладка + +### Логирование отклоненных пакетов journald + +Работа iptables происходит на уровне ядра ОС, соответственно все события логируются также на уровне ядра. + +Добавляем правило логирования каждого пакета с префиксом: + +```bash +iptables -A INPUT -j LOG --log-level info --log-prefix "IPTABLES-DROP: " +``` + +Вывод сообщений ядра + +```bash +journalctl -k +``` + +или + +```bash +journalctl -k -f +``` + +### Логирование отклоненных пакетов Rsyslog + +*Полезно иметь возможно отладить свои правила, экономия времени и iptables становится понятнее.* + +Суть отладки правил iptables такова: + +создаем отдельную цепочку, куда будем перенаправлять весь трафик, который должен быть отклонен в новой цепочке ведем логирование и отклоняем пакеты +направляем запросы для теста правил и смотрим лог отклоенных пакетов + +Создание новой цепочки: + +```bash +iptables -N LOGGING +``` + +Добавляем правило логирования каждого пакета с префиксом: + +```bash +iptables -A LOGGING -j LOG --log-prefix "ipt denied: " +``` + +Отклоняем пакет: + +```bash +iptables -A LOGGING -j DROP +``` + +В цепочку, откуда будут приходить пакеты для отклонения добавляем новое правило перенаправления в новую цепочку логирования: + +```bash +iptables -A INPUT -j LOGGING +``` + +Теперь добавим конфиг rsyslog: + +```bash +nano /etc/rsyslog.d/10-iptables.conf +``` + +Вставим следующий текст: + +```bash +:msg, contains, "ipt denied: " -/var/log/iptables.log +& ~ +``` + +Сохраним и перезагрузим демона rsyslog: + +```bash +service rsyslog restart +``` + +Теперь откроем файл и будем следить за 20 последних строк: + +```bash +echo > /var/log/iptables.log +tail -f -n 20 /var/log/iptables.log +```