В этой небольшой публикации я подготовлю своего рода шпаргалку по работе с 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 — это мощный инструмент управления сетью в Linux, который позволяет администраторам управлять входящими и исходящими пакетами данных. Это основной инструмент для настройки межсетевых экранов в системах Linux.
Введение в Iptables
Iptables работает путем проверки пакетов данных на соответствие определенным критериям и выполнения заданных действий, если пакеты соответствуют этим критериям. Эти критерии и действия определяются в таблицах, которые состоят из набора правил.
В Iptables есть четыре основные таблицы:
-
Filter — это основная таблица, используемая для фильтрации пакетов.
-
NAT — эта таблица используется для настройки NAT (Network Address Translation).
-
Mangle — эта таблица используется для специальной обработки пакетов.
-
Raw — эта таблица используется для обхода системы отслеживания состояний.
Каждая таблица состоит из набора цепочек. Цепочки — это последовательности правил, которые применяются к пакетам. В Iptables есть три встроенные цепочки:
-
INPUT — эта цепочка применяется к пакетам, которые предназначены для самой системы.
-
FORWARD — эта цепочка применяется к пакетам, которые проходят через систему.
-
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-source
—MAC
адрес устройства передавшего пакет, поддерживается отрицание -
-m state --state
— состояние соединения:-
INVALID
— неизвестное соединение, возможно ошибочное -
NEW
— новое соединение -
ESTABLISHED
— уже установленное соединение -
RELATED
— пакет принадлежит уже существующему соединению, но он отправляется по новому
-
-
-m ttl
— Time To Live:-
--ttl-eq N
—TTL
пакета равенN
-
--ttl-lt N
—TTL
пакета меньшеN
-
--ttl-gt N
—TTL
пакета больше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
для 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