Iptables

Iptables Межсетевой экран, сетевой экран (МЭ) — программный или программноаппаратный элемент компьютерной сети, осуществляющий контроль и фильтрацию проходящего через него сетевого трафика в соответствии с заданными правилами. Главная задача межсетевого экрана — не пропускать трафик, которого быть не должно. Это базовая защита от сканирования сети организации, доставки на компьютеры вредоносных программ, осуществления сетевых атак, а также от несанкционированного доступа к закрытой корпоративной информации.

МЭ может:
● предотвратить проникновение в сеть «поддельного» трафика;
● защитить внутреннюю сеть от DDoS-атак, когда злоумышленники пытаются «уронить» сервисы компании, отправляя на них много запросов;
● заблокировать передачу данных неизвестному источнику.

Iptables — это один из самых распространённых и популярных фаерволов для Linux. Рядом с Iptables вы можете встречать слово netfilter. Это подсистема ядра Linux, которая обеспечивает функциональность работы с трафиком, iptables же — это интерфейс для того, чтобы человек мог взаимодействовать с этой подсистемой. Все сетевые пакеты, которые проходят через компьютер, отправляются компьютером или предназначены компьютеру, ядро направляет через фильтр iptables. Там эти пакеты поддаются проверкам, и затем для каждой проверки, если она пройдена, выполняется указанное в ней действие.

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

Соответственно, в фильтре iptables все пакеты делятся на три аналогичные цепочки:
● input обрабатывает входящие пакеты и подключения;
● forward применяется для проходящих соединений;
● output используется для исходящих пакетов и соединений.

Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом, и если пакет соответствует, то применять к нему указанное в правиле действие. Действий может быть несколько:
● ACCEPT — разрешить прохождение пакета дальше по цепочке правил;
● DROP — удалить пакет;
● REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонён;
● LOG — сделать запись о пакете в лог-файл;
● QUEUE — отправить пакет пользовательскому приложению.

Правила могут проверять любые соответствия, например, по IP, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, к нему применяется действие по умолчанию, обычно ACCEPT.

Рассмотрим утилиту командной строки iptables, с помощью которой и выполняется управление системой iptables. Обычно команда имеет такой общий вид: iptables -t

Таблица указывает таблицу, с которой нужно работать, этот параметр можно упустить; действие — нужное действие, например, создать или удалить правило; дополнительные параметры описывают действие и правило, которое нужно выполнить.
man iptables
Рассмотрим основные действия, которые позволяет выполнить iptables:
● -A — добавить правило в цепочку;
● -С — проверить все правила;
● -D — удалить правило;
● -I — вставить правило с нужным номером;
● -L — вывести все правила в текущей цепочке;
● -S — вывести все правила;
● -F — очистить все правила;
● -N — создать цепочку;
● -X — удалить цепочку;
● -P — установить действие по умолчанию.

Дополнительные опции для правил:
● -p — указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh;
● -s — указать IP-адрес устройства отправителя пакета;
● -d — указать IP-адрес получателя;
● -i — входной сетевой интерфейс;
● -o — исходящий сетевой интерфейс;
● -j — выбрать действие, если правило подошло.

Настройка iptables Рассмотрим, как выполняется просмотр правил iptables, для этого достаточно опции - L:
iptables -L

Отображать все действующие правила лучше с детализацией и нумерацией строк:
iptables --line-numbers -L -v -n

Ключ – line-numbers нумерует строки, -L выводит список правил всех цепочек, -v отвечает за детализацию вывода, -n выводит IP-адреса и номера портов в числовом формате.

Также вы можете указать нужную цепочку, чтобы вывести правила только для неё:
iptables -L INPUT

Вот так будет выглядеть команда, которая позволяет добавить правило iptables для блокировки всех входящих пакетов от 10.10.10.10:
sudo iptables -A INPUT -s 10.10.10.10 -j DROP

А теперь исходящие пакеты на этот же адрес:
sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

Блокировка диапазона IP выполняется подобным образом. Для этого нужно использовать маску сети 10.10.10.0/24. Это будут все адреса от 10.10.10.0 до 10.10.10.255:
sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP

Также вы можете заблокировать все входящие соединения SSH:
sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Удаление правил iptables выполняется точно так же, как и создание новых, только вместо опции -A нужно использовать опцию -D. Сначала смотрим список правил:
sudo iptables -L

Например, вот так можно удалить правило iptables, которое было создано вторым:
sudo iptables -D OUTPUT -s 10.10.10.10 -j DROP

Также вы можете полностью очистить iptables, выполнив команду с опцией -F:
sudo iptables -F

Утилита iptables, как и маршрутизаторы Cisco, не сохраняет правила, если это явно не указать, и после перезагрузки возвращается в предыдущее состояние. Установим пакет:
apt install iptables-persistent

В процессе установки на оба вопроса отвечаем Yes. Сохраняем текущие правила:
service netfilter-persistent save

Система при следующей загрузке использует последние сохранённые правила.

Восстановление правил. Сервис netfilter-persistent сохраняет рабочие правила в файле /etc/iptables/rules.v4. Если не успели сохранить активные правила, значит, в файле предыдущая версия, восстанавливаем:
iptables-restore < /etc/iptables/rules.v4

Примеры настройки iptables
Рассмотрим задачи, с которыми придётся столкнуться, работая с iptables. Как разрешить или запретить ICMP ping-трафик.

Разрешить ping хоста:
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

Запретить входящие icmp-пакеты:
iptables -A INPUT -p icmp --icmp-type 8 -j DROP

Разрешить трафик на локальном узле
Трафик на локальном сетевом интерфейсе lo должен быть разрешён для корректной работы сервисов, использующих для обмена данными интерфейс локальной петли, например базы данных, прокси-сервер squid. Поэтому рекомендуется разрешить трафик на вход и выход:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

Настройка NAT
Преобразование сетевых адресов (от англ. Network Address Translation) используется на маршрутизаторах для взаимного предоставления сервисов между сетями согласно определённым правилам. В iptables для этого предусмотрена таблица nat, для которой характерны действия DNAT, SNAT, MASQUERADE.

Рассмотрим часто возникающую практическую задачу проброса порта. Дано: локальная сеть, состоящая из двух серверов и маршрутизатора с публичным IPадресом.
Оба сервера имеют доступ в интернет, но только один, используемый в качестве брандмауэра, имеет публичный IP-адрес. Это означает, что все пакеты, приходящие на публичный IP-адрес, доставляются сразу на компьютер с IP-адресом 192.168.0.2.

Задача: предоставить доступ снаружи к веб-серверу с IP-адресом 192.168.0.3. Решение: все операции с iptables выполняются на сервере 192.168.0.2. В схеме получается два маршрутизатора. При запросе пользователем веб-страницы пакет с маршрутизатора, который имеет публичный адрес, попадает на сервермаршрутизатор 192.168.0.2, на порт 80, нужно его передать веб-серверу 192.168.0.3.
Делаем первый шаг — меняем адрес назначения пакета:
iptables -t nat -A PREROUTING -p tcp -d 192.168.0.2 --dport 80 -j DNAT - -to-destination 192.168.0.3:80

DNAT используется, если необходимо предоставить пользователям глобальной сети доступ к компьютеру, находящемуся за маршрутизатором, то есть во внутренней сети; это называется пробросом портов.
Теперь нужно поменять адрес отправителя пакета на адрес маршрутизатора 192.168.0.2, который передаст пакет маршрутизатору с публичным IP-адресом, а он уже в свою очередь доставит пакет клиенту, используем для этого SNAT. Делаем второй шаг:
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.3 --dport 80 -j SNAT --to-source 192.168.0.2

Та же самая команда при использовании действия MASQUERADE не потребует ключа --to-source и указания адреса, поскольку в таком случае происходит автоматическая подмена адреса отправления на IP-адрес сетевого интерфейса, с которого ушёл пакет:
iptables -t nat -A POSTROUTING -p tcp -d 192.168.0.3 --dport 80 -j MASQUERADE

Проброс порта веб-сервера выполнен.