Ubuntu iptables просмотр правил

Обновлено: 03.07.2024

Iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) Netfilter для ядер Linux, начиная с версии 2.4. С её помощью администраторы создают и изменяют правила, управляющие фильтрацией и перенаправлением пакетов. Для работы с семейством протоколов IPv6 существует отдельная версия утилиты — Ip6tables. Для использования утилиты Iptables требуются привилегии суперпользователя (root).

Основные понятия

Ключевыми понятиями iptables являются:

Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик. Правила для каждой цепочки срабатывают в порядке их следования, поэтому порядок важен. Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила. Критерии соединяются логическим «И». Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила. О действиях более подробно будет рассказано ниже. Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах. Цепочка — упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые. Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING). Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями. Таблица — совокупность базовых и пользовательских цепочек, объединенных общим функциональным назначением. Имена таблиц (как и модулей критериев) записываются в нижнем регистре, так как в принципе не могут конфликтовать с именами пользовательских цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter.

Архитектура

В системе netfilter, пакеты пропускаются через цепочки. Цепочка является упорядоченным списком правил, а каждое правило может содержать критерии и действие или переход. Когда пакет проходит через цепочку, система netfilter по очереди проверяет, соответствует ли пакет всем критериям очередного правила, и если так, то выполняет действие (если критериев в правиле нет, то действие выполняется для всех пакетов проходящих через правило). Вариантов возможных критериев очень много. Например, пакет соответствует критерию –source 192.168.1.1 если в заголовке пакета указано, что отправитель — 192.168.1.1. Самый простой тип перехода, –jump, просто пересылает пакет в начало другой цепочки. Также при помощи –jump можно указать действие. Стандартные действия доступные во всех цепочках — ACCEPT (пропустить), DROP (удалить), QUEUE (передать на анализ внешней программе), и RETURN (вернуть на анализ в предыдущую цепочку). Например, команды

Цепочки

Существует 5 типов стандартных цепочек, встроенных в систему:

PREROUTING — для изначальной обработки входящих пакетов. INPUT — для входящих пакетов адресованных непосредственно локальному процессу (клиенту или серверу). FORWARD — для входящих пакетов перенаправленных на выход (заметьте, что перенаправляемые пакеты проходят сначала цепь PREROUTING, затем FORWARD и POSTROUTING). OUTPUT — для пакетов генерируемых локальными процессами. POSTROUTING — для окончательной обработки исходящих пакетов.

Также можно создавать и уничтожать собственные цепочки при помощи утилиты iptables.

Таблицы

Цепочки организованны в 4 таблицы:

raw — просматривается до передачи пакета системе определения состояний. Используется редко, например для маркировки пакетов, которые НЕ должны обрабатываться системой определения состояний. Для этого в правиле указывается действие NOTRACK. Содержит цепочки PREROUTING и OUTPUT. mangle — содержит правила модификации (обычно заголовка) IP‐пакетов. Среди прочего, поддерживает действия TTL (Time to live), TOS (Type of Service), и MARK (для изменения полей TTL и TOS, и для изменения маркеров пакета). Редко необходима и может быть опасна. Содержит все пять стандартных цепочек. nat — просматривает только пакеты, создающие новое соединение (согласно системе определения состояний). Поддерживает действия DNAT, SNAT, MASQUERADE, REDIRECT. Содержит цепочки PREROUTING, OUTPUT, и POSTROUTING. filter — основная таблица, используется по умолчанию если название таблицы не указано. Содержит цепочки INPUT, FORWARD, и OUTPUT.

Цепочки с одинаковым названием, но в разных таблицах — совершенно независимые объекты. Например, raw PREROUTING и mangle PREROUTING обычно содержат разный набор правил; пакеты сначала проходят через цепочку raw PREROUTING, а потом через mangle PREROUTING.

Состояния

В системе netfilter, каждый пакет проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний:

NEW — пакет открывает новый сеанс. Классический пример — пакет TCP с флагом SYN. ESTABLISHED — пакет является частью уже существующего сеанса. RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP , клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21).

Диаграмма прохождения таблиц и цепочек

Упрощённая диаграмма прохождения таблиц и цепочек:

http://www.rootdir.org/.offload/kptd-simplified-ru.svg

http://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg

Базовая конфигурация

Ниже приведён пример базовой статической конфигурации iptables. При сохранении и загрузке подобной конфигурации необходимо принимать во внимание возможность внесения в неё изменений со стороны других сервисов, например Fail2ban. Кроме того, при использовании IPv6-адресации конфигурацию для IPv6 следует выполнять независимо от IPv4.

Просмотр текущей конфигурации:

Создаём скрипт с дампом правил iptables:

Копируем следующий код:

Дополняем нужными правилами с учётом iptables-save.

Сохраняем и закрываем: Ctrl + O , Enter , Ctrl + X

Делаем скрипт исполняемым и загружаем правила iptables:

Просмотр текущей конфигурации:

Создаём скрипт с дампом правил ip6tables:

Копируем следующий код:

Дополняем нужными правилами с учётом ip6tables-save.

Сохраняем и закрываем: Ctrl + O , Enter , Ctrl + X

Делаем скрипт исполняемым и загружаем правила iptables:

Дополнительные правила

Ниже приведены некоторые сравнительно часто используемые правила. Цепочки INPUT/OUTPUT применяются для фильтрации локального трафика. Для транзитного трафика необходимо использовать цепочку FORWARD.

В данной статье мы рассмотрим как посмотреть правила iptables с помощью команды iptables -L, а также основные её опции и параметры. Данная команда выводит в командную оболочку bash в структурированном виде все цепочки правил firewall Netfilter. Информация предоставляется для изучения уже настроенных возможностей межсетевого экрана и последующей их модификации с помощью других команд. Таблицы правил выводятся в текстовом режиме.

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

Как посмотреть правила iptables

В данном случае для демонстрации возможностей iptables используется операционная система Debian 10.2. Для возможности выполнения команды iptables необходимо, чтобы пользователю были предоставлены привилегии суперпользователя с помощью команды sudo. В связи с этим все команды будут выглядеть как sudo iptables [параметры] или sudo ip6tables [параметры] для IPv6.

Примечание: Для того, чтобы пользователю было позволено предоставлять привилегии суперпользователя, этого пользователя надо добавить в файл sudoers с помощью специального редактора visudo. Посмотрим на скриншот с результатом выполнения команды:


Существуют две версии утилиты для настройки брандмауэра Linux: iptables и ip6tables. Iptables используется для протокола IPv4, а ip6tables для протокола IPv6. Соответственно команда вывести все цепочки правил для межсетевого экрана имеет два варианта синтаксиса.

Для протокола IPv4:

sudo iptables -L

Для протокола IPv6:

sudo ip6tables -L

В дальнейшем рассмотрим только вариант для протокола IPv4, вариант для протокола IPv6 использует такой же синтаксис.

Выводимая на экран информация разбита на столбцы и строки. У каждого столбца свое наименование. С помощью дополнительных параметров команды sudo iptables -L можно добавлять дополнительные столбцы в выводимой таблице правил iptables. Рассмотрим название столбцов в стандартном выводе sudo iptables -L:

  • target – выполняемое действие с пакетом при соответствии его данному правилу
  • prot – протокол передачи данных, при котором применяется данное правило
  • opt – дополнительные опции для правила
  • source – IP адрес, подсеть, домен узла источника пакета, попадающего под выполнение данного правила
  • destination – IP адрес, подсеть, домен узла назначения пакета, попадающего под выполнение данного правила

1. Список правил из цепочки

Команда чтобы вывести на экран конкретную цепочку правил выглядит следующим образом:

sudo iptables [ -L имя цепочки ]

Например просмотр правил iptables из цепочки OUTPUT:

sudo iptables -L OUTPUT


2. Список правил из таблицы

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

sudo iptables [ -t имя таблицы ] [ -L имя цепочки ]

sudo iptables -t nat -L OUTPUT


Вот список всех таблиц правил iptables:

  • filter – таблица по умолчанию. Используется для фильтрации пакетов. Содержится в цепочках INPUT, FORWARD, OUTPUT
  • raw – используется редко. Пакет проверяется на соответствие условиям данной таблицы до передачи системе определения состояний (conntrack), например, для того, чтобы не обрабатываться с помощью данной системы (действие NOTRACK). Система определения состояний позволяет фильтровать пакеты на уровне взаимодействия сеансов приложений. То есть фильтрует пакеты по сеансу связи – новый сеанс связи (NEW), уже установленный сеанс связи (ESTABLISHED), дополнительный сеанс связи к уже существующему (RELATED). Данная система позволяет реализовать высокоуровневый межсетевой экран, который вместо работы с пакетами работает с сеансами связи в рамках приложений. Содержится в цепочках PREROUTING и OUTPUT.
  • mangle – содержит правила модификации обрабатываемых IP-пакетов. Например, изменение полей заголовков IP-пакетов, содержащих служебную информацию. Используется редко. Содержится в цепочках PREROUTING, INPUT, FORWARD, OUTPUT,
  • nat – предназначена для подмены адреса отправителя или получателя. Данная таблица применяется только к первому пакету из потока протокола передачи данных по сети, к остальным пакетам потока пакетов выбранное действие применяется далее автоматически. Таблицу используют, например, для трансляции адресов отправителя и получателя, для маскировки адресов отправителя или получателя. Это делается в основном в двух случаях. Первый – когда необходимо организовать доступ к сети Интернет нескольким компьютерам, расположенным за данным компьютером. Второй – когда необходимо спрятать (замаскировать) в целях безопасности отправителя или получателя информации, передаваемой по сети Интернет. Содержится в цепочках PREROUTING, OUTPUT, POSTROUTING.

3. Номера правил в iptables

Следующая команда позволяет нам вывести номера правил iptables, которые потом можно использовать для управления ими на экран:

sudo iptables [ -t таблица ] [ -L имя_цепочки ] --line-numbers -n

sudo iptables -t filter -L --line-numbers -n


4. Просмотр правил со статистикой пакетов

Чтобы посмотреть таблицу правил со счетчиком переданного (полученного) количества байтов (bytes) и пакетов (pkts) используется следующая команда:

sudo iptables [ -t таблица ] [ -L имя цепочки ] -n -v

sudo iptables -t filter -L -n -v


Выводы

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

Нет похожих записей


Статья распространяется под лицензией Creative Commons ShareAlike 4.0 при копировании материала ссылка на источник обязательна.

Утилита iptables — это межсетевой экран для операционных систем Linux. С помощью правил iptables можно разрешать или блокировать прохождение трафика. Когда происходит попытка установления соединения с текущей машиной, iptables просматривает список правил в списке, чтобы понять, как нужно поступить в этом случае. Если правила нет, то выполняется действие по умолчанию.

Цепочки правил

Набор правил формируется в цепочки, существуют базовые и пользовательские цепочки. Список базовых цепочек:

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


Таблицы iptables

Над цепочками правил в iptables есть еще один уровень абстракции — таблицы. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации:

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

Принцип работы

Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter , а затем к нему применяются правила цепочки POSTROUTING . На данном этапе можно использовать SNAT/MASQUARADE (подмена источника/маскировка). После этих действий пакет (если выжил) будет отправлен в сеть.

Если назначением пакета является сам компьютер с брандмауэром, то, после маршрутизации, он обрабатывается правилами цепочек INPUT таблиц mangle и filter . В случае прохождения цепочек пакет передается приложению.

Когда приложение на машине с брандмауэром, отвечает на запрос или отправляет собственный пакет, то он обрабатывается цепочкой OUTPUT таблицы filter . Затем к нему применяются правила цепочки OUTPUT таблицы nat — для определения, требуется ли использовать DNAT (модификация назначения). Далее, пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING , которая может использовать SNAT и QoS . В случае успешного прохождения POSTROUTING пакет выходит в сеть.

Утилита iptables

Синтаксис утилиты iptables :

Если таблица не указана, подразумевается таблица filter . Команды могут быть:

  • -A (или --append ) — добавить правило в цепочку
  • -D (или --delete ) — удалить правило из цепочки
  • -I (или --insert ) — вставить правило в цепочку под указанным номером
  • -L (или --list ) — вывести все правила для заданной цепочки
  • -F (или --flush ) — очистить все правила для заданной цепочки (таблицы)
  • -N (или --new-chain ) — создать новую цепочку
  • -X (или --delete-chain ) — удалить цепочку
  • -P (или --policy ) — установить действие по умолчанию для цепочки

Имеются следующие дополнительные опции:

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

Поведение по умолчанию

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

Изначально все три цепочки таблицы filter по умолчанию разрешают прием трафика:

Если же что-то менялось, а теперь нужно вернуть прежние настройки, то сделать это можно с помощью команд:

Можно пойти по другому пути и сначала запретить весь трафик, а затем выборочно разрешать его:

Действия с соединениями

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

  • ACCEPT — пакет покидает данную цепочку и передается в следующую
  • DROP — отбросить пакет, пакет не передается в следующую цепочку
  • REJECT — отбросить пакет, сообщить отправителю пакета об ошибке
  • SNAT — замена ip-адреса источника в пакете, в цепочках POSTROUTING и OUTPUT таблицы nat
  • DNAT — замена ip-адреса назначения в пакете, в цепочке PREROUTING таблицы nat (изредка — в OUTPUT )
  • LOG — записать пакет в лог-файл (отправляется демону syslog ) и обработать остальными правилами
  • MASQUERADE — как SNAT , но для соединений с динамическим ip-адресом, в цепочке POSTROUTING таблицы nat
  • MARK — установить метку на пакет и обработать остальными правилами

Критерии для пакетов

Общие критерии — допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения:

  • -p (или --protocol ) — используется для указания типа протокола ( all , icmp , tcp , udp )
  • -s (или --source ) — используется для указания ip-адреса источника; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)
  • -d (или --destination ) — используется для указания ip-адреса места назначения; можно указать единственный ip-адрес (10.10.10.10) или диапазон ip-адресов (10.10.10.0/24)
  • -i (или --in-interface ) — интерфейс, с которого был получен пакет, допускается только в цепочках INPUT , FORWARD и PREROUTING ; при отсутствии этого критерия предполагается любой интерфейс
  • -o (или --out-interface ) — интерфейс, с которого будет отправлен пакет, допускается только в цепочках OUTPUT , FORWARD и POSTROUTING ; при отсутствии этого критерия предполагается любой интерфейс

Неявные критерии — неявно подгружают модули расширений и становятся доступны при указании критерия --protocol . Рассмотрим некоторые из них:

  • -p tcp --sport (или --source-port ) — исходный порт, с которого был отправлен TCP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле /etc/services . Номера портов могут задаваться в виде интервала из минимального и максимального номеров.
  • -p tcp --dport (или --destination-port ) — порт или диапазон портов, на который адресован TCP-пакет. Аргументы задаются в том же формате, что и для --source-port .
  • -p udp --sport (или --source-port ) — исходный порт, с которого был отправлен UDP-пакет. В качестве параметра может указываться номер порта или название сетевой службы. Соответствие имен сервисов и номеров портов можно найти в файле /etc/services . Номера портов могут задаваться в виде интервала из минимального и максимального номеров.
  • -p udp --dport (или --destination-port ) — порт или диапазон портов, на который адресован UDP-пакет. Аргументы задаются в том же формате, что и для --source-port .

Явные критерии — требуют явной подгрузки модулей расширения с помощью опции -m или --match . Например, если планируется использовать критерий state , то нужно явно указать -m state левее используемого критерия. Рассмотрим некоторые из них:

  • -m conntrack --ctstate STATES — проверяет признак состояния соединения: NEW , ESTABLISHED , RELATED и INVALID . Состояние NEW подразумевает, что пакет открывает новое соединение или пакет принадлежит однонаправленному потоку. Состояние ESTABLISHED указывает на то, что пакет принадлежит уже установленному соединению, через которое пакеты идут в обеих направлениях. Состояние RELATED указывает на то, что пакет принадлежит уже существующему соединению, но при этом он открывает новое соединение. Состояние INVALID подразумевает, что пакет связан с неизвестным потоком или соединением и, возможно содержит ошибку в данных или в заголовке.
  • -m state --state STATES (устарел, не рекомендуется) — проверяет признак состояния соединения: NEW , ESTABLISHED , RELATED и INVALID .
  • -m multiport --source-port PORTS — служит для указания списка исходящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями -p tcp или -p udp . Главным образом используется как расширенная версия обычного критерия --source-port .
  • -m multiport --destination-port PORTS — служит для указания списка входящих портов, можно указать до 15 различных портов. Названия портов в списке должны отделяться друг от друга запятыми, пробелы в списке недопустимы. Может использоваться только совместно с критериями -p tcp или -p udp . Главным образом используется как расширенная версия обычного критерия --destination-port .
  • -m multiport --port PORTS — проверяет как исходящий так и входящий порт пакета. Формат аргументов аналогичен критерию --source-port и --destination-port . Данный критерий проверяет порты обоих направлений, если задан критерий -m multiport --port 80 — под него попадают пакеты, идущие с порта 80 на порт 80.
  • -m mac --mac-source MAC — MAC адрес сетевого узла, передавшего пакет, в формате XX:XX:XX:XX:XX:XX . Имеет смысл только в цепочках PREROUTING , FORWARD и INPUT и нигде более.
  • -m iprange --src-range IP-IP — позволяет указать диапазон ip-адресов источника, например 192.168.1.10-192.168.2.20
  • -m iprange --dst-range IP-IP — позволяет указать диапазон ip-адресов места назначения, например 192.168.1.10-192.168.2.20

Критерий состояния соединения

Как сказано выше, многие протоколы требуют двусторонних коммуникаций. Например, если нужно разрешить соединения по SSH, то добавить правила надо будет и в цепочку INPUT и в цепочку OUTPUT . Но что, если нужно разрешить только входящие SSH-соединения на сервер (т.е. только возможность подключиться к серверу по SSH)? Разрешит ли добавление правила в цепочку OUTPUT и исходящие SSH-соединения (т.е. с сервера можно будет подключиться по SSH к другому хосту)?

Для таких случаев используются состояния соединений. Они позволяют описывать двусторонние коммуникации, в которых разрешается установка только соединений определенной направленности. В примере ниже разрешены SSH-соединения, поступающие от хоста 10.10.10.10, но SSH-соединения к этому хосту запрещены. Однако, системе разрешается отправка информации по SSH в случае уже установленного соединения, что делает возможной SSH-коммуникацию между хостами:

Сохранение изменений

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

Автозагрузка правил

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

При установке пакета будет предложено сохранить текущие правила iptables :

  • в файл /etc/iptables/rules.v4 для протокола IPv4
  • в файл /etc/iptables/rules.v6 для протокола IPv6


Теперь, после каких-либо изменений правил, надо сохранить текущее состояние в файл /etc/iptables/rules.v4 , чтобы это состояние восстановилось после перезагрузки:

После установки пакета будет добавлена новая служба netfilter-persistent.service , которая при загрузке системы будет восстанавливать правила iptables :

Судя по всему, скоро пакет iptables-persistent будет заменен на пакет netfilter-persistent (сейчас он устанавливается как зависимость при установке iptables-persistent ).

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

Для удаления всех сконфигурированных правил таблицы filter можно использовать команду:

Для удаления всех сконфигурированных правил таблицы nat можно использовать команду:

Пример настройки web-сервера

1. Политика ACCEPT для OUTPUT

Первым делом задаем политику по умолчанию:

Разрешаем трафик через интерфейс loopback (будет работать ping для localhost ):

Многие приложения используют для обмена между собой интерфейс обратной петли, и без этого правила работа таких приложений будет нарушена.

Если подходить к настройке не очень фанатично, то можно разрешить работу протокола ICMP (будут работать ping и traceroute ):

Разрешаем нашему серверу получать ответы от DNS-серверов:

Наш web-сервер (Apache или Nginx) прослушивает порты 80 и 443, а SSH-сервер — порт 22. Поэтому разрешаем входящий TCP трафик, который идет на destination port 80, 443 и 22.

Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt :

Любой исходящий трафик у нас разрешен, поэтому утилита apt может отправлять запросы на сервер репозитория. Но ей еще нужно получать ответы, поэтому разрешаем входящий TCP трафик, который идет с source port 80. Кроме того, уточняем — что этот трафик в ответ на запрос с нашего сервера.

Теперь можно проверить добавленные правила командой:

2. Политика DROP для OUTPUT

В этом случае все правила для цепочки INPUT будут такими же, но надо еще добавить правила для цепочки OUTPUT . Итак, первым делом задаем политику по умолчанию:

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

Разрешаем работу протокола ICMP (будут работать ping и traceroute ):

Разрешаем нашему серверу отправлять запросы DNS-серверам:

Разрешаем нашему серверу получать ответы от DNS-серверов:

Чтобы можно было устанавливать и обновлять пакеты с помощью утилиты apt :

Теперь можно проверить добавленные правила командой:

Настройка маршрутизатора

Есть компьютер с двумя сетевыми интерфейсами. Первый интерфейс eth0 смотрит в интернет и имеет белый ip-адрес 128.68.35.23 . Второй интерфейс eth1 смотрит в локальную сеть и имеет ip-адрес 192.168.100.1 .


Доступ в интернет (SNAT)

Этот компьютер должен обеспечивать выход в интернет для всех компьютеров из локальной сети 192.168.100.0/24 . По умолчанию транзитный трафик отключен, так что редактируем файл /etc/sysctl.conf :

Чтобы настройки вступили в силу:

Теперь настраиваем iptables :

Тем самым разрешили ходить транзитным пакетам для нашего диапазона ip адресов, а всё остальное запретили. Теперь настроим SNAT (подмена адреса источника), что позволит всем компьютерам сети выходить в интернет, используя единственный ip-адрес 128.68.35.23 .

Доступ внутрь сети (DNAT)

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

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

  • Вывод списка правил
  • Очистка счетчиков пакетов и байтов
  • Удаление правил
  • Сброс цепочек (удаление всех правил в цепочке)
  • Сброс всех цепочек и таблиц, удаление всех цепочек и прием любого трафика

Примечание: при работе с брандмауэрами необходимо следить за тем, чтобы не заблокировать собственный доступ к серверу, запретив подключение по SSH (по умолчанию в этих целях используется порт 22). При потере доступа из-за настроек брандмауэра вам может потребоваться подключение к серверу через внеполосную консоль для восстановления доступа.

Предварительные требования

Это учебное руководство предполагает использование сервера Linux с установленной командой iptables и наличие у пользователя привилегий sudo .

Если вам нужна помощь с данной начальной настройкой, воспользуйтесь нашим руководством по начальной настройке сервера Ubuntu 20.04. Вы также можете воспользоваться руководствами для Debian и CentOS

Давайте сначала рассмотрим, как просмотреть существующий список правил. Существует два различных способа просмотра действующих правил Iptables: в форме таблицы или списка спецификаций правил. Оба метода предоставляют приблизительно одну и ту же информацию в разных форматах.

Перечисление правил по спецификации

Чтобы перечислить все действующие правила Iptables, запустите команду iptables с опцией -S :

Как вы видите, вывод выглядит примерно так, как и команды, которые использовались для их создания, но не имеют команды iptables в начале. Также вывод будет напоминать файлы конфигурации правил Iptables, если вы когда-либо использовали iptables-persistent или iptables save .

Перечисление списка правил конкретной цепочки

Если вы хотите ограничить вывод конкретной цепочкой ( INPUT , OUTPUT , TCP и т. д.), вы можете указать название цепочки сразу после опции -S . Например, для отображения всех спецификаций правил в цепочке TCP необходимо запустить следующую команду:

Теперь давайте рассмотрим альтернативный способ просмотра действующих правил Iptables в форме таблицы правил.

Перечисление правил в виде таблицы

Перечисление правил Iptables в виде таблицы может быть полезным при сопоставлении разных правил друг с другом.

Чтобы вывести все действующие правила Iptables в виде таблицы, запустите команду iptables с опцией -L :

Эта команда будет выводить все действующие правила, отсортированные по цепочкам.

Если вы хотите ограничить вывод конкретной цепочкой ( INPUT , OUTPUT , TCP и т. д.), вы можете указать название цепочки сразу после опции -L .

Давайте рассмотрим пример цепочки INPUT:

Первая строка вывода указывает имя цепочки (в данном случае INPUT ), за которым следует используемая по умолчанию политика ( DROP ). Следующая строка состоит из заголовков каждого столбца таблицы, после чего идут правила цепочки. Давайте посмотрим, что означает каждый заголовок:

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

Отображение счетчиков пакетов и общего размера

При выводе списка правил Iptables также можно отобразить количество пакетов и общий размер пакетов (в байтах), которые отвечают каждому конкретному правилу. Это часто может быть полезно, когда вы пытаетесь получить приблизительное представление о том, какие правила используются для различных пакетов. Чтобы сделать это, воспользуйтесь опциями -L и -v в одной команде.

Например, давайте снова рассмотрим цепочку INPUT с опцией -v :

Обратите внимание, что список сейчас содержит два дополнительных столбца, pkts и bytes .

Теперь, когда вы знаете, как выводить список действующих правил брандмауэра различными способами, давайте рассмотрим возможность сброса счетчиков пакетов и байтов.

Сброс счетчиков пакетов и общего размера

Если вы хотите очистить или обнулить счетчики пакетов и байтов для ваших правил, воспользуйтесь опцией -Z . Счетчики также сбрасываются при перезагрузке. Это полезно, если вы хотите узнать, принимает ли ваш сервер новый трафик, отвечающий существующим правилам.

Чтобы очистить счетчики для всех цепочек и правил, используйте опцию -Z отдельно:

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

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

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

Удаление правил по спецификации

Одним из способов удаления правил Iptables является удаление правила по спецификации. Для этого вам нужно запустить команду iptables с опцией -D , указав далее спецификацию правила. Если вы хотите удалить правила с помощью этого метода, вы можете использовать команду для вывода списка правил iptables -S в качестве источника полезной информации.

Например, если вы хотите удалить правило, которое отклоняет недействительные входящие пакеты ( -A INPUT -m conntrack --ctstate INVALID -j DROP ), запустите следующую команду:

Обратите внимание, что опция -A , используемая для обозначения положения правила в момент его создания, здесь не применяется.

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

Другой способ удаления правил Iptables состоит в использовании цепочки и номера строки. Чтобы определить номер строки правила, выведите список правил в формате таблицы и добавьте опцию --line-numbers :

Эта команда добавляет номер строки для каждой строки таблицы правил в столбце с заголовком num .

Когда вы знаете, какое правило нужно удалить, запомните цепочку и номер строки правила. Затем запустите команду iptables -D , указав далее цепочку и номер правила.

Например, если мы хотим удалить правило для входящего трафика, которое отклоняет недействительные пакеты, мы видим, что это правило с номером 3 в цепочке INPUT . Поэтому нам нужно запустить следующую команду:

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

Сброс цепочек

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

Примечание: будьте осторожны, чтобы не заблокировать собственный доступ к серверу через SSH в результате сброса цепочки с используемой по умолчанию политикой drop или deny . В этом случае вам может потребоваться подключение через консоль для восстановления доступа.

Сброс отдельной цепочки

Чтобы сбросить конкретную цепочку с последующим удалением всех правил в данной цепи, вы можете использовать опцию -F или ее эквивалент --flush , добавив в команду имя цепочки, которую вы хотите сбросить.

Например, для удаления всех правил в цепочке INPUT запустите следующую команду:

Сброс всех цепочек

Чтобы сбросить все цепочки с последующим удалением всех правил брандмауэра, вы можете использовать опцию -F или ее эквивалент --flush без указания конкретной цепочки:

Сброс всех правил, удаление всех цепочек и разрешение любого трафика

Из этого раздела вы узнаете, как выполнить сброс всех правил брандмауэра, таблиц и цепочек, чтобы разрешить прием любого сетевого трафика.

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

Сначала задайте ACCEPT в качестве используемой по умолчанию политики для каждой встроенной цепочки. Главная причина этого шага состоит в том, чтобы гарантировать, что вы не заблокируете собственный доступ к вашему серверу через SSH:

Затем выполните сброс таблиц nat и mangle , сбросьте все цепочки ( -F ) и удалите все цепочки, не используемые по умолчанию ( -X ):

Теперь ваш брандмауэр будет принимать любой сетевой трафик. Если вы сейчас попробуете вывести список ваших правил, то увидите, что он пуст, и остались только три используемые по умолчанию цепочки ( INPUT , FORWARD и OUTPUT ).

Заключение

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

Не забывайте, что любые изменения, вносимые с помощью команды iptables , если их не сохранить, исчезнут после перезагрузки сервера. Данная информация описана в разделе «Сохранение правил» руководства «Распространенные правила и команды брандмауэра».

Файрвол в системе linux контролируется программой iptables (для ipv4) и ip6tables (для ipv6). В данной шпаргалке рассмотрены самые распространённые способы использования iptables для тех, кто хочет защитить свою систему от взломщиков или просто разобраться в настройке.

1. Показать статус.

Примерный вывод команды для неактивного файрвола:

Для активного файрвола:

Где:
-L : Показать список правил.
-v : Отображать дополнительную информацию. Эта опция показывает имя интерфейса, опции, TOS маски. Также отображает суффиксы 'K', 'M' or 'G'.
-n : Отображать IP адрес и порт числами (не используя DNS сервера для определения имен. Это ускорит отображение).

2. Отобразить список правил с номерами строк.

Вы можете использовать номера строк для того, чтобы добавлять новые правила.

3. Отобразить INPUT или OUTPUT цепочки правил.

4. Остановить, запустить, перезапустить файрвол.

Где:
-F : Удалить (flush) все правила.
-X : Удалить цепочку.
-t table_name : Выбрать таблицу (nat или mangle) и удалить все правила.
-P : Выбрать действия по умолчанию (такие, как DROP, REJECT, или ACCEPT).

5. Удалить правила файрвола.

Где:
-D : Удалить одно или несколько правил из цепочки.

6. Добавить правило в файрвол.

Вывод станет таким:

7. Сохраняем правила файрвола.

8. Восстанавливаем правила.

9. Устанавливаем политики по умолчанию.

10. Блокировать только входящие соединения.

11. Сбрасывать адреса изолированных сетей в публичной сети.

Список IP адресов для изолированных сетей:
10.0.0.0/8 -j (A)
172.16.0.0/12 (B)
192.168.0.0/16 (C)
224.0.0.0/4 (MULTICAST D)
240.0.0.0/5 (E)
127.0.0.0/8 (LOOPBACK)

12. Блокировка определенного IP адреса.

13. Заблокировать входящие запросы порта.

14. Заблокировать запросы на исходящий IP адрес.

Вывод:
CIDR: 69.171.224.0/19

15. Записать событие и сбросить.

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

16. Записать событие и сбросить (с ограничением на количество записей).

16. Сбрасывать или разрешить трафик с определенных MAC адресов.

17. Разрешить или запретить ICMP Ping запросы.

18. Открыть диапазон портов.

19. Открыть диапазон адресов.

20. Закрыть или открыть стандартные порты.

Заменить ACCEPT на DROP, чтобы заблокировать порт.

21. Ограничить количество параллельных соединений к серверу для одного адреса.

Где:
--connlimit-above 3 : Указывает, что правило действует только если количество соединений превышает 3.
--connlimit-mask 24 : Указывает маску сети.

Помощь по iptables.

Для поиска помощи по iptables, воспользуемся man:
$ man iptables

Проверка правила iptables.

Автор статьи Platon Puhlechev aka iFalkorr разрешает печатать данный текст.

Iptables отличный инструмент в руках администратора. Если нужно легко и просто защититься в десктопной Ubuntu, то стоит знать, что есть удобная консольная надстройка над iptables под названием UFW, а к ней есть графическая программа GUFW. Сделать свою Ubuntu ещё более защищённой поможет видеоматериал.

Читайте также: