Добрый день дорогой читатель, данное повествование не является
истиной в последней инстанции, это некая инструкция по управлению межсетевым экраном iptables (в основном для собственного пользования) на Arch Linux с пояснениями и все возможными мыслями. Так же подобные действия применимы и к другим дистрибутивам.
iptables – это утилита командной строки в Linux, используемая для настройки правил фильтрации сетевого трафика, работы межсетевого экрана (firewall) и управления сетевыми соединениями. Проще говоря, это инструмент, который позволяет администраторам контролировать, какие сетевые пакеты разрешены или заблокированы на сервере или компьютере.
В контексте повествования будем рассматривать машину-клиент. Так же рассмотрим базовые правила фильтрации трафика IPv4 и и немного упомянем IPv6.
Установка довольно таки проста следует установить одноименны пакет и запустить сервис(демон), приступим.
sudo pacman -S iptables
sudo systemctl enable iptables
sudo systemctl restart iptables
sudo systemctl status iptables
если нужно обрабатывать трафик IPv6 то запускается ip6tables аналогичным способом
sudo systemctl enable ip6tables
sudo systemctl restart ip6tables
sudo systemctl status ip6tables
iptables запущен, а теперь рассмотрим возможности по подробнее. В основном структура команды выглядит следующим образом:
iptables [ключи] [цепочка] [условия] -j [действия]
далее разберем каждый параметр команды
Основные ключи iptables
- --version - версия iptables.
- -A --append - добавляет правило в указанную цепочку.
- -I --insert - вставляет правило в указанную позицию.
- -D --delete - удаляет правило по номеру или совпадению.
- -R --replace - заменяет правило.
- -L --list - выводит список правил.
- -F --flush - Очищает (удаляет) все правила в указанной цепочке или во всех
цепочках, если цепочка не указана. Правила удаляются, но цепочки
остаются. - -X --delete-chain - Удаляет все пользовательские цепочки
- -Z --zero - Обнуляет счётчики пакетов и байт во всех во всех
цепочках, если цепочка не указана. Правила остаются, но счётчики
обнуляются. - -P --policy - устанавливает политику по умолчанию для цепочки ( ACCEPT, DROP, и т.д.).
Основные цепочки iptables
- INPUT - входящие пакеты
- OUTPUT - исходящие пакеты
- FORWARD - пересылаемые пакеты
Далее давайте разберем по каким условиям можем фильтровать трафик
Основные условия и параметры для правил
- -p [порт] - по протоколу, может принимать следующие значения tcp, udp, icmp, all
- -i [интерфейс] - по интерфейсу источника например -i lo соединения можно увидеть командой ip a
- -o [интерфейс] - по интерфейсу назначения например -o lo соединения можно увидеть командой ip a
- -s [IP или подсеть] - по источнику IP или сети выглядит так -s 192.168.0.12 или по подсети -s 192.168.0.0/24
- -d [IP или подсеть] - по назначению IP или сети выглядит так -d 192.168.0.12 или по подсети -d 192.168.0.0/24
- --sport [порт] - по порту источника по сути проброс порта например --sport 2489 --dport 2489 --sport порт источника --dport порт назначения используются с протоколами TCP/UDP
- --dport [порт] - по порту назначения по сути проброс порта например --sport 2489 --dport 2489 --sport порт источника --dport порт назначения используются с протоколами TCP/UDP
по состоянию соединения/пакета
- -m conntrack --ctstate - позволяет фильтровать по состоянию соединения. Состояния соединения бывают следующие
NEW - Новый запрос на установку соединения
ESTABLISHED - Пакет для уже установленного соединения
RELATED - Пакет, связанный с уже установленным соединением
INVALID - Некорректный или нераспознанный пакет
и конечно самое важно что с этими пакетами делать
- -j - Определяет, что делать с совпавшими пакетами, принимает следующие значения
ACCEPT - разрешить
DROP - сбросить без уведомления отправителя
REJECT - сбросить с уведомлением отправителя
LOG - логировать пакет
Довольно теории о ней можно говорить бесконечно, пора переходить к практике, посмотрим в каком состоянии iptables выполнив команды
iptables -nvL
ip6tables -nvL
из скрина видно по умолчанию политика ACCEPT то есть все соединения разрешены. Так дело не годится.
Для начала мы сбросим настройки iptables выполнив короткие команды
Сброс iptables
iptables -F # очистим все правила
iptables -X # удалим все пользовательские цепочки
iptables -Z # обнулим все счетчики пакетов и объемов данных
Опционально. тоже самое можно провернуть с ip6tables если будете использовать соединения IPv6
ip6tables -F # очистим все правила
ip6tables -X # удалим все пользовательские цепочки
ip6tables -Z # обнулим все счетчики пакетов и объемов данных
Политика по умолчанию. Давайте установим политику по умолчанию: блокировать входящие, разрешать исходящие, блокировать форвардинг, это базовая защита клиента
iptables -P INPUT DROP # весь входящий трафик блокируем
iptables -P FORWARD DROP # весь пересылаемый трафик блокируем
iptables -P OUTPUT ACCEPT # весь исходящий трафик разрешаем
Опционально для IPv6
ip6tables -P INPUT DROP # весь входящий трафик блокируем
ip6tables -P FORWARD DROP # весь пересылаемый трафик блокируем
ip6tables -P OUTPUT ACCEPT # весь исходящий трафик разрешаем
выполнив команды мы теряем доступ к интернету, так как мы заблокировали весь входящий трафик.
Приступим к решению этой проблемы добавлением правил фильтрации трафика.
Добавление правил выполняется по следующему шаблону
iptables -A [цепочка] [условия] -j [действия]
и так добавим три правила которые будут фильтровать трафик и разрешат доступ в интернет, приступим
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
давайте подробно разберем:
- -А - добавить правило
- INPUT - цепочка входящие
- -m conntrack --ctstate - состояние соединения ESTABLISHED и RELATED
- -j ACCEPT разрешить трафик
И так пробуем читать(пусть будет несуразно, но смысл вы уловите) в iptables добавить правило (-А) в цепочку входящие (INPUT) соединения в состоянии (-m conntrack --ctstate)установленные соединения (ESTABLISHED) и связанные соединения(RELATED) с действием разрешить(ACCEPT)
Данным правилом мы разрешаем входящий трафик и появится интернет. Идем дальше
iptables -A INPUT -i lo -j ACCEPT
- -А - добавить правило
- INPUT - цепочка входящие
- -i lo - интерфейс источника loopback
- -j ACCEPT разрешить трафик
следующее правило читаем, в iptables добавить правило (-А) в цепочку входящие (INPUT) по источнику интерфейса (-i lo) loopback с действием разрешить(ACCEPT)
Данным правилом мы разрешаем локальный трафик. Это нужно для некоторых приложений. Идем дальше
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
- -А - добавить правило
- INPUT - цепочка входящие
- -m conntrack --ctstate - состояние пакета INVALID
- -j DROP запретить трафик
читаем, в iptables добавить правило (-А) в цепочку входящие (INPUT) соединения (-m conntrack --ctstate) в состоянии поврежденный пакет (INVALID) с действием сбросить без уведомления отправителя(DROP)
Эти три правила опционально можно внести и в ip6tables если пользуетесь IPv6 соединением
ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
ip6tables -A INPUT -i lo -j ACCEPT
ip6tables -A INPUT -m conntrack --ctstate INVALID -j DROP
Кстати эти три правила подойдут для большинства домашних ПК, если вы не запускаете сервера или специфичные сервисы.
Просмотр правил позволяет следующая команда с максимально подробным выхлопом
iptables -nvL --line-numbers
- --line-numbers - выводит нумерацию правил, это удобно для удаления правил
- -n --numeric - Выводить IP-адреса и порты в числовом виде, не пытаясь
разрешать их в имена хостов или сервисов. Это ускоряет вывод и делает
его более однозначным. - -v --verbose - Включить подробный (подробный) вывод, показывая
дополнительную информацию, такую как количество пакетов и байт,
счетчики, интерфейсы и т.д. - -L --list - Вывести список правил в таблице фильтрации (filter table) по умолчанию.
Вставить правило в определенную позицию цепочки можно по следующему шаблону
iptables -I [номер позиции] [цепочка] [условия] -j [действия]
для примера воспользуемся правилом логирование сброшенных пакетов со статусом INVALID. Давайте вставим его между вторым и третьим правилом выполнив следующую команду
iptables -I INPUT 3 -m conntrack --ctstate INVALID -j LOG --log-prefix "Invalid package: " --log-level 4
рассмотрим по подробнее
- -I - вставить
- INPUT 3 - цепочка входящие, правило на 3 строку
- -m conntrack --ctstate INVALID соединения в состоянии INVALID
- -j LOG - логировать
- --log-prefix "Invalid package: " - добавляет префикс к сообщению в логе для удобства фильтрации.
- --log-level 4 - уровень важности сообщения (4 — предупреждение). Можно менять от 0 (экстренно) до 7 (отладка).
И так, читаем правило, в iptables вставить правило на третью строку (-I 3) в цепочку входящие (INPUT) соединение (-m conntrack --ctstate) в состоянии поврежденый (INVALID) с действием запись в лог (LOG) с текстовым префиксом (--log-prefix) "Invalid package: " и уровнем логирования (--log-level) 4
давайте проверим что получилось с помощью команды
iptables -nvL --line-numbers
Немного отойдем о теме и поговорим о логировании. Оно позволяет записывать информацию о пакетах в системный журнал (для sysklog обычно /var/log/kern.log, /var/log/messages, /var/log/syslog и для systemd через journalctl), не блокируя их (если не указано иное). Так как все выше изложенное происходит в системе с системой инициализацией systemd то воспользуемся командой
journalctl -k | grep "Invalid package:"
Замена правила на другое правило, что ж попробуем заменить правило, выглядит шаблон команды так
iptables -R [цепочка_заменяемого_правило] [номер_строки_заменяемого правила] [новое_правило]
предположим нам нужно заменить 3 правило в цепочке input то есть правило
INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "Invalid package: " --log-level 4 заменить на INPUT -p tcp --dport 22 -j ACCEPT
делается это так
iptables -R INPUT 3 -p tcp --dport 22 -j ACCEPT
читаем, в iptables заменить (-R) в цепочке входящие третье правило (INPUT 3) на правило с протоколом TCP (-p tcp) и порт назначения 22 (--dport 22) с действием разрешить доступ(-j ACCEPT)
Удаление правила надо выполнить команду следующего шаблона
iptables -D [цепочка] [номер_правила]
например нам уже не нужно правило INPUT -p tcp --dport 22 -j ACCEPT, а если мы не знаем под каким номером оно записано? в данном случае нам поможет команда
iptables -nvL --line-numbers
из выхлопа видим правило в цепочке входящее под номером три, удаляем
iptables -D INPUT 3
довольно таки не сложно, как видим правило удалено
Сохранение изменений. После внесения изменений в iptables, рекомендуется сохранить их, чтобы они применялись после перезагрузки системы. Для этого можно использовать команду опять же в контексте Arch Linux выполняются команды под root
iptables-save > /etc/iptables/iptables.rules # для IPv4
ip6tables-save > /etc/iptables/ip6tables.rules # для IPv6
В некоторых дистрибутивах команды сохранения правил могут отличаться, смотрите их вики. В некоторых дистрибутивах может потребоваться дополнительная настройка для автоматического сохранения правил при загрузке.
после выполнения этих команд правила будут грузится при старте системы автоматически для примера я перезапущу iptables и ip6tables, на скрине я просто перезапустил сервисы(демоны)
как видим все правила подгружены.
Важный нюанс. Правила в цепочках читаются с верху вниз, исходя из этого вверху будут разрешающие правила, а внизу будут запрещающие.
P.S. В данном повествовании больше упор сделан на то, как управлять iptables не жили упор на какие то конкретные правила. Да в контексте были упомянуты несколько базовых правил фильтрации (базовая защита клиента так скажем) входящего трафика, но не более. Сама по себе тема по межсетевым экранам довольно таки обширная и целиком все охватит не возможно. В целом статья посвящается начинающим пользователям, что бы смогли понять на первых пара как производить различные базовые манипуляции с правилам, как их понимать и как сохранить правила. Возможно стоит разобрать какие либо правила. Либо стоит рассмотреть конкретные случаи, хотя бы с тем с чем сам столкнулся. Быть может будет полезно.
За основу взята документация по iptables, а так же информация с форумов по
данной тематике, информация других пользователей размещенная на
просторах всемирной паутины и собственные наработки.
За сим откланиваюсь...