Iptables просмотр правил windows

В этой небольшой публикации я подготовлю своего рода шпаргалку по работе с iptables. Поскольку iptables в своей основе использует, например, ufw. Подчеркну, что это далеко не исчерпывающий материал, а скорее именно шпаргалка по тем командам, которые я использую чаще всего.

Я лишь подготовлю для себя (и вас) краткую шпаргалку по основным командам.

Просмотр текущих правил iptables

Одна из самых часто используемых команд – просмотр всех текущих правил:

sudo iptables -S

Либо второй вариант – отображение всех правил с группировкой по цепочкам:

sudo iptables -L

Также можно указать название цепочки, для которой необходимо отобразить правила:

sudo iptables -L INPUT
sudo iptables -S OUTPUT

Просмотр с отображением порядкового номера правила для каждой цепочки:

sudo iptables -L --line-numbers

Добавление правил iptables

Для добавления правил iptables используется параметр -A (append).

iptables -A

Пример добавления правила для SSH:

sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Пример добавления правила для HTTPS:

sudo iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT

Блокирование определенного IP-адреса:

sudo iptables -A INPUT -s 87.236.16.250 -j DROP

Добавление правила в определенную позицию в цепочке правил. Ниже пример для добавления разрешающего правила входящих HTTP подключений, которое будет находится третьим по порядку в цепоче INPUT.

sudo iptables -I INPUT 3 -p tcp --dport 80 -j ACCEPT

Изменение правил iptables

Для изменения правил iptables используется параметр -R (replace).

iptables -R

Удобнее все редактировать правила по их порядковому номеру. Например, сначала определим порядковый номер запрещающего правила для IP-адреса 87.236.16.250:

sudo iptables -L INPUT --line-numbers

Теперь отредактируем правило – изменим адрес на 1.1.1.1:

sudo iptables -R INPUT 4 -s 1.1.1.1 -j DROP

Удаление правил iptables

Для добавления правил iptables используется параметр -D (delete).

iptables -D

Удаление первого вхождения правила, которое запрещает подключение с IP-адреса 87.236.16.250. Если идентичных правил будет несколько, то удалиться только первое из них.

sudo iptables -D INPUT -s 1.1.1.1 -j DROP

Удаление правила для разрешения SSH подключений:

sudo iptables -D INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT

Удаление определенного номера правила в указанной цепочке. Пример для удаления правила №3 из цепочки INPUT.

sudo iptables -D INPUT 3

Удаление всех правил из определенной цепочки iptables.

sudo iptables -F OUTPUT

Удаление всех правил iptables.

sudo iptables -F

Минимальный набор правил

Вам не обязательно использовать непосредственно iptables. Вместо iptables современные дистрибутивы предлагаю другие инструменты. Например, ufw или firewall-cmd. Но, если вы все же решили использовать именно iptables, то нужно немного подготовить систему для этого.

Примеры ниже приведены для дистрибутива Linux Mint. Для других дистрибутивов последовательность действий будет примерно такая же.

Сначала необходимо создать файл для хранения правил iptables:

sudo nano /etc/sysconfig/iptables

Добави набор минимально необходимых правил.

configuration
∗filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-unreachable
-A FORWARD -j REJECT --reject-with icmp-host-unreachable
COMMIT

Сохраняем внесенные изменения.

В таблице ниже я приведу очень краткое описание каждой строчки из правил iptables.

Правило Назначение
*filter Все строочки ниже будут добавлены в таблицу FILTER
:INPUT ACCEPT [0:0] Принимать все пакеты в цепочке INPUT
:FORWARD ACCEPT [0:0] Принимать все пакеты в цепочке FORWARD
:OUTPUT ACCEPT [0:0] Принимать все пакеты в цепочке OUTPUT
-A INPUT -m state –state RELATED,ESTABLISHED -j
ACCEPT
Принимать подключение от уже установленных соединений
-A INPUT -p icmp -j ACCEPT Принимать ICMP запросы
-A INPUT -i lo -j ACCEPT Принимать все подключения на loopback интерфейсе
-A INPUT -j REJECT –reject-with icmp-host-unreachable Отклонить все не разрешенные соединения в цепочке INPUT
-A FORWARD -j REJECT –reject-with icmp-host-unreachable Отклонить все не разрешенные соединения в цепочке FORWARD
COMMIT Подтвердить применение правил выше

Сохранение правил iptables

По умолчанию, если вы добавляете какие-то правила iptables, то они не сохраняются после перезагрузки системы. Для того, чтобы это исправить вы можете использовать утилиту iptables-save.

Использование утилиты предельно простое:

sudo iptables-save

По мере работы Шпаргалка по iptables будет дополняться.

Время на прочтение6 мин

Количество просмотров152K

 Схема работы Iptables:

Схема работы Iptables:

Iptables как с ним работать 

Iptables — это мощный инструмент управления сетью в Linux, который позволяет администраторам управлять входящими и исходящими пакетами данных. Это основной инструмент для настройки межсетевых экранов в системах Linux.

Введение в Iptables

Iptables работает путем проверки пакетов данных на соответствие определенным критериям и выполнения заданных действий, если пакеты соответствуют этим критериям. Эти критерии и действия определяются в таблицах, которые состоят из набора правил.

В Iptables есть четыре основные таблицы:

  1. Filter — это основная таблица, используемая для фильтрации пакетов.

  2. NAT — эта таблица используется для настройки NAT (Network Address Translation).

  3. Mangle — эта таблица используется для специальной обработки пакетов.

  4. Raw — эта таблица используется для обхода системы отслеживания состояний.

Каждая таблица состоит из набора цепочек. Цепочки — это последовательности правил, которые применяются к пакетам. В Iptables есть три встроенные цепочки:

  1. INPUT — эта цепочка применяется к пакетам, которые предназначены для самой системы.

  2. FORWARD — эта цепочка применяется к пакетам, которые проходят через систему.

  3. OUTPUT — эта цепочка применяется к пакетам, которые исходят из системы.

Базовые команды Iptables

Просмотр текущих правил

Чтобы просмотреть текущие правила, используйте команду iptables -L. Это покажет все правила в таблице filter. Чтобы просмотреть правила в другой таблице, используйте флаг -t, например, iptables -t nat -L.

Добавление новых правил

Чтобы добавить новое правило, используйте команду iptables -A. Например, чтобы заблокировать весь входящий трафик от IP-адреса 192.168.0.100, вы можете использовать следующую команду:

iptables -A INPUT -s 192.168.0.100 -j DROP 

В этой команде -A INPUT добавляет новое правило в цепочку INPUT, -s 192.168.0.100 определяет исходный IP-адрес, а -j DROP указывает, что все пакеты, соответствующие этому правилу, должны быть отброшены.

Удаление правил

Чтобы удалить правило, вам нужно знать его номер в цепочке. Вы можете узнать номера правил, используя команду iptables -L --line-numbers. Затем вы можете удалить правило, используя команду iptables -D и номер правила. Например, чтобы удалить первое правило в цепочке INPUT, вы можете использовать следующую команду:

iptables -D INPUT 1 

Изменение дефолтного политики

Вы можете изменить дефолтную политику для цепочки, используя команду iptables -P. Например, чтобы отклонить все входящие пакеты по умолчанию, вы можете использовать следующую команду:

iptables -P INPUT DROP 

Сохранение и восстановление правил

По умолчанию, правила iptables не сохраняются после перезагрузки системы. Чтобы сохранить текущие правила, вы можете использовать команду iptables-save. Это выведет текущие правила в формате, который можно использовать для восстановления с помощью команды iptables-restore.

iptables-save > /path/to/iptables/rules 

Затем, чтобы восстановить правила, вы можете использовать следующую команду:

iptables-restore < /path/to/iptables/rules 

Примеры использования Iptables

Блокировка IP-адреса

Чтобы заблокировать весь трафик от определенного IP-адреса, вы можете использовать следующую команду:

iptables -A INPUT -s 192.168.0.100 -j DROP 

Открытие порта для входящего трафика

Чтобы открыть порт для входящего трафика, вы можете использовать следующую команду:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT 

В этой команде -p tcp указывает на протокол (в данном случае TCP), --dport 80 указывает на порт (в данном случае 80), а -j ACCEPT указывает, что все пакеты, соответствующие этому правилу, должны быть приняты.

Настройка простого межсетевого экрана

Вы можете использовать iptables для настройки простого межсетевого экрана. Например, вы можете разрешить весь исходящий трафик, разрешить входящий трафик только на определенные порты и отклонить все остальные входящие пакеты.

iptables -A OUTPUT -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -P INPUT DROP 

В этом примере разрешен весь исходящий трафик, а входящий трафик разрешен только на порты 22 (SSH), 80 (HTTP) и 443 (HTTPS). Все остальные входящие пакеты отклоняются.

Расширенное использование Iptables

Логирование

Iptables предоставляет возможность логирования пакетов, что может быть полезно для отладки и мониторинга. Для включения логирования используйте цель LOG. Например, чтобы залогировать все отброшенные пакеты, можно использовать следующую команду:

iptables -A INPUT -j LOG --log-prefix "Dropped Packet: " iptables -A INPUT -j DROP 

Здесь --log-prefix "Dropped Packet: " добавляет указанный префикс к каждому лог-сообщению, что упрощает фильтрацию и анализ логов.

Создание пользовательских цепочек

Iptables позволяет создавать пользовательские цепочки для более гибкого управления правилами. Например, вы можете создать цепочку для обработки всего трафика от определенного IP-адреса:

iptables -N MY_CHAIN iptables -A MY_CHAIN -s 192.168.0.100 -j DROP iptables -A INPUT -j MY_CHAIN 

В этом примере команда -N MY_CHAIN создает новую цепочку с именем MY_CHAIN. Затем добавляется правило, которое отбрасывает все пакеты от 192.168.0.100. Наконец, цепочка MY_CHAIN добавляется в цепочку INPUT, что означает, что все входящие пакеты будут также проходить через цепочку MY_CHAIN.

Использование состояний пакетов

Iptables может отслеживать состояние пакетов, что позволяет создавать более сложные правила. Например, вы можете разрешить только входящие пакеты, которые являются частью уже установленного соединения:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 

В этом примере -m state указывает на использование модуля состояний, а --state ESTABLISHED,RELATED указывает, что правило применяется только к пакетам, которые являются частью уже установленного или связанного соединения.

Использование Iptables для создания VPN

Iptables также может быть использован для создания VPN (Virtual Private Network). Это может быть полезно для создания безопасного соединения между удаленными системами. Например, вы можете использовать iptables для настройки IPsec VPN, используя модуль «policy» для определения правил обработки трафика.

iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT iptables -A OUTPUT -m policy --dir out --pol ipsec -j ACCEPT 

В этом примере -m policy указывает на использование модуля «policy», --dir in и --dir out указывают на направление трафика, а --pol ipsec указывает на использование IPsec политики.

Использование Iptables для ограничения скорости

Iptables также может быть использован для ограничения скорости сетевого трафика, что может быть полезно для управления пропускной способностью. Для этого можно использовать модуль «limit». Например, вы можете ограничить количество новых SSH-соединений до 3 в минуту следующим образом:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m limit --limit 3/min -j ACCEPT 

В этом примере -m limit --limit 3/min указывает на ограничение скорости, а остальная часть команды определяет, что она применяется к новым SSH-соединениям.

Использование Iptables для редиректа трафика

Iptables может быть использован для редиректа трафика, что может быть полезно для перенаправления трафика на другой порт или сервер. Например, вы можете перенаправить весь входящий трафик на порт 80 на порт 8080 следующим образом:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 

В этом примере -t nat указывает на использование таблицы NAT, -A PREROUTING добавляет правило в цепочку PREROUTING, --dport 80 указывает на исходный порт, а --to-port 8080 указывает на порт назначения.

Iptables — это мощный и гибкий инструмент, который может быть использован для решения множества задач управления сетью. Однако, как и любой мощный инструмент, он требует тщательного понимания и практики для эффективного использования.

Заключение

Iptables является мощным и гибким инструментом для управления сетью в Linux. Он предлагает широкий спектр функций, включая фильтрацию пакетов, NAT, логирование и многое другое. Однако, несмотря на его мощь, iptables может быть сложным для новичков. Надеюсь, эта статья помогла вам разобраться в основах работы с iptables и дала вам основу для дальнейшего изучения этого мощного инструмента.

Управление iptables

service iptables stop - Остановка
service iptables start - Запуск
service iptables restart - Перезагрузка
service iptables save - Сохранить правила брандмауэра (CentOS / RHEL / Fedora Linux)
iptables-save - Сохранить правила
iptables-save > /root/my.active.firewall.rules - Сохранить правила (в других дистрибутивах)

Включение ip forward (трафик меджу интерфейсами)

echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -p

tools

iptables -L - вывести список правил
iptables -S - вывести список правил
iptables -L -n -v  - вывести список правил (-n не резолвить IP) (-v Отображение подробной информации)
iptables -L -n -v --line-numbers - просмотр правил с номером строки
iptables -L INPUT -n -v - просмотра INPUT
iptables -L OUTPUT -n -v --line-numbers - просмотра OUTPUT
iptables -L INPUT -n --line-numbers  - просмотр правил с номером строки в INPUT
iptables -L OUTPUT -n --line-numbers  - просмотр правил с номером строки в OUTPUT
iptables -L OUTPUT -n --line-numbers | less - просмотр правил с номером строки в OUTPUT перенаправив вывод в less
iptables -L OUTPUT -n --line-numbers | grep 8.8.8.8 - просмотр правил с номером строки в OUTPUT грепаем 8.8.8.8

Очистка таблицы filter:

iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

Очистка таблицы nat:

iptables -t nat -F PREROUTING
iptables -t nat -F POSTROUTING

Очистка таблицы mangle:

iptables -t mangle -F PREROUTING
iptables -F - Удаление всех правил (flushing)
iptables -X - Удаление цепочки
iptables -t nat -F - Выбрать таблицу и удалить правила
iptables -t nat -X - Выбрать таблицу и удалить правила
iptables -t mangle -F - Выбрать таблицу и удалить правила
iptables -t mangle -X - Выбрать таблицу и удалить правила
iptables -P INPUT ACCEPT - Установить политику по умолчанию
iptables -P OUTPUT ACCEPT  - Установить политику по умолчанию
iptables -P FORWARD ACCEPT  - Установить политику по умолчанию

Очистка правил подробно:

Чистим ветки логов:

iptables -F undef_in
iptables -F undef_out
iptables -F undef_fw
iptables -X undef_in
iptables -X undef_out
iptables -X undef_fw

Закрываем всё:

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Включаем NAT:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Разрешаем принимать трафик на loopback-интерфейсе:

iptables -A INPUT eth2 -j ACCEPT
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i lo -o eth1 -j ACCEPT$IPT -A FORWARD -i eth2 -o lo -j ACCEPT
iptables -A FORWARD -i lo -o eth2 -j ACCEPT$IPT -A FORWARD -i eth1 -o lo -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Разрешение исходящего трафика:

iptables -A OUTPUT -o eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A OUTPUT -o eth2 -j ACCEPT

Разрешить соединения, которые инициированы изнутри:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

Следующими правилами разрешаем коннекты на наш сервер из вне:

iptables -A INPUT -p udp --dport 33434:33523 -j ACCEPT - Разрешить traceroute
iptables -A INPUT -p tcp --dport 22 -j ACCEPT - Разрешаем SSH
iptables -A INPUT -p tcp --dport 10000 -j ACCEPT - Разрешаем webmin
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT - Доступ на http

Проброс RDP на сервер терминалов:

iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.0.100
iptables -A FORWARD -i eth0 -d 192.168.0.100 -p tcp --dport 3389 -j ACCEPT

Выход из локалки на почтовые сервера:

iptables -A FORWARD -d smtp.mail.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT
iptables -A FORWARD -d smtp.masterhost.ru -o eth0 -p tcp -m tcp --dport 25 -j ACCEPT

Заворачиваем трафик на порт сквида:

iptables -t nat -A PREROUTING -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -p udp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -s 0/0 -d 0/0 -j REDIRECT --to-port 3128

Если прокси не установлена, либо нет нужды в использовании SQUID, то просто форвардим нужные порты:

iptables -A FORWARD -o eth0 -p tcp -m multiport --dport 80,81,82,83,88,8000,8001,8002,8080,8081,3128,9090 -j ACCEPT 

Прячем NAT:

iptables -t mangle -A PREROUTING -j TTL --ttl-set 64
iptables -t mangle -A PREROUTING -j RETURN

Все что не разрешено, но ломится отправим в цепочку undef:

iptables -N undef_in
iptables -N undef_out
iptables -N undef_fw
iptables -A INPUT -i vlan2 -j undef_in
iptables -A OUTPUT -j undef_out
iptables -A FORWARD -j undef_fw

Логировать все из цепочки undef:

iptables -A undef_in -j LOG --log-level info --log-prefix "--- IN --- DROP "
iptables -A undef_in -j DROP
iptables -A undef_out -j LOG --log-level info --log-prefix " --- OUT --- DROP "
iptables -A undef_out -j DROP
iptables -A undef_fw -j LOG --log-level info --log-prefix "--- FW --- DROP "
iptables -A undef_fw -j DROP

Антибрут ssh:

iptables -A INPUT -m state  --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --set --name SSH
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW  -m recent --update --seconds 60  --hitcount 4 --rttl --name SSH -j DROP
iptables -A INPUT -p tcp -m tcp  --dport 22 -m state --state NEW -j ACCEPT
После этого хосты, пытающиеся перебирать пароль, будут блокироваться: 
все IP из черного списка будут фиксироваться в файле /proc/net/ipt_recent/SSH

Разрешаем некоторые ICMP-сообщения:

https://ru.wikipedia.org/wiki/ICMP  - icmp-type
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT

open firewall:

iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m tcp --tcp-flags  SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT # Небольшая защита от DoS
iptables -A INPUT -p all -m state --state  RELATED,ESTABLISHED -j ACCEPT # Разрешаем уже установленные соединения
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT # Разрешаем 22 порт
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT # Разрешаем 80 порт
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 3 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 11 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT -i eth0 -p icmp -m icmp  --icmp-type 12 -j ACCEPT # Разрешаем некоторые ICMP-сообщения
iptables -A INPUT DROP

Еще несколько полезных команд

# iptables -t filter -L

Вывести список всех цепочек правил

# iptables -t nat -L

Вывести все цепочки из NAT таблицы

# iptables -t nat -F

Очистить все цепочки правил в таблице NAT

# iptables -t filter -X

Очистить все пользовательские цепочки правил в таблице filter

# iptables -t filter -F

Очистить все цепочки правил в таблице filter

# iptables -t filter -A INPUT -p tcp --dport telnet -j ACCEPT

Разрешить входящие соединения с telnet

# iptables -t filter -A OUTPUT -p tcp --dport http -j DROP

Запретить исходящие HTTP соединения

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

включить NAT (Network Address Translate) исходящих пакетов на интерфейс eth0. Допустимо при использовании с динамически выделяемыми ip-адресами.

# iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp -m tcp --dport 22 -j DNAT --to-destination 10.0.0.2:22

Пересылка пакетов, адресованных одному хосту, на другой хост

# iptables -t filter -A INPUT -j LOG --log-prefix

Включить логгирование пакетов, проходящих через цепочку INPUT, и добавлением к сообщению префикса «DROP INPUT»

# iptables -t filter -A FORWARD -p tcp --dport pop3 -j ACCEPT

Разрешить форвардинг POP3 соединений

  • Что это и для чего?
  • Терминология
  • Работа с iptables

    • Просмотр
    • Управление правилами и цепочками
    • Примеры
    • Сброс всех правил таблицы filter
  • Отладка

    • Логирование отклоненных пакетов
  • Сохранение
  • Литература

Возможно, это не законченный вариант статьи. Шпаргалка будет обновляться, по мере того как я буду узнавать что-то новое или находить ошибки.

Что это и для чего?

Iptables — утилита командной строки для управления брандмауэром netfilter ядра Linux >=2.4.

В книге «Unix и Linux Руководство системного администратора» дается следующее описание iptables:

Утилита iptables применяет к сетевым пакетам упорядоченные цепочки правил. Наборы цепочек образуют таблицы и используются для обработки определенных видов трафика.

По умолчанию используется таблица filter. Цепочки правил в этой таблице используются для пакетной фильтрации сетевого трафика

Ручная настройка, особенно впервые, вызывает значительные затруднения, авторы указанной книги этого не отрицают.

Терминология

iptables включает следующие таблицы:

  • filter — фильтрация сетевого трафика
  • nat — управление преобразованием сетевых адресов
  • mangle — модификация и замена содержимого сетевых пакетов вне контекста NAT и фильтрации пакетов

Рассматривать мы будем именно filter, которая является таблицей по умолчанию для всех команд утилиты iptables, если иное не сказано явно.

Цепочка — это упорядоченный набор правил.

Цепочки бывают базовые/встроенные и пользовательские (можно создать самому).

К базовым цепочкам относятся:

  • INPUT — входящий трафик (адресованный локальному хосту)
  • FORWARD — транзитный трафик поступающий на локальную машину с целью передачи его на другую машину (трафик передаваемый в docker контейнер тоже будет считаться транзитным), при этом транзитный трафик проходит в обоих направлениях (с текущей машины на другую и с другой машины на текущую)
  • OUTPUT — исходящий из локального хоста трафик

В новую цепочку можно направлять пакеты чтобы подвергуть их анализу правил. Например для отладки правил или настройки особого движения пакетов как это сделано в Docker.

Правило — состоит из условия/критерия (если нет значит применяется ко всему трафику) действия (может не быть) и счетчика (для учета пакетов попавших под правило).

Условия:

  • -p — протокол (TCP, UDP, ICMP, ALL)
  • -s — ip адрес источника (можно с маской 10.0.0.0/24), допускается отрицание (т.е. все кроме) -s ! 10.0.0.0/24
  • -d — ip адрес получателя (аналогично -s)
  • -i — интерфейс с которого пришел пакет (только для INPUT, FORWARD, PREROUTING), например ens3, допускается указать ens+ что означает все имена интерфейсов начинающиеся с заданной строки, допускается отрицание -i ! ens+
  • -o — интерфейс локального хоста, из которого выходит трафик (только для OUTPUT, FORWARD, PREROUTING)
  • --sport — порт с которого был отправлен TCP/UDP пакет (допускаются имена служб из /etc/services), поддерживаются диапазоны вида 20:80 что значит от 20 до 80 порта, так же можно опустить одно из значений :80 (от 0 до 80) или 20: (от 20 до 65535), отрицание поддерживается даже к диапазонам --sport ! 20:80
  • --dport — аналогично --sport только речь идет про порт, которому адресован пакет
  • --icmp-type — тип ICMP сообщения (номер или название), поддерживается отрицание. RFC 792 или iptables --protocol icmp --help
  • -m mac --mac-sourceMAC адрес устройства передавшего пакет, поддерживается отрицание
  • -m state --state — состояние соединения:

    • INVALID — неизвестное соединение, возможно ошибочное
    • NEW — новое соединение
    • ESTABLISHED — уже установленное соединение
    • RELATED — пакет принадлежит уже существующему соединению, но он отправляется по новому
  • -m ttl — Time To Live:

    • --ttl-eq NTTL пакета равен N
    • --ttl-lt NTTL пакета меньше N
    • --ttl-gt NTTL пакета больше N

Действия:

  • ACCEPT — пакет принят в текущей таблице
  • DROP — пакет сбрасывается и перестает движение в системе
  • LOG — пакет журналируется и продолжает дальнейшие движение по цепочке правил и таблицам (рассмотрим ниже)
  • REJECT — аналогично DROP только отдает сообщение об ошибке на хост отправителя (работает на всех цепочках таблицы filter):

    • --reject-with — тип ответа, RFC 793 или iptables -j REJECT -h
  • RETURN — возврат пакета в вышестоящую цепочку для применения действия по умолчанию, при отсутствии вышестоящей цепочки применится действие по умолчанию

Работа с iptables

Правила iptables действуют до перезагрузки системы, так что если было сделано что-то не так, можно перезагрузить машину и правила iptables будут сброшены.

Просмотр

Справка вызывается стандартно:

$ sudo iptables -h

А так можно просмотреть таблицу filter в табличном виде со статистикой и нумерацией правил:

$ sudo iptables -vnL --line-numbers

Просмотр таблицы filter в iptables

Это скриншот правил таблицы filter для vpn сервера, здесь видно что:

  • для цепочки INPUT политика по умолчанию DROP, в итоге было отброшено 78606 пакетов (4536кб)
  • для цепочки FORWARD политика по умолчанию тоже DROP, но пакетов подходящих под правила не было
  • для цепочки OUTPUT политика по умолчанию ACCEPT и через эту цепочку прошло 347 млн. пакетов (59гб)

Также можно распечатать правила:

$ sudo iptables -S

Вывод:

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A INPUT -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
-A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Управление правилами и цепочками

Добавить правило (разрешить весь трафик с tun интерфейсов) в конец цепочки INPUT (-A, --append):

$ sudo iptables -A INPUT -i tun+ -j ACCEPT

Вставить правило в позицию 2 цепочки INPUT (-I, --insert):

$ sudo iptables -I INPUT 2 -i lo -j ACCEPT

Установить политику по умолчанию DROP для цепочки INPUT (-P, --policy):

$ sudo iptables -P INPUT DROP

Создание новой цепочки правил:

$ sudo iptables -N LOGGING

Примеры

Предположим что для цепочки INPUT политика по умолчанию DROP, это значит что все входящие пакеты будут отброшены, но нам нужен некоторый входящий трафик.

Разрешим трафик на локальный DNS сервер, без этого могут быть долгие подключения по ssh:

$ sudo iptables -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Разрешим движение трафика из интерфейсов создаваемых Docker (при политиках по умолчанию DROP, контейнеры не смогут общаться с другими интерфейсами):

$ sudo iptables -A INPUT -i br+ -j ACCEPT

Разрешим любой входящий трафик из localhost и откроем http/https порты (80/443), например для случая когда у нас есть веб-сервер и наши сайты должны быть доступны снаружи:

$ sudo iptables -A INPUT -i lo -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
$ sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Если не разрешить входящий трафик от localhost то могу быть странные задержки с ответами, а при дебаге можно увидеть отклоенные пакеты от 127.0.0.1

Теперь локальный DNS на 53 порту доступен, docker контейнеры тоже, с localhost трафик разрешен, и для внешнего мира открыты 80 и 443 порты для наших сайтов. Но это все только для установления соединения и рукопожатия. Теперь нам нужно разрешить все установленные и связанные с ними соединения чтобы трафик действительно пошел (еще вот):

$ sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT

Сброс всех правил таблицы filter

# удаление всех цепочек
$ sudo iptables -F

# разрешение всего входящего трафика
$ sudo iptables -P INPUT ACCEPT

# разрешение перенаправление трафика
$ sudo iptables -P FORWARD ACCEPT

# разрешение всего исходящего трафика
$ sudo iptables -P OUTPUT ACCEPT

Отладка

Логирование отклоненных пакетов

Полезно иметь возможно отладить свои правила, экономия времени и iptables становится понятнее.

Суть отладки правил iptables такова:

  • создаем отдельную цепочку, куда будем перенаправлять весь трафик, который должен быть отклонен
  • в новой цепочке ведем логирование и отклоняем пакеты
  • направляем запросы для теста правил и смотрим лог отклоенных пакетов

Создание новой цепочки:

$ sudo iptables -N LOGGING

Добавляем правило логирования каждого пакета с префиксом:

$ sudo iptables -A LOGGING -j LOG --log-prefix  "ipt denied: "

Отклоняем пакет:

$ sudo iptables -A LOGGING -j DROP

В цепочку, откуда будут приходить пакеты для отклонения добавляем новое правило перенаправления в новую цепочку логирования:

$ sudo iptables -A INPUT -j LOGGING

Теперь добавим конфиг rsyslog:

$ sudo nano /etc/rsyslog.d/10-iptables.conf

Вставим следующий текст:

:msg, contains, "ipt denied: " -/var/log/iptables.log
& ~

Сохраним и перезагрузим демона rsyslog:

$ sudo service rsyslog restart

Теперь откроем файл и будем следить за 20 последних строк:

$ sudo echo > /var/log/iptables.log
$ sudo tail -f -n 20 /var/log/iptables.log

Можно наблюдать что-то такое:

Feb 19 17:43:36 logic kernel: [14331.939805] ipt denied: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=20640 DF PROTO=TCP SPT=49104 DPT=6000 WINDOW=65495 RES=0x00 SYN URGP=0 
Feb 19 17:43:44 logic kernel: [14340.132036] ipt denied: IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=20641 DF PROTO=TCP SPT=49104 DPT=6000 WINDOW=65495 RES=0x00 SYN URGP=0 
Feb 19 17:43:46 logic kernel: [14342.030775] ipt denied: IN=ens3 OUT= MAC=52:54:00:10:23:3f:4c:96:14:68:fb:f0:08:00 SRC=78.155.213.173 DST=185.105.90.67 LEN=40 TOS=0x00 PREC=0x00 TTL=250 ID=8008 PROTO=TCP SPT=57587 DPT=54402 WINDOW=1024 RES=0x00 SYN URGP=0 
Feb 19 17:43:52 logic kernel: [14348.160719] ipt denied: IN=ens3 OUT= MAC=52:54:00:10:23:3f:4c:96:14:68:fb:f0:08:00 SRC=89.248.165.209 DST=185.105.90.67 LEN=40 TOS=0x00 PREC=0x00 TTL=248 ID=63021 PROTO=TCP SPT=49784 DPT=23988 WINDOW=1024 RES=0x00 SYN URGP=0 

Сохранение

При перезагрузке системы правила iptables будут сброшены.

Чтобы происходило восстановление сохраненных правил нужен пакет iptables-persistent:

$ sudo apt install iptables-persistent

Необходимо проверить работает ли демон systemd:

$ sudo systemctl status netfilter-persistent

Если нет, его нужно запустить:

$ sudo systemctl start netfilter-persistent

После настройки и отладки правил iptables нужно сохранить их в файл /etc/iptables/rules.v4 чтобы при старте системы демон netfilter-persistent загрузил их в iptables.

Сохранение правил iptables в файл:

$ sudo iptables-save > /etc/iptables/rules.v4

Теперь правила должны загружаться после перезагрузки системы.

Для ручной загрузки правил правил из файла в iptables можно сделать так:

$ sudo iptables-restore < /etc/iptables/rules.v4

Литература

Эта шпаргалка не получилась бы без сторонних источников откуда я черпал информацию для изучения. Здесь я узнал про сохранение правил iptables, а в этом руководстве почерпнул много теории (и здесь). На некоторые вопросы дал ответы этот топик, а про локальный dns узнал здесь. Отладку взял отсюда, а доделать правила для vpn помог этот топик.

В телеграм канале DevOps от первого лица можно оставить комментарий или почитать интересные истории из практики DevOps

Материал из Wiki — Iphoster — the best ever hosting and support. 2005 — 2025

Перейти к:навигация, поиск

Iptables — как посмотреть все правила

Для того чтобы посмотреть все правила iptables — нужно выполнить нижеследующую команду:

# iptables -L --line-numbers -v -n
-n - перевод домена в числовой IP адрес

пример вывода:

Chain SMTPOUTPUT (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 25,587,465 owner GID match 10
2    43541  107M ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 25,587,465 owner GID match 93
3        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           multiport dports 25,587,465 owner GID match 12

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • Не удается установить обновление windows из за ошибки 2147944030
  • Не работают эмуляторы андроид на windows 10
  • Лучший audio плеер для windows 10
  • Как пользоваться rufus на флешку windows 10
  • Восстановление флешки не видит windows