Тарифы Услуги Сим-карты

Как разрешить все подключения iptables. Открытие диапазона IP-адресов. Принципы работы iptables

Надежный фаервол — один из важнейших аспектов защиты любой современной ОС. Большинство дистрибутивов Linux содержат несколько различных инструментов фаервола. Данное руководство посвящено одному из наиболее популярных — iptables.

Итак, iptables — это стандартный фаервол, включенный в большинство дистрибутивов Linux по умолчанию (для его замены разрабатывается nftables). На самом деле, iptables — это пользовательский интерфейс для управления системой netfilter, которая, в свою очередь, управляет сетевым стеком Linux. iptables сравнивает каждый поступающий пакет с набором установленных правил, а затем решает, что с ним делать дальше.

В речь шла о том, как именно работает iptables. Данная статья сконцентрирована на практических примерах, демонстрирующих создание базового набора правил для сервера Ubuntu 14.04.

Базовые команды iptables

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

Запомните : команды iptables нужно запускать с root-привилегиями. Это значит, что нужно выполнить одно из следующих действий:

  • войти в систему как пользователь root;
  • использовать su или sudo -i, чтобы развернуть оболочку root;
  • начинать все команды с sudo (рекомендуемый способ в Ubuntu).

В данном руководстве применяется последний вариант.

Итак, для начала нужно просмотреть список текущих правил iptables. Для этого используется флаг -L:

sudo iptables -L
Chain INPUT (policy ACCEPT)


target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Как можно видеть, список содержит три цепочки по умолчанию (INPUT, OUTPUT и FORWARD), в каждой из которых установлена политика по умолчанию (на данный момент это ACCEPT). Также можно видеть названия столбцов. Но в данном списке нет самих правил, поскольку Ubuntu поставляется без набора правил по умолчанию.

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

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

Чтобы реплицировать конфигурации, нужно только ввести sudo iptables в начале каждой строки результата. (В зависимости от конфигураций, эта процедура может оказаться немного более сложной при удаленном подключении; если правила, разрешающие текущее соединение, еще не установлены, не стоит устанавливать политику DROP).

Чтобы сбросить текущие правила (если таковые есть), наберите:

sudo iptables -F

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

Прежде чем сбросить правила при удаленном подключении необходимо убедиться, что в цепочках INPUT и OUTPUT установлена политика ACCEPT. Это делается так:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

Создав правила, разрешающие удаленное подключение, можно установить политику DROP. Итак, перейдем непосредственно к созданию правил.

Создание правил iptables

Как уже было сказано выше, данное руководство сконцентрировано на работе с цепочкой INPUT, поскольку она отвечает за входящий трафик. Для начала нужно рассмотреть уже упомянутое правило — правило, которое разрешает текущее SSH-подключение.

Оно выглядит так:

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

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

  • -A INPUT : флаг -А добавляет (append ) правило в конец цепочки. Эта часть команды сообщает iptables о необходимости внести правило в конец цепочки INPUT.
  • -m conntrack : кроме набора основных функций iptables также имеет набор расширений, или модулей, которые отвечают за дополнительные возможности фаервола. Данная часть команды говорит о том, что пользователю необходим доступ к функциям модуля conntrack. Этот модуль позволяет использовать команды, решающие, что делать с пакетом, на основе его отношения к предыдущим соединениям.
  • —ctstate : одна из команд, доступных при вызове модуля conntrack. Данная команда позволяет отслеживать отношение пакетов к другим пакетам, просмотренным ранее. Ей заданы значения ESTABLISHED (что позволяет принимать пакеты, которые являются частью существующего соединения) и RELATED (принимает пакеты, которые связаны с уже установленным соединением). Именно эта часть правила отвечает за текущую сессию SSH.
  • j ACCEPT : указывает действие (target), которое нужно выполнить над пакетом, который отвечает правилу. В этом случае iptables будет принимать (accept) пакеты, которые отвечают предыдущим критериям.

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

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

sudo iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination

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

Принятие других важных подключений

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

Оставьте открытыми два порта: порт SSH (в данном руководстве используется порт по умолчанию — 22; если данное значение было изменено, не забудьте ввести новое значение); кроме того, предположим, что на данном компьютере веб-сервер запущен на порту 80 по умолчанию (не добавляйте это правило, если это не так).

Итак, строки, которые нужно использовать для создания таких правил, выглядят так:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

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

  • p tcp : данная опция пропускает пакеты, использующие TCP (потоко-ориентированный протокол, который используется большинством приложений, поскольку обеспечивает надежную связь).
  • dport : данная опция доступна при использовании флага -p tcp. Она указывает входящий порт, с которым должен совпасть порт пакета. Первое правило пропускает пакеты TCP, направленные на порт 22, а второе правило принимает TCP-трафик, идущий на порт 80.

Теперь нужно создать еще одно правило ACCEPT, чтобы убедиться, что сервер работает должным образом. Как правило, сервисы взаимодействуют путем обмена пакетами; для этого они используют сетевой псевдоинтерфейс кольцевой связи — так называемый loopback device, который направляет трафик обратно на его источник, а не на другие компьютеры.

То есть, если сервису 1 необходимо установить связь с сервисом 2, прослушивающим соединения на порту 4555, то сервис 1 отправляет пакет на порт 4555 с помощью loopback device. Такое поведение нужно разрешить, поскольку оно является важным условием правильной работы многих программ.

Для этого добавьте следующее правило:

sudo iptables -I INPUT 1 -i lo -j ACCEPT

Оно немного отличается от предыдущих правил; рассмотрите его подробнее:

  • I INPUT 1 : флаг -I говорит iptables вставить (insert) правило. Данный флаг отличается от флага -А (который просто вносит правило в конец цепочки); он указывает цепочку, в которую нужно внести правило, и расположение правила в ней. В данном случае, правило нужно вставить в самое начало цепи INPUT, вследствие чего все правила передвинутся на одну позицию. Это правило нужно разместить в начале цепочки, поскольку оно является одним из основных правил и не должно зависеть от остальных.
  • i lo : данный компонент правила пропускает пакеты, которые используют интерфейс lo («lo» — это другое название для loopback device). Это значит, что любой пакет, использующий данный интерфейс, должен быть принят.

Чтобы просмотреть текущие правила, используйте флаг -S, поскольку флаг -L не выводит некоторую информацию (например, интерфейс, к которому привязано правило, что очень важно в случае с последним правилом):

sudo iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Создание правил DROP

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

Если пакет проходит по цепочке INPUT и не отвечает ни одному из четырех правил, будет выполнена политика по умолчанию (ACCEPT), которая так или иначе примет данный пакет. Теперь ее нужно изменить.

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

Первый способ — отредактировать политику по умолчанию цепочки INPUT; для этого наберите:

sudo iptables -P INPUT DROP

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

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

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

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

Чтобы вернуть цепочке INPUT политику ACCEPT, наберите:

sudo iptables -P INPUT ACCEPT

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

sudo iptables -A INPUT -j DROP

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

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

Конечно, это также означает, что любое правило, которое необходимо внести в конец цепочки, должно находиться перед правилом сброса. Это можно сделать, либо временно удалив правило сброса:

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT новое_правило
sudo iptables -A INPUT -j DROP

либо вставив новое правило в конец цепи (но перед правилом сброса), указав номер строки. Чтобы внести правило в строку 4, наберите:

sudo iptables -I INPUT 4 новое_правило

Если правил много, вычислить номер строки вручную достаточно проблематично; в таком случае iptables может пронумеровать строки:

sudo iptables -L --line-numbers
Chain INPUT (policy DROP)

1 ACCEPT all -- anywhere anywhere
2 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
4 ACCEPT tcp -- anywhere anywhere tcp dpt:http
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination

Это позволяет убедиться, что правило было внесено в нужную строку.

Сохранение настроек iptables

По умолчанию все несохраненные правила действуют до следующей перезагрузки сервера; сразу же после перезагрузки несохраненные правила будут потеряны.

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

Это можно сделать несколькими способами; самый простой из них — использовать пакет iptables-persistent, который можно загрузить из репозитория Ubuntu по умолчанию:

sudo apt-get update
sudo apt-get install iptables-persistent

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

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

Итоги

Данное руководство помогает настроить фаервол согласно требованиям пользователя. Конечно, существует еще огромное множество подобных утилит, и некоторые из них могут оказаться проще в использовании; все же, iptables — один из лучших инструментов, хотя бы потому что он демонстрирует некоторые основные структуры netfilter и включен во многие системы.

Tags: ,

Введение и история

Netfilter - межсетевой экран (он же, брандмауэр, он же файерволл, он же firewall...) встроен в ядро Linux с версии 2.4. Netfilter управляется утилитой iptables (Для IPv6 - ip6tables). До netfilter/iptables был Ipchains , который входил в состав ядер Linux 2.2. До ipchains в Linux был так называемый ipfw (IPV4 firewal) , перенесенный из BSD. Утилита управления - ipfwadm. Проект netfilter/iptables был основан в 1998. Автором является Расти Расселл (он же руководил и прошлыми разработками). В 1999 г. образовалась команда Netfilter Core Team (сокращено coreteam). Разработанный межсетевой экран получил официальное название netfilter. В августе 2003 руководителем coreteam стал Харальд Вельте (Harald Welte).

Проекты ipchains и ipfwadm изменяли работу стека протоколов ядра Linux, поскольку до появления netfilter в архитектуре ядра не существовало возможностей для подключения дополнительных модулей управления пакетами. iptables сохранил основную идею ipfwadm - список правил, состоящих из критериев и действия, которое выполняется если пакет соответствует критериям. В ipchains была представлена новая концепция - возможность создавать новые цепочки правил и переход пакетов между цепочками, а в iptables концепция была расширена до четырёх таблиц (в современных netfilter - более четырех), разграничивающих цепочки правил по задачам: фильтрация, NAT, и модификация пакетов . Также iptables расширил возможности Linux в области определения состояний, позволяя создавать межсетевые экраны работающие на сеансовом уровне.

Архитектура Netfilter/iptables

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

Как уже говорилось выше, для работы Netfilter необходимо ядро версии 2.6 (ну или хотя бы 2.3.15). Кроме того, при необходимо наличие настроек CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (таблица filter), CONFIG_IP_NF_NAT (таблица nat), CONFIG_BRIDGE_NETFILTER, а также многочисленные дополнительные модули: CONFIG_IP_NF_CONNTRACK (отслеживание соединений), CONFIG_IP_NF_FTP (вспомогательный модуль для отслеживания FTP соединений), CONFIG_IP_NF_MATCH_* (дополнительные типы шаблонов соответствия пакетов: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (дополнительные действия в правилах: REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINS для совместимости с ipchains, CONFIG_BRIDGE_NF_EBTABLES и CONFIG_BRIDGE_EBT_* для работы в режиме моста, прочие CONFIG_IP_NF_* и CONFIG_IP6_NF_*. Полезно также указать CONFIG_PACKET.

Как видно, таблица nat и mangle может модифицировать получателя или отправителя сетевого пакета. Именно поэтому сетевой пакет несколько раз сверяется с таблицей маршрутизации.

Механизм определения состояний (conntrack)

Выше в тексте несколько раз указывалось понятие "определение состояний", оно заслуживает отдельной темы для обсуждения, но тем не менее я кратко затрону данный вопрос в текущем посте. В общем, механизм определения состояний (он же state machine, он же conn ection track ing, он же conntrack ) является частью пакетного фильтра и позволяет определить определить к какому соединению/сеансу принадлежит пакет. Conntrack анализирует состояние всех пакетов, кроме тех, которые помечены как NOTRACK в таблице raw . На основе этого состояния определяется принадлежит пакет новому соединению (состояние NEW ), уже установленному соединению (состояние ESTABLISHED ), дополнительному к уже существующему (RELATED ), либо к "другому " (неопределяемому) соединению (состояние INVALID ). Состояние пакета определяется на основе анализа заголовков передаваемого TCP-пакета. Модуль conntrack позволяет реализовать межсетевой экран сеансового уровня (пятого ). Для управления данным механизмом используется утилита conntrack, а так же параметр утилиты iptables: -m conntrack или -m state (устарел). Состояния текущих соединений conntrack хранит в ядре. Их можно просмотреть в файле /proc/net/nf_conntrack (или /proc/net/ip_conntrack) .

Чтобы мысли не превратились в кашу, думаю данной краткой информации для понимания дальнейшего материала будет достаточно.

Управление правилами сетевой фильтрации Netfilter (использование команды iptables)

Утилита iptables является интерфейсом для управления сетевым экраном netfilter . Данная команда позволяет редактировать правила таблиц, таблицы и цепочки. Как я уже говорил - каждое правило представляет собой запись/строку, содержащую в себе отбора сетевых пакетов и над пакетами, которые соответствуют заданному правилу. Команда iptables требует для своей работы прав root.

В общем случае формат команды следующий:

Iptables [-t ]

Все параметры в квадратных скобках - необязательны . По умолчанию используется таблица filter , если же необходимо указать другую таблицу, то следует использовать ключ -t с указанием имени . После имени таблицы указывается , определяющая действие (например : вставить правило, или добавить правило в конец цепочки, или удалить правило). задает параметры отбора. указывает, какое действие должно быть выполнено при условии совпадения критериев отбора в правиле (например : передать пакет в другую цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке...).

Ниже приведены команды и параметры утилиты iptables:

Параметр Описание Пример
Команды
--append (-A) Добавить в указанную цепочку и указанную таблицу заданное правило в КОНЕЦ списка. iptables -A FORWARD критерии -j действие
--delete (-D) Удаляет заданное номером(ами) или правилом(ами) правило(а). Первый пример удаляет все правила с номерами 10,12 во всех цепочках, в таблицах filter, второй пример удаляет заданное правило из таблицы mangle в цепочке PREROUTING. iptables -D 10,12
iptables -t mangle -D PREROUTING критерии -j действие
--rename-chain (-E) Изменить имя цепочки. iptables -E OLD_CHAIN NEW_CHAIN
--flush (-F) Очистка всех правил текущей таблицы. Ко всем пакетам, которые относятся к уже установленным соединениям, применяем терминальное действие ACCEPT - пропустить iptables -F
--insert (-I) Вставляет заданное правило в место, заданное номером. iptables -I FORWARD 5 критерии -j действие
--list (сокр. -L) Просмотр существующих правил (без явного указания таблицы - отображается таблица filter всех цепочек). iptables -L
--policy (-P) Устанавливает стандартную политику для заданной цепочки. iptables -t mangle -P PREROUTING DROP
--replace (-R) Заменяет заданное номером правило на заданное в критериях. iptables -R POSROUTING 7 | критерии -j действие
--delete-chain (-X) Удалить ВСЕ созданные вручную цепочки (оставить только стандартные INPUT, OUTPUT, FORWARD, PREROUTING и POSTROUTING). iptables -X
--zero (-Z) Обнуляет счетчики переданных данных в цепочке. iptables -Z INPUT
Параметры
--numeric (-n) Не резолвит адреса и протоколы при выводе.
--line-numbers Указывать номера правил при выводе (может использоваться совместно с -L). iptables -L --line-numbers
--help (-h) куда же без нее
-t таблица Задает название таблицы, над которой необходимо совершить действие. В примере сбрасывается таблица nat во всех цепочках. iptables -t nat -F
--verbose (-v) Детальный вывод. iptables -L -v

Критерии (параметры) отбора сетевых пакетов команды iptables

Критерии отбора сетевых пакетов негласно делятся на несколько групп: Общие критерии, Неявные критерии, Явные критерии. допустимо употреблять в любых правилах, они не зависят от типа протокола и не требуют подгрузки модулей расширения. (я бы из назвал необщие ), те критерии, которые подгружаются неявно и становятся доступны, например при указании общего критерия --protocol tcp|udp|icmp . Перед использованием , необходимо подключить дополнительное расширение (это своеобразные плагины для netfilter). Дополнительные расширения подгружаются с помощью параметра -m или --match . Так, например, если мы собираемся использовать критерии state , то мы должны явно указать это в строке правила: -m state левее используемого критерия. Отличие между явными и неявными необщими критериями заключается в том, что явные нужно подгружать явно, а неявные подгружаются автоматически.

Во всех критериях можно использовать знак! перед значением критерия. Это будет означать, что под данное правило подпадают все пакеты, которые не соответствуют данному параметру . Например : критерий --protocol ! tcp будет обозначать, что все пакеты, которые не являются TCP-протоколом подходят под действие правила. Однако последние версии iptables (в частности, 1.4.3.2 и выше), уже не поддерживают этот синтаксис и требуют использования не --protocol ! tcp , а ! --protocol tcp , выдавая следующую ошибку:

Using intrapositioned negation (`--option ! this`) is deprecated in favor of extrapositioned (`! --option this`).

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

Параметр Описание Пример
Общие параметры
--protocol
(сокр. -p)
Определяет протокол . Опции tcp, udp, icmp, all или любой другой протокол определенный в /etc/protocols iptables -A INPUT -p tcp
--source
(-s, --src)
IP адрес источника пакета. Может быть определен несколькими путями:
  • Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
  • Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0

Настойчиво не рекомендуется использовать доменные имена, для разрешения (резольва) которых требуются DNS-запросы, так как на этапе конфигурирования netfilter DNS может работать некорректно. Также, заметим, имена резольвятся всего один раз - при добавлении правила в цепочку. Впоследствии соответствующий этому имени IP-адрес может измениться, но на уже записанные правила это никак не повлияет (в них останется старый адрес). Если указать доменное имя, которое резольвится в несколько IP-адресов, то для каждого адреса будет добавлено отдельное правило.

iptables -A INPUT -s 10.10.10.3
--destination
(-d)
IP адрес назначения пакета. Может быть определен несколькими путями (см. --source). iptables -A INPUT --destination 192.168.1.0/24
--in-interface
(-i)
Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами. Применяется в цепочках INPUT, FORWARD и PREROUTING. Возможно использование знака "+", тогда подразумевается использование всех интерфейсов, начинающихся на имя+ (например eth+ - все интерфейсы eth). iptables -t nat -A PREROUTING --in-interface eth0
--out-interface
(-o)
Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с несколькими сетевыми интерфейсами. Применяется в цепочках OUTPUT, FORWARD и POSTROUTING. Возможно использование знака "+". iptables -t nat -A POSTROUTING --in-interface eth1
Неявные (необщие) параметры
-p proto -h вывод справки по неявным параметрам протокола proto. iptables -p icmp -h
--source-port
(--sport)
Порт источник, возможно только для протоколов --protocol tcp, или --protocol udp iptables -A INPUT --protocol tcp --source-port 25
--destination-port
(--dport)
Порт назначения, возможно только для протоколов --protocol tcp, или --protemocol udp iptables -A INPUT --protocol udp --destination-port 67
Явные параметры
-m state --state (устарел)
он же
-m conntrack --ctstate

Состояние соединения. Доступные опции:

  • NEW (Все пакеты устанавливающие новое соединение)
  • ESTABLISHED (Все пакеты, принадлежащие установленному соединению)
  • RELATED (Пакеты, не принадлежащие установленному соединению, но связанные с ним. Например - FTP в активном режиме использует разные соединения для передачи данных. Эти соединения связаны.)
  • INVALID (Пакеты, которые не могут быть по тем или иным причинам идентифицированы. Например, ICMP ошибки не принадлежащие существующим соединениям)
  • и др. (более подробно в документации)
iptables -A INPUT -m state --state NEW,ESTABLISHEDiptables -A INPUT -m conntrack --ctstate NEW,ESTABLISHED
-m mac --mac-source Задает MAC адрес сетевого узла, передавшего пакет. MAC адрес должен указываться в форме XX:XX:XX:XX:XX:XX. -m mac --mac-source 00:00:00:00:00:0

Действия над пакетами

Данный заголовок правильнее будет перефразировать в "Действия над пакетами, которые совпали с критериями отбора ". Итак, для совершения какого-либо действия над пакетами , необходимо задать ключ -j (--jump) и указать, какое конкретно действие совершить.

Действия над пакетами могут принимать следующие значения:

  • ACCEPT - пакет покидает данную цепочку и передается в следующую (дословно - ПРИНЯТЬ).
  • DROP - отбросить удовлетворяющий условию пакет, при этом пакет не передается в другие таблицы/цепочки.
  • REJECT - отбросить пакет, отправив отправителю ICMP-сообщение, при этом пакет не передается в другие таблицы/цепочки.
  • RETURN - возвратить пакет в предыдущую цепочку и продолжить ее прохождение начиная со следующего правила.
  • SNAT источника в пакете. Может использоваться только в цепочках POSTROUTING и OUTPUT в таблицах nat.
  • DNAT - применить трансляцию адреса назначения в пакете. Может использоваться в цепочке PREROUTING в таблице nat. (в исключительных случаях - в цепочке OUTPUT)
  • LOG - протоколировать пакет (отправляется демону ) и обработать остальными правилами.
  • MASQUERADE - используется вместо SNAT при наличии соединения с динамическим IP (допускается указывать только в цепочке POSTROUTING таблицы nat).
  • MARK - используется для установки меток на пакеты, передается для обработки дальнейшим правилам.
  • и др.

Кроме указанных действий, существуют и другие, с которыми можно ознакомиться в документации (возможно, в скором времени я дополню статью в ходе освоения темы). У некоторых действий есть дополнительные параметры.

В таблице ниже приведены примеры и описания дополнительных параметров:

Параметр Описание Пример
DNAT (Destination Network Address Translation)
--to-destination указывает, какой IP адрес должен быть подставлен в качестве адреса места назначения. В примере во всех пакетах протокола tcp, пришедших на адрес 1.2.3.4, данный адрес будет заменен на 4.3.2.1. iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 -j DNAT --to-destination 4.3.2.1
LOG
--log-level Используется для задания уровня журналирования (). В примере установлен максимальный уровень логирования для всех tcp пакетов в таблице filter цепочки FORWARD. iptables -A FORWARD -p tcp -j LOG --log-level debug
--log-prefix Задает текст (префикс), которым будут предваряться все сообщения iptables . (очень удобно для дальнейшего ) Префикс может содержать до 29 символов, включая и пробелы. В примере отправляются в syslog все tcp пакеты в таблице filter цепочки INPUT с префиксом INRUT-filter. iptables -A INPUT -p tcp -j LOG --log-prefix "INRUT-filter"
--log-ip-options Позволяет заносить в различные сведения из заголовка IP пакета. iptables -A FORWARD -p tcp -j LOG --log-ip-options
и др...

На этом закончим теорию о сетевом фильтре netfilter/iptables. В следующей статье я приведу практические примеры для усвоения данной теории.

Резюме

В данной статье мы рассмотрели очень кратко основные понятия сетевого фильтра в Linux. Итак, подсистема netfilter/iptables является частью ядра Linux и используется для организации различных схем фильтрации и манипуляции с сетевыми пакетами. При этом, каждый пакет проходит от сетевого интерфейса, в который он прибыл и далее по определенному маршруту цепочек, в зависимости от того, предназначен он локальной системе или "нелокальной". Каждая цепочка состоит из набора таблиц, содержащих последовательный набор правил. Каждое правило состоит из определенного критерия/критериев отбора сетевого пакета и какого-то действия с пакетом, соответствующего данным критериям. В соответствии с заданными правилами над пакетом может быть совершено какое-либо действие (Например, передача следующей/другой цепочке, сброс пакета, модификация содержимого или заголовков и др.). Каждая цепочка и каждая таблица имеет свое назначение, функциональность и место в пути следования пакета. Например для фильтрации пакетов используется таблица filter, которая содержится в трех стандартных цепочках и может содержаться в цепочках, заданных пользователем. Завершается путь пакета либо в выходящем сетевом интерфейсе, либо доставкой локальному процессу/приложению.

Литература

Довольно много интересной информации на русском содержится тут:

  • http://www.opennet.ru/docs/RUS/iptables/
  • http://ru.wikibooks.org/wiki/Iptables

Более глубоко материал доступен на буржуйском вот тут:

  • http://www.frozentux.net/documents/ipsysctl-tutorial/
  • http://www.netfilter.org/documentation/index.html

С Уважением, Mc.Sim!

Всё очень просто, в очередной раз объясняя на форуме новичкам в мире Linux, что да как я понял, что на просторах интернет не найти собранную воедино статью с объяснением не только настройки iptables, но и некоторых сетевых основ.
Так что вашему вниманию я представляю небольшой экскурс по настройке firewall в Linux. Углубимся лишь в настройку netfilter/iptables, остальных прикладных вопросов мы несомненно тоже коснёмся, ведь нам не хватает именно комплексных ответов на наши вопросы… И я постараюсь ка можно более доходчиво здесь все изложить.

Как это выглядит

Мы будем рассматривать типичную схему для офисов и для квартир, да-да именно квартир! Мало у кого есть собственный маленький сервачок дома под столом, но у большинства интернет дома раздается через роутер и в большинстве своём они тоже прошиты Linux.
Это типичная схема малого офиса. Когда к интернет подключен 1 компьютер(сервер), а остальные подключаются к интернет уже через этот сервер.

Поехали, потихонечку...

И так что же мы имеем:
  • сервер с 2мя сетевыми картами и установленным на нём Debian Lenny
  • имеющийся по умолчанию в Debian Lenny firewall - netfilter/iptables
  • локальную сеть из N компьютеров, все соединены через коммутатор, в том числе и сервер
что такое NAT
Для начала нам нужно понять, что настраивать мы будем самый обыкновенный NAT(Network Address Translation). Для жаждущих, я в конце упомяну и о проксе сервере на примере squid. Как я уже сказал разжёвывать будем практически всё.
Что же такое NAT? На самом деле все просто, все компьютеры имеют физический (MAC) и сетевой (IP) адреса. Нас в данный момент интересуют IP адреса. IP адрес в пределах одной сети должен быть уникальным! А при нынешнем стандарте IPv4 уникальными могут быть всего-то 4 294 967 296 (2 32), что совсем не много и они практически кончились. но не переживайте вот вот вступит в широкое распространение IPv6, а там адресов навалом!
Но тут вы можете заметить, компьютеров значительно больше того числа, что позволяет IPv4 или скажете, что у друга дома такой же адрес как и у вас! И вот тут-то и заходит речь о NAT - он позволяет соединять компьютерные сети между собой используя единственный, свой IP адрес, действия фаервола при этом называется SNAT(Source NAT или подмена адреса источника). Т.е. в 99% случаев вся ваша контора выходит в интернет под 1 IP адресом, при этом внутри офиса у каждого он свой. О классах IP адресов вы сможете прочесть в интерне.

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

транзитный трафик
Все команды выполняются от имени root(суперпользователь). В Debian по умолчанию отключен так называемый транзитный трафик, т.е. по умолчанию предусмотрена работа только как единичная машина. Как вы уже догадались, без транзитного трафика нету и NAT. Для его включения достаточно изменить 1 цифру - $ echo 1 > /proc/sys/net/ipv4/ip_forward , но данная настройка слетит после перезагрузки, так что лучше поправить конфиг - $ nano /etc/sysctl.conf далее ищем строчку #net.ipv4.ip_forward=1 и убираем «решётку»(символ комментария) в начале строки и проверяем что значения равно 1! Теперь можно приступать непосредственно к конфигурированию iptables.
настраиваем iptables
В интернет, есть много статей о том как писать правила в iptables и что с их помощью можно творить, наиболее полным и приятным для чтения мне показалась .
И так приступим. Для начала очистим таблицы от лишних правил, вдруг там что было лишнего…
$ iptables -F
$ iptables -t nat -F
$ iptables -t mangle -F

Лишнее почистили. Очень важно понять и помнить, что правила в iptables применяются иерархически, т.е. правило стоящее выше выполнится раньше. Все цепочки по умолчанию имеют политику ACCEPT - разрешают всё. что не попало под правила данной цепочки.
Условимся, что интерфейс смотрящий в локальную сеть - eth0, а в интернет - eth1, локальная сеть имеет адреса 192.168.0.0/24, а провайдер выдал нам статический адрес 10.188.106.33(пускай и не «белый» - о типах ip адресов вы также можете посмотреть в интернет). И так пишем:
$ iptables -A FORWARD -i eth0 -o eth1 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A FORWARD -i eth1 -o eth0 -d 192.168.0.0/24 -j ACCEPT
$ iptables -P FORWARD DROP

тем самым разрешили ходить транзитным пакетам через firewall для нашего диапазона ip адресов, а всё остальное запрещаем.
Теперь сам NAT:
$ iptables -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j SNAT --to-source 10.188.106.33
Этого достаточно для того что бы у вас заработал NAT.
по мелочам...
На клиентах указываем ip из выбранного диапазона и указываем в качестве шлюза ip адрес нашего сервера(обычно его назначают первым из подсети - я оставлю это на ваше усмотрение). Все сетевые настройки на сервере можно провести так:
$ nano /etc/network/interfaces в нём указываются настройки ваших сетевых интерфейсов.
доступ в недры сети через шлюз или DNAT
И тут вы поняли, что в сети у вас есть Windows Server к которому у вас всегда был простой доступ по RDP, а тут вылез это назойливый шлюз на Debian! Всё очень просто - надо всего лишь добавить DNAT правило в наш iptables.
Что за зверь DNAT? DNAT (Destination NAT или подмена адреса получателя) - сетевые карты работают в таком режиме, что они принимают только пакеты адресованные именно им, а зайти на наш сервер если ip под которым он выходит в интернет сидят еще десяток машин в вашем офисе? Как запрос дойдёт именного до него? На самом деле все запросы такого рода упираются в наш шлюз. И всё что нам надо сделать это задать правила для работы с такими пакетами.
$ iptables -A PREROUTING -i eth1 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.0.2
Это простое правило будет переадресовывать все пакеты приходящие на шлюз из интернет на порт TCP 3389(именно его использует RDP протокол) на ваш внутренний Windows Server. И, вуаля, у вас все работает.
итак что там с любимым squid
И хотя сейчас все работает, у всех есть интернет и все работает, некоторым всё же нужен прокси сервер. Я не буду рассказывать о настройке squid, я покажу правило которое позволит сделать его «прозрачным». В сквид надо лишь прописать волшебное слово transparent в нужном месте и он начнём корректно обрабатывать свалившееся на него запросы.
Пишем $ iptables -A PREROUTING -d! 192.168.0.0/24 -i eth0 -p tcp -m multiport --dports 80,443 -j REDIRECT --to-ports 3128 .
И что же нам это даёт? Теперь все запросы на web страницы с ваших рабочих мест по http((80) и https(443) протоколам будут перенаправляться на порт который слушает squid. Вы получает контентную фильтрацию, информацию о том кто где был и что делал в интернет, пользователь ни чего не подозревая работает как и раньше…
немного безопасности
Следует хоть минимально защитить свой шлюз поэтому добавим еще пару правил
$ iptables -A INPUT -i lo -j ACCEPT
$ iptables -A INPUT -i eth0 -s 192.168.0.0/24 -j ACCEPT
$ iptables -A INPUT -i eth1 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
$ iptables -P INPUT DROP

Тем самым запретили любое общение непосредственно с шлюзом, кроме уже установленных соединений, т.е. те что были инициированы вами и вы просто получаете на них ответы. Не бойтесь наш DNAT до этих правил просто не доходит…
почему так мало?
Статья не резиновая и обо всем все-равно не расскажешь… Я привел минимальный набор действий и понятий что бы вы могли начать осваивать такую махину как шлюз на Linux. Здесь можно говорить очень и очень долго, обсуждая многие аспекты и возможности netfilter.

Итого

Как мы видим все действительно просто! Главное это понять принцип функционирования сети и не боятся настраивать и читать большие мануалы.
Надеюсь мне удалось собрать воедино информацию достаточную для начала вашей дружбы с программными маршрутизаторами на основе Linux.

Теги: iptables, netfilter, NAT

iptables - утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4 и 2.6. Для использования утилиты iptables требуются привилегии суперпользователя (root).Иногда под словом iptables имеется в виду и сам межсетевой экран netfilter.

1. Что же такое межсетевой экран и зачем он нужен?

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

Основной задачей сетевого экрана является компьютерных сетей или отдельных узлов от несанкционированного доступа. Также сетевые экраны часто называют фильтрами, так как их основная задача - не пропускать (фильтровать) пакеты, не подходящие под критерии, определённые в конфигурации.

2. Принципы работы iptables

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

В Iptables используется три вида таблиц:

  1. Mangle - обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.
  2. Nat - эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях.
  3. Filter - здесь производится фильтрация трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.

Соответственно, нас интересует третья таблица Filter. В этой таблицы имеются три встроенные цепочки:

  1. INPUT - для входящих пакетов.
  2. FORWARD - для проходящих через данную машину к другой.
  3. OUTPUT - для исходящих.

Пакет, проходящий через эти цепочки, исходя из правила может быть пропущен (ACCEPT) или отброшен (DROP).

Программа Iptables позволяет редактировать правила через терминал путем ввода команд.

Немного о написании правил:

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

Iptables [-t имя-таблицы ] команда [шаблон] [-j действие ]

Опция -t задает таблицу . Если опция упущена, то по умолчанию предполагается использование таблицы filter. Если предполагается использование другой таблицы, то это требуется указать явно.

Далее, непосредственно за именем таблицы, должна стоять команда. Если спецификатора таблицы нет, то команда всегда должна стоять первой.
Команда определяет действие iptables, например: вставить правило, или добавить правило в конец цепочки, или удалить правило и т.п.

Список команд:

  • -A имя-цепочки правило (добавить правило в конец цепочки; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -I имя-цепочки номер правило (вставить правило в цепочку перед правилом с указанным номером, нумерация с 1; ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -R имя-цепочки номер правило (заменить;
    ключ --set-counters позволяет установить счётчики пакетов и байтов)
  • -D имя-цепочки номер (удалить правило с указанным номером, нумерация с 1)
  • -D имя-цепочки правило (удалить правило по текстуальному совпадению)
  • -C имя-цепочки пакет (тестировать прохождение пакета;
    исходящий адрес, адрес назначения, протокол, интерфейс, порты задаются соответствующими ключами)
  • -L [имя-цепочки ] (показать список правил; дополнительные ключи:
    • -v (вывести дополнительную информацию, в частности, счётчики)
    • --exact (показывать счётчики без округления до KB, MB и т.д.)
    • --numeric (показывать адреса и номера портов в виде чисел)
    • --line-numbers (выводить номера правил)
  • -F имя-цепочки (удалить все правила из цепочки)
  • -Z имя-цепочки (обнулить счетчики)
  • -N имя-цепочки (создать цепочку)
  • -X имя-цепочки (удалить пустую цепочку, на которую нет ссылок)
  • -P имя-цепочки действие (изменить действие по умолчанию: ACCEPT,
    DROP, QUEUE, RETURN)
  • -E старое-имя-цепочки новое-имя-цепочки (переименовать цепочку)

Раздел шаблон задает критерии проверки, по которым определяется подпадает ли пакет под действие этого правила или нет.Здесь можно указать самые разные критерии - IP-адрес источника пакета или сети, сетевой интерфейс. IP-адрес места назначения, порт, протокол и т.д. Остальные параметры для фильтации можно посмотреть в справке по утилите iptables(man iptables)

И наконец действие указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле. Здесь можно заставить ядро передать пакет в другую цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке и т.п.

Список некоторых действий:

  • ACCEPT - пропустить пакет; просмотр таблицы завершается
  • DROP - выбросить молча; просмотр завершается не только для текущей цепочки, но и для других таблиц
  • REJECT - выбросить, известив отправителя (--reject-with тип-извещения )

3. Порядок следования сетевого пакета, предназначенного локальному процессу/приложению:

Для локального приложения

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. )
2 Входной
3 mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8 Локальный процесс/приложение (т.е., программа-сервер или программа-клиент)

Важно помнить, что на этот раз пакеты идут через цепочку INPUT, а не через FORWARD.

Порядок движения пакетов, созданных локальными процессами.

От локальных процессов

Шаг Таблица Цепочка Примечание
1 Локальный процесс (т.е., программа-сервер или программа-клиент).
2 Принятие решения о маршрутизации. Здесь решается куда пойдет пакет дальше -- на какой адрес, через какой сетевой интерфейс и пр.
3 mangle OUTPUT Здесь производится внесение изменений в заголовок пакета. Выполнение фильтрации в этой цепочке может иметь негативные последствия.
4 nat OUTPUT Эта цепочка используется для трансляции сетевых адресов (NAT) в пакетах, исходящих от локальных процессов брандмауэра.
5 Filter OUTPUT Здесь фильтруется исходящий траффик.
6 mangle POSTROUTING Цепочка POSTROUTING таблицы mangle в основном используется для правил, которые должны вносить изменения в заголовок пакета перед тем, как он покинет брандмауэр, но уже после принятия решения о маршрутизации. В эту цепочку попадают все пакеты, как транзитные, так и созданные локальными процессами брандмауэра.
7 nat POSTROUTING Здесь выполняется Source Network Address Translation. Не следует в этой цепочке производить фильтрацию пакетов во избежание нежелательных побочных эффектов. Однако и здесь можно останавливать пакеты, применяя политику по-умолчанию DROP.
8 Сетевой интерфейс (например, eth0)
9 Кабель (т.е., Internet)

Порядок движения транзитных пакетов

Шаг Таблица Цепочка Примечание
1 Кабель (т.е. Интернет)
2 Сетевой интерфейс (например, eth0)
3 mangle PREROUTING Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр..
4 nat PREROUTING Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5 Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет -- локальному приложению или на другой узел сети.
6 mangle FORWARD Далее пакет попадает в цепочку FORWARD таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
7 Filter FORWARD В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
8 mangle POSTROUTING Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
9 nat POSTROUTING Эта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскарадинг (Masquerading).
10 Выходной сетевой интерфейс (например, eth1).
11 Кабель (пусть будет LAN).

Есть три различных варианта прохождения пакетов.

1. Из вне на локальную службу (сервер) этого компьютера (INPUT).

2. От локальной службы (сервера) этого компьютера во вне (OUTPUT).

3. Прохождение мимо, шлюзование, мимо этого сетевого интерфейса этого компьютера (FORWARD).

4. Несколько примеров настройки:

пример скрипта:

#задаем переменные для обозначения внешнего и внутреннего сетевого интерфейса

LOCAL_IF="eth0"
INET_IF="eth0:g"

#=======================
# Удалить все правила из цепочки.
#=======================
iptables -F
iptables -X

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

iptables -P INPUT DROP

iptables -P OUTPUT DROP

iptables -P FORWARD ACCEPT

#=======================
# Создаем правила для всех интерфейсов.
#=======================

# http - открываем 80 порт
iptables -A INPUT -i ALL -p tcp -m tcp --dport 80 -j ACCEPT
iptables -A INPUT -i ALL -p icmp -j ACCEPT

#=======================
# Создаем правила для внутреннего интерфейса.
#=======================

# ssh - открываем 22

iptables -A INPUT -p tcp -i $LOCAL_IF -m tcp --dport 22 -j ACCEPT

осталось запустить скрипт

примеры отдельных цепочек:

Разрешаем все на внутренних интерфейсах (lo, eth0, eth1 - внутренние интрефейсы)
iptables -A INPUT -i eth1 -j ACCEPT
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A INPUT -i lo -j ACCEPT

Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ip --dport 80 -j ACCEPT

Открываем протокол
iptables -A INPUT -p gre -j ACCEPT

5. Ссылки на документацию по настройке iptables

http://www.posix.ru/network/iptables/ -статья Дмитрия Кулакова "Настройка межсетевого экрана Iptables"

http://www.opennet.ru/docs/RUS/iptables/ - статья Оскара Андерсона в переводе Андрея Киселева "Руководство по iptables"

http://system-administrators.info/?p=396 - статья "netfilter и iptables в Linux: принципы работы, настройка"

http://www.iptables.ru/ - пошаговое конфигурирование iptables. технической поддержки


Оставьте свой комментарий!

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

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

Сценарии сетевых подключений

Перед настройкой фаервола обязательно нужно иметь точное представление о том, какие сетевые соединения и как должны устанавливаться при работе системы, чтобы все сервисы могли нормально работать. Чем точнее у нас картина работы сетевых сервисов, как работающих на нашем сервере, так и на других серверах, тем более тонко можно настроить систему. Поэтому желательно всегда сначала описывать сценарии того, как всё должно работать, и только потом начинать настраивать фаервол. Сценарий можно написать в любом текстовом редакторе. Сначала описываем все внешние сервисы, с которыми работает сервер, а затем все сервисы, которые работают на сервере. Зачем это надо? Чтобы точно представлять сам процесс работы, без углубления в техническую часть. После написания максимально точного сценария можно приступать к настройке фаервола. Описание в сценарии должно выглядеть примерно так:

1) Все пользователи могут просматривать сайт. По умолчанию сайт на русском языке.
2) Если пользователи пришли с адресов <список-адресов-или-маска-подсети>, то им должен быть показан сайт на украинском. В нашем примере это будет, допустим, интернет-магазин с одним доменным именем, отображаемый на русском или украинском языке, и имеющий в продаже свой набор для России и Украины. У нас будет просто два сайта, один на русском, второй на украинском, и по адресу, с которого пришел клиент, будет определяться, на какой сайт он попадет. Пример взят из головы, на практике, конечно, такие вопросы решаются по другому. Можно также не разрешать просмотр сайта с китайских адресов из-за постоянного спама в комментариях на китайском.
3) Из офиса должна быть доступна почта, из других мест она не должна быть доступна.
4) Извне должна быть обеспечена возможность подключения к ВПН
5) Мы можем использовать только несколько DNS-серверов, которым мы доверяем. Все остальные сервера DNS должны быть недоступны
6) …..

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

Настройка iptables: Самая простая конфигурация

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

В первую очередь, необходимо очистить загруженные правила:

Iptables -F INPUT iptables -F OUTPUT iptables -F FORWARD

INPUT, OUTPUT, FORWARD — это три основные цепочки, по которым будут идти пакеты, входящие, исходящие и проходящие с интерфейса на интерфейс.

После этого необходимо задать политику по умолчанию. Их всего две — ACCEPT и DROP, принимать пакеты или не принимать. Для боевого сервера всегда необходимо выбирать DROP, а затем открывать всё, что необходимо и не более того.

Для задания таких политик необходимо предварительно разрешить соединения по SSH, будем считать, что мы не меняли стандартный порт (что обычно следует на боевых серверах делать сразу после установки SSH-сервера).

Iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

И после этого уже можно приступать к изменению политик по умолчанию:

Iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP

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

Итак. В данный момент у нас открыт только порт SSH-сервера для входящих соединений, на все остальные порты соединения проходить не будут. Теперь надо добавить прием соединений на порты остальных сервисов, если они на вашем сервере запущены.

Iptables -t filter -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT

DNS (обычно достаточно разрешить UDP, но можно также добавить и TCP):

Iptables -t filter -A INPUT -p udp -m udp --dport 53 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT

Iptables -t filter -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Но это еще не всё. Порты открыты, сервисы доступны извне, но почта не работает и доменные имена не резолвятся. Дело в том, что при запросе DNS-серверов запрос отправляется с произвольного свободного порта из числа непривелегированных, точно так же, как и соединение с другим почтовым сервером. И ответ эти сервисы отправляют на тот же самый порт. А этот порт, как вы понимаете, у нас закрыт. Мы могли бы открыть этот порт, но мы не знаем, с какого порта будет исходящее соединение. Поэтому мы можем сделать самое простое, что может быть,- разрешить соединения с определенных портов удаленного компьютера:

Iptables -t filter -A INPUT -p tcp -m tcp --sport 25 -j ACCEPT

Iptables -t filter -A INPUT -p udp -m udp --sport 53 -j ACCEPT

Эти два правила разрешают входящие соединения с портов 25/tcp и 53/udp, поэтому, когда с этих портов приходят пакеты по соответствующему протоколу, они будут приняты. Если вы планируете обновлять систему, программное обеспечение или устанавливать пакеты, необходимые для работы, то вам придется разрешить соединения с 80 порта удаленных машин.

Вот теперь самая простая конфигурация iptables у нас готова.

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

Обработка источника соединения

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

Iptables -t filter -A INPUT -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Данное правило позволяет принимать пакеты на 22 порт по протоколу TCP только из источника с адресом 123.123.123.123, на это указывает параметр «-s» (source, источник). Таким образом вы можете ограничить соединения с сервером по SSH одним определенным IP-адресом, либо определенной подсетью, если укажете маску подсети, из которой разрешены соединения вместо отдельного IP-адреса.

Если у вас всегда используется один и тот же почтовый шлюз, через который ваш сервер отправляет почту, то вы можете, например, ограничить соединения с порта 25/tcp, указав этот шлюз в качестве источника.

Правила для конкретного сетевого интерфейса или IP-адреса

На сервере может быть несколько сетевых интерфейсов. Обычно их как минимум два — внешний сетевой и так называемый loopback-интерфейс 127.0.0.1, доступ к которому извне невозможен, если отсутствует соответствующее перенаправление пакетов. У вас также может как минимум еще один IP-адрес, используемый совместно с алиасом сетевого интерфейса, или еще один физический сетевой интерфейс. И на каждом IP-адресе или сетевом интерфейсе могут работать определенные сервисы. Например, на одном веб-сервер Apache, а на втором сервер службы доменных имен bind9. И когда вы разрешаете соединения на определенный порт без указания этого сетевого интерфейса, вы открываете доступ к этому порту на всех интерфейсах. Поэтому есть два способа сузить область действия разрешения.

Первый способ — указать IP-адрес, для которого будет разрешен доступ.

Iptables -t filter -A INPUT -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

Этот пример показывает, как можно использовать адрес назначения в правиле iptables. При этом также можно использовать адрес источника:

Iptables -t filter -A INPUT -s 123.123.123.123 -d 234.234.234.234 -p tcp -m tcp --dport 22 -j ACCEPT

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

Второй способ — указать имя сетевого интерфейса. Этот способ также применим, когда внешний адрес может измениться. В случае, если изменится адрес на сетевом интерфейсе, с предыдущим вариантом вы потеряете доступ к серверу. Указание имени интерфейса осуществляется следующим образом:

Iptables -t filter -A INPUT -i eth0 -s 123.123.123.123 -p tcp -m tcp --dport 22 -j ACCEPT

Такой вариант разрешает доступ по SSH на сетевом интерфейсе eth0, на остальных сетевых интерфейсах доступ по SSH будет отсутствовать.

Всё, что мы только что рассмотрели — это только самое начало, в следующей части будет продолжение…