iptables (Русский)
iptables — утилита командной строки для настройки встроенного в ядро Linux межсетевого экрана, разработанного в рамках проекта Netfilter. Термином iptables также часто называют сам межсетевой экран в ядре. Настройка экрана выполняется либо напрямую с помощью iptables, либо через один из фронтендов, консольных или графических. iptables работает с протоколом IPv4, для IPv6 разработана утилита ip6tables. В основном их синтаксис совпадает, но некоторые специфичные для протоколов опции различаются.
Установка
Стандартное ядро Arch Linux скомпилировано с поддержкой iptables. Необходимо лишь установить набор пользовательских утилит, которые собраны в пакет . Поскольку данный пакет является косвенной зависимостью мета-пакета , то он по умолчанию должен быть установлен в системе.
Консольные
- ferm — инструмент для обслуживания комплексных межсетевых экранов, помогающий избежать необходимости переписывать сложные правила снова и снова. Позволяет сохранить целый набор правил в одном файле и загрузить его всего одной командой. Настройка экрана производится посредством специального языка, наподобие языка программирования, с помощью уровней и списков.
- FireHOL — не только программа для создания межсетевого экрана, но и специальный язык для задания его настроек. Делает даже тонкую настройку экрана лёгкой — как вам бы и хотелось.
Графические
- Gufw — графический GTK-интерфейс для ufw, который, в свою очередь, является интерфейсом командной строки для iptables (gufw–>ufw–>iptables), лёгкий и простой в использовании.
- PeerGuardian GUI (pglgui) — ориентированное на приватность firewall-приложение. Занимается блокировкой входящих и исходящих подключений на основе огромного чёрного списка (тысячи или даже миллионы IP-диапазонов).
Основные понятия
iptables используется для проверки, модификации, перенаправления и отбрасывания пакетов. Код для фильтрации пакетов IPv4 уже встроен в ядро и организован в виде набора таблиц, каждая из которых предназначена для конкретной цели. Таблица состоит из группы предопределённых цепочек, а те, в свою очередь, содержат правила, которые проверяются по очереди. Каждое правило состоит из критерия (набора условий) и действия (т.н. цели); действие применяется к пакету, подпадающему под критерий (т. е. если все условия выполнены). Если пакет достигает конца встроенной цепочки, в том числе пустой, то он отправляется дальше в соответствии с политикой цепочки. iptables — пользовательская утилита для работы с цепочками и правилами. Большинство пользователей находят IP-маршрутизацию Linux сложной и запутанной, однако на практике наиболее распространенные варианты использования (NAT и/или базовый межсетевой экран для интернета) являются значительно менее сложными.
Ключ к пониманию принципа работы iptables находится в этой блок-схеме. Слова в нижнем регистре в верхней части каждого блока являются именами таблиц, а слова в верхнем регистре – цепочками. Каждый IP-пакет, принятый на любом сетевом интерфейсе, проходит через эту блок-схему сверху вниз. Существует заблуждение, что пакеты, приходящие на внутренний интерфейс, обрабатываются как-то иначе нежели те, что приходят на интерфейс, подключённый к интернету. Пакеты на всех интерфейсах обрабатываются одинаково; это ваша задача написать правила, которые будут обрабатывать их по-разному. Некоторые пакеты предназначены для локальных процессов; они проходят по схеме от верхнего блока до блока <Local Process> (локальный процесс). В то же время локальный процесс сам может генерировать пакеты, и они начинают путешествие по схеме с блока <Local Process> и далее вниз. Подробное описание работы этой блок-схемы можно найти здесь.
В подавляющем большинстве случаев таблицы raw, mangle и security вам не понадобятся. На схеме ниже приведён упрощённый вариант прохождения пакета через iptables:
Таблицы
iptables содержит пять таблиц:
- — используется только для настройки пакетов, поэтому они освобождаются от отслеживания.
- — таблица по умолчанию; в ней сосредоточены все действия, типичные для межсетевых экранов.
- — используется для преобразования сетевых адресов (например, проброс портов).
- — используется для специальных преобразований пакетов.
- — используется в сетевых правилах для Мандатного управления доступом (например, в SELinux – подробнее см. эту статью).
Скорее всего, вам потребуются только две из них: filter и nat. Остальные таблицы используются в сложных конфигурациях с несколькими маршрутизаторами и выходят за рамки данной статьи.
Цепочки
Таблицы состоят из цепочек, которые представляют собой набор правил, следующих друг за другом в определённом порядке. Таблица по умолчанию, filter, содержит три встроенные цепочки: , и FORWARD
, которые, как видно из диаграммы, активируются в определённые моменты процесса фильтрации пакетов. Таблица nat включает стандартные цепочки PREROUTING
, и .
Описание стандартных цепочек других таблиц можно найти в руководстве .
По умолчанию все цепочки пусты и не содержат каких-либо правил. Вы должны добавить правила в те цепочки, которые собираетесь использовать. У цепочек также задана политика по умолчанию — обычно , но её можно изменить на , если вы хотите убедиться, что ни один пакет не проскочит мимо вашего набора правил. Тем не менее, политика по умолчанию применяется к пакету только после того, как он пройдёт через все существующие правила.
Вы можете добавить собственные цепочки для большей эффективности или удобства. Пример создания таких цепочек можно найти в статье Настройка межсетевого экрана.
Правила
Фильтрация пакетов основана на правилах. Каждое правило состоит из нескольких условий и действия-цели. Если пакет соответствует всем условиям, то к нему применяется указанное действие. Распространённые условия для проверки — на какой интерфейс пришёл пакет (например, eth0 или eth1), какого он типа (ICMP, TCP или UDP) или на какой порт направляется.
Цели указываются опцией /. Цель может быть встроеной (built-in), целью-расширением (extension) или переходом на пользовательскую цепочку. Встроенные цели — , , и ; цели-расширения, к примеру — и LOG
. Если применяется встроенная цель, то участь пакета решается незамедлительно и обработка пакета в таблице прекращается. Если в качестве цели выбран переход на пользовательскую цепочку, то пакет проходит через неё, возвращается в исходную цепочку и продолжает со следующего после перехода правила. Цели-расширения могут быть завершающими (как встроенные) или незавершающими (как пользовательские цепочки). Подробнее см. .
Прохождение по цепочке
Принятый на сетевом интерфейсе пакет проходит по цепочкам таблиц в порядке, изображённом на диаграмме. В первой точке маршрутизации (routing decision) принимается решение, направляется ли пакет на локальную машину (в таком случае пакет проходит через цепочку ) или куда-то в другое место (в этом случае пакет проходит через цепочку FORWARD
). Последующие точки маршрутизации определяют, на какой сетевой интерфейс направить исходящий пакет. В каждой цепочке по пути следования пакета последовательно проверяются все правила, и если пакет удовлетворяет условиям правила, то выполняется соответствующее действие-цель. Три наиболее частых цели – , и переход на пользовательскую цепочку. В противоположность встроенным цепочкам, которые имеют цели по умолчанию, цепочки пользователя такой цели не имеют. Если не удовлетворены условия ни одного из правил пользовательской цепочки, пакет возвращается обратно в вызвавшую её цепочку, как показано здесь. Если в какое-то момент выполнились все условия цепочки с действием , пакет немедленно отбрасывается и над ним более не производится никаких действий. Обратите, однако, внимание, что если пакет принят действием , он принимается только в текущей цепочке и в вышележащих цепочках в текущем стеке вызовов. Он не обрабатывается более той стандартной цепочкой, которая инициировала последовательность переходов, но продолжает проходить по цепочкам в других таблицах обычным образом.
Модули
Существует ряд модулей для расширения возможностей iptables, среди которых connlimit, conntrack, limit и recent. Эти модули добавляют новую функциональность в iptables, что позволяет создавать более сложные правила фильтрации.
Настройка и использование
iptables — служба systemd и запускается соответственно. Пакет iptables при установке добавляет пустой комплект правил , который будет загружен при первом запуске службы . Как и прочие службы, службу iptables для добавления в автозапуск необходимо включить.
Правила iptables для IPv6 по умолчанию хранятся в файле , который используется службой . Эту службу можно запустить так же, как и .
После добавления правил посредством командной строки файл настроек не изменится автоматически — изменения необходимо сохранять командой:
# iptables-save -f /etc/iptables/iptables.rules
Если вы изменяли файл настроек вручную, то либо перезагрузите службу iptables, либо загрузите настройки вручную командой:
# iptables-restore /etc/iptables/iptables.rules
Вывод текущих правил
Основная команда для вывода текущих правил — /; её вывод похож на вывод утилиты iptables-save. Разница между ними в том, что по умолчанию последняя выводит правила из всех таблиц, в то время как iptables — только из таблицы .
Команда /-L
принимает больше модификаторов и выводит более подробную информацию. Например, следующая команда позволяет проверить текущий набор правил и количество срабатываний каждого из них:
Представленный выше вывод свидетельствует о том, что в таблице по умолчанию () никакие правила не заданы и все пакеты пропускаются. Выбрать другую таблицу можно опцией .
Чтобы вывести номера строк при просмотре правил, запустите команду с опцией . Это бывает удобно для последующего редактирования правил в командной строке.
Сброс правил
Сбросить правила iptables можно следующими командами:
# iptables -F # iptables -X # iptables -t nat -F # iptables -t nat -X # iptables -t mangle -F # iptables -t mangle -X # iptables -t raw -F # iptables -t raw -X # iptables -t security -F # iptables -t security -X # iptables -P INPUT ACCEPT # iptables -P FORWARD ACCEPT # iptables -P OUTPUT ACCEPT
Команда -F
без аргументов просто очищает все цепочки в текущей таблице. Аналогично, команда удаляет все пустые пользовательские цепочки в таблице.
Отдельные цепочки могут быть очищены от правил или удалены указанием имени цепочки после команд -F
и соответственно.
Редактирование правил
Редактирование правил подразумевает одно из следующих действий: добавление правила в конец цепочки (), вставка правила в конкретную позицию в цепочке (), замена () и удаление () существующего правила.
Примеры ниже приведены исходя из соображения, что компьютер не является маршрутизатором. Поэтому первым делом меняем политику цепочки FORWARD
с на :
# iptables -P FORWARD DROP
Синхронизация по локальной сети в Dropbox производится с помощью отправки широковещательных пакетов каждые 30 секунд всем доступным компьютерам сети. Если вы находитесь в локальной сети с клиентами Dropbox и не желаете использовать эту возможность, то следует отклонять такие пакеты:
# iptables -A INPUT -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
Теперь предположим, что вы поменяли своё мнение касательно Dropbox и решили установить его на компьютере. Также вы режили использовать синхронизацию, но с одним конкретным IP-адресом (например, ). Команда позволяет заменить существующее правило:
# iptables -R INPUT 1 -p tcp --dport 17500 ! -s 10.0.0.85 -j REJECT --reject-with icmp-port-unreachable
Новое правило позволяет хосту отправить данные на порт вашего компьютера. Но вдруг вы понимаете, что этот подход не масштабируется. Если дружественный пользователь Dropbox пытается получить доступ к порту , то мы хотим предоставлять ему доступ немедленно, не проверяя его последующими правилами!
Поэтому мы пишем новое правило для предоставления доверенному пользователю немедленного доступа и добавляем его командой , чтобы вставить его перед предыдущим:
# iptables -I INPUT -p tcp --dport 17500 -s 10.0.0.85 -j ACCEPT -m comment --comment "Friendly Dropbox"
Второе правило теперь можно переписать так, чтобы оно отбрасывало все пакеты на порт с других хостов:
# iptables -R INPUT 2 -p tcp --dport 17500 -j REJECT --reject-with icmp-port-unreachable
Итоговый список правил теперь выглядит следующим образом:
# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 10.0.0.85 0.0.0.0/0 tcp dpt:17500 /* Friendly Dropbox */ 2 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:17500 reject-with icmp-port-unreachable Chain FORWARD (policy DROP 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination
Руководства
Журналирование
Цель LOG
позволяет при срабатывании правила добавлять информацию о пакете в журнал. В отличие от прочих целей, вроде или , при срабатывании цели LOG
пакет продолжает продвижение по цепочке. Поэтому, например, чтобы включить журналирование всех отброшенных пакетов, необходимо перед каждым -правилом добавить аналогичное LOG
-правило. Правда, это не очень выгодно с точки зрения эффективности и удобства, и вместо этого лучше создать отдельную цепочку :
# iptables -N logdrop
Добавьте в неё следующие правила:
# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG # iptables -A logdrop -j DROP
Опции limit
и объяснены следующем разделе.
Теперь для отбрасывания пакета с добавлением соответствующей записи в журнал необходимо просто выполнить переход на цепочку :
# iptables -A INPUT -m conntrack --ctstate INVALID -j logdrop
Ограничение скорости логирования
Цепочка из предыдущего раздела использует модуль limit
, который помогает предотвратить разрастание журнала и избежать ненужных операций записи на диск. Если этого не сделать, то неправильно настроенная служба, которая пытается установить соединение, или просто злоумышленник, могут привести к исчерпанию свободного места на диске (как минимум в разделе ) из-за добавления чрезмерного количества записей в журнал.
Модуль limit подключается опцией . Опцией задаётся средняя скорость журналирования, а опцией — начальная. В примере цепочки выше команда
# iptables -A logdrop -m limit --limit 5/m --limit-burst 10 -j LOG
добавляет правило, которое логирует все проходящие через него пакеты. Первые 10 пакетов будут добавлены в журнал, но затем скорость логирования не будет превышать 5 пакетов в минуту. Если значение limit
какое-то время не нарушается, то снова "разблокируется", т.е. журналирование автоматически вернётся к нормальному режиму.
Просмотр логированных пакетов
В журнале systemd логированные пакеты отображаются как сообщения ядра.
Следующая команда выведет список пакетов, добавленных журнал с момента последней загрузки системы:
# journalctl -k --grep="IN=.*OUT=.*"
syslog-ng
Если вы используете syslog-ng, то в файле можно настроить место хранения логов iptables. Замените:
filter f_everything { level(debug..emerg) and not facility(auth, authpriv); };
на
filter f_everything { level(debug..emerg) and not facility(auth, authpriv) and not filter(f_iptables); };
После этого вывод iptables больше не будет отправляться в .
Если необходимо задать произвольный файл для хранения журнала iptables (вместо ), то измените значение пути в параметре d_iptables
(в том же файле ():
destination d_iptables { file("/var/log/iptables.log"); };
ulogd
ulogd — работающий в пространстве пользователя специализированный демон журналирования пакетов для netfilter, который может заменить стандартную цель LOG
. Пакет доступен в репозитории [community]
.
Смотрите также
- Iptables в Википедии
- Port knocking
- Официальный сайт iptables
- Руководство по iptables версии 1.2.2 от Oskar Andreasson
- Debian Wiki — iptables
- Безопасное использование Connection Tracking helpers