Определение iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux версий 2.4, 2.6, 3.x, 4.x . Для использования утилиты iptables требуются привилегии суперпользователя (root).
Мы будем разбираться с iptables и без небольшого теоритического вступления не обойтись.
Что бы правильно составлять правила брандмауэра нужно понимать как вообще идут пакеты и что с ними происходит.
Порядок движения транзитных пакетов
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Сетевой интерфейс (например, eth0) | ||
2 | mangle | PREROUTING | Обычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр.. |
3 | nat | PREROUTING | Эта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. |
4 | Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет — локальному приложению или на другой узел сети. | ||
5 | mangle | FORWARD | Далее пакет попадает в цепочку FORWARD таблицы mangle. |
6 | Filter | FORWARD | В цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации. |
7 | mangle | POSTROUTING | Эта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации. |
9 | nat | POSTROUTING | Эта цепочка предназначена в первую очередь для Source Network Address Translation. Здесь же выполняется и маскарадинг (Masquerading). |
9 | Выходной сетевой интерфейс (например, eth1). |
Для локального приложения(входящие пакеты)
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
1 | Входной сетевой интерфейс (например, eth0) | ||
2 | mangle | PREROUTING | Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр. |
3 | nat | PREROUTING | Преобразование адресов (Destination Network Address Translation). |
4 | Принятие решения о маршрутизации. | ||
5 | mangle | INPUT | Пакет попадает в цепочку INPUT таблицы mangle. Здесь вносятся изменения в заголовок пакета перед тем как он будет передан локальному приложению. |
6 | filter | INPUT | Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили. |
7 | Локальный процесс/приложение (т.е., программа-сервер или программа-клиент) |
От локальных процессов(исходящие пакеты)
Шаг | Таблица | Цепочка | Примечание |
---|---|---|---|
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) |
Как мы поняли есть основные три таблицы :
- mangle — Данная таблица предназначена для операций по классификации и маркировке пакетов и соединений, а также модификации заголовков пакетов (поля TTL и TOS).
- filter — основная таблица для фильтрации пакетов, используется по умолчанию. Собственно в этой таблице и происходит фильтрация пакетов.
- nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора. Здесь задаются правила для маршрутизации.
Для таблицы nat применимы действия:
- DNAT
- SNAT
- MASQUERADE
Действие DNAT (Destination Network Address Translation) производит преобразование адресов назначения в заголовках пакетов. Другими словами, этим действием производится перенаправление пакетов на другие адреса, отличные от указанных в заголовках пакетов.
SNAT (Source Network Address Translation) используется для изменения исходных адресов пакетов. С помощью этого действия разделить единственный внешний IP адрес между компьютерами локальной сети для выхода в Интернет. В этом случае брандмауэр, с помощью SNAT, автоматически производит прямое и обратное преобразование адресов, тем самым давая возможность выполнять подключение к серверам в Интернете с компьютеров в локальной сети.
Маскировка (MASQUERADE) применяется в тех же целях, что и SNAT, но в отличие от последней, MASQUERADE дает более сильную нагрузку на систему. Происходит это потому, что каждый раз, когда требуется выполнение этого действия — производится запрос IP адреса для указанного в действии сетевого интерфейса, в то время как для SNAT IP адрес указывается непосредственно. Однако, благодаря такому отличию, MASQUERADE может работать в случаях с динамическим IP адресом, т.е. когда вы подключаетесь к Интернет, скажем через PPP, SLIP или DHCP.
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Выполнить MASQUERADE для всех пакетов идущих из сети 10.8.0.0 на интерфейс eth0. Для понятности , допустим у нас две сетевые карточки и две сети. Нам надо что бы сеть 10.8.0.0/24(первая сетевая карточка) могла выйти скажем в интернет через eth0(вторая сетевая карточка)
- raw — Предназначена для выполнения действий с пакетами до их обработки системой.
Собственно таблица по умолчанию filter.
Далее мы должны задать какой именно тип пакет будем фильтровать.
- INPUT — обрабатывает трафик, поступающий непосредственно самому хосту.
- FORWARD — позволяет фильтровать транзитный трафик.
- OUTPUT — позволяет фильтровать трафик, исходящий от самого хоста.
Действие с пакетом.
- ACCEPT — пропуск пакета. Пакет покидает текущую базовую цепочку и следует дальше.
- REJECT — заблокировать пакет и сообщить его источнику об отказе.
- DROP — заблокировать пакет, не сообщая источнику об отказе. Более предпочтительна при фильтрации трафика на интерфейсах, подключенных к интернету, так как понижает информативность сканирования портов хоста злоумышленниками.
- LOG — сделать запись о пакете в лог файл.
Получается у нас цепочка [таблица — filter] — [ трафик — INPUT ] — [действие — DROP] логика действий только кажется сложной. Думаю мы с вами на примерах разберемся и станет все просто.
Команд iptables:
- -A добавить правило в конец цепочки.
- -D удалить правило.
- -I вставить правило с нужным номером.
- -L вывести все правила в текущей цепочке.
- -S вывести все правила.
- -F очистить все правила.
- -N создать цепочку.
- -X удалить цепочку.
- -P установить действие по умолчанию.
Начнем разбираться на конкретных примерах.
iptables -A INPUT -p tcp —dport 80 -j ACCEPT
-A добавить новое правило , INPUT для входящих пакетов, -p протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp,
mh, — — dport порт назначения 80(опция только для протокола), -j выбрать действие, если правило подошло, ACCEPT разрешить. То есть разрешить входящий трафик по протоколу tcp на порт 80.
Перечисленные ключи также поддерживают конструкцию с использованием знака !. Он инвертирует условие, например:
iptables -A INPUT -s ! 192.168.0.50 -j DROP
-s адрес источника — имя хоста(www.help.com), IP-адрес или подсеть в нотации CIDR(192.168.0.1/16) , ! инверсия , DROP запретить. Запретить весь входящий трафик , кроме источника 192.168.0.50 ( если бы не было ! , то запретить только с 192.168.0.50)
iptables -A INPUT -s 192.168.0.50 -j DROP
Запретить входящий трафик с ip — 192.168.0.50.
Список критериев правил:
- -p Протокол, протокол также можно указать с помощью номера или названия согласно перечислению, приведенному в /etc/protocols. Значение «любой протокол» можно указать с помощью слова all или числа 0. Так же для протокола есть дополнительные параметры: —sport(—source-port) Позволяет указать исходящий порт (или их диапазон). —dport(—destination-port) Позволяет указать порт назначения (или их диапазон).
- -s Определяет адрес отправителя. В качестве адреса может выступать IP-адрес (возможно с маской), доменное имя (в последних двух случаях перед добавлением правила в цепочку имя резольвится в IP-адрес).
- -i Определяет входящий сетевой интерфейс. Если указанное имя интерфейса заканчивается знаком «+» (например, eth+), то критерию соответствуют все интерфейсы, чьи названия начинаются на указанное имя(etho,eth1).
- -d Определяет адрес получателя. Синтаксис аналогичен -s.
- -o Определяет исходящий сетевой интерфейс. Синтаксис аналогичен -i.
Так же критерия можно комбинировать.
iptables -A INPUT -i eth0 -s 192.168.0.0 -j DROP
Запретить входящие пакеты с интерфейса eth0 и ip 192.168.0.0. А на интерфейс eth1 пакеты пройдут.
А что делать если вы за ранние не знаете какой порт открывать, например хотите что бы FTP сервер работал в пассивном режиме. Модуль conntrack о состоянии соединения поможет, а конкретней критерий — ctstate. Модуль подключается тэгом -m.
iptables -A INPUT -m conntrack —ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack —ctstate NEW -p tcp —dport 21 -j ACCEPT # Разрешаем открывать соединения на 21 TCP-порт.
Возможные состояния:
-
- NEW — соединение не открыто, то есть пакет является первым в соединении.
-
- ESTABLISHED — пакет относится к уже установленному соединению. Обычно такие пакеты принимаются без дополнительной фильтрации, как и в случае с RELATED.
-
- RELATED — пакет открывает новое соединение, логически связанное с уже установленными, например, открытие канала данных в пассивном режиме FTP. Соединение получает статус RELATED если оно связано с другим соединением, имеющим признак ESTABLISHED.
- INVALID — Признак INVALID говорит о том, что пакет не может быть идентифицирован и поэтому не может иметь определенного статуса.
iptables -A INPUT -m state —state ESTABLISHED,RELATED -j ACCEPT
State идеологический предшественник conntrack, имеет единственный параметр --state, аналогичный параметру --ctstate модуля conntrack (но, в отличие от него, не поддерживающий состояния DNAT и SNAT).
Кратко рассмотрим таблицу таксировщика, которую можно найти в файле /proc/net/ip_conntrack. Здесь содержится список всех активных соединений.
tcp 6 300 ESTABLISHED src=128.*.*.* dst=194.*.*.* sport=52524 dport=2223 src=194.*.*.* dst=128.*.*.* sport=2223 dport=52524 [ASSURED] mark=0 use=2
Первое как понятно это протокол, потом десятичное число(что значит не знаю),потом идет время жизни соединения. Далее состояние ESTABLISHED то есть соединение уже установлено, бывает еще UNREPLIED что значит что ответного трафика еще не было. Далее расположены адреса отправителя и получателя, порт отправителя и получателя. Далее все наоборот соответственно, ASSURED этот флаг сообщает о том, что соединение установлено уверенно и эта запись не будет стерта по достижении максимально возможного количества трассируемых соединений.
Некоторые особенности протоколов .
TCP соединение всегда устанавливается передачей трех пакетов, которые инициализируют и устанавливают соединение, через которое в дальнейшем будут передаваться данные. Сессия начинается с передачи SYN пакета, в ответ на который передается SYN/ACK пакет и подтверждает установление соединения пакет ACK.
Как только трассировщик увидел первый (SYN) пакет, то присваивает ему статус NEW. Как только через трассировщика проходит второй пакет (SYN/ACK), то соединению присваивается статус ESTABLISHED.
С протоколом UDP немного все по другому этот протокол не предусматривает установления и закрытия соединения, но самый большой недостаток — отсутствие информации об очередности поступления пакетов. Но с точки зрения трасировщика все так же как с TCP. Первому пришедшему пакету присваивает ему статус NEW. Как только вы отправляете ответный пакет присваивается статус ESTABLISHED. Единственное отличия что статут ASSURED присваиваться только когда обменялись уже несколькими пакетами.
Логирование применений правил.
iptables дает возможность вести логи отдельных пакетов и событий. Для этого применяется действие LOG.
iptables -A INPUT -p tcp —syn -j LOG —log-level info —log-prefix «INPUT packets «
—log-level Используется для задания уровня журналирования (log level). Полный список уровней вы найдете в руководстве (man) по syslog.conf. Обычно, можно задать следующие уровни: debug, info, notice, warning, warn, err, error, crit, alert, emerg и panic. Логи пишутся в файл syslog.
—log-prefix Ключ задает текст (префикс), которым будут предварять все сообщения iptables. Сообщения со специфичным префиксом затем легко можно найти, к примеру, с помощью grep. Префикс может содержать до 29 символов, включая и пробелы.
Jun 1 17:12:20 debian kernel: [605663.391139] INPUT packets IN=eth0 OUT= MAC=02:1e:6d:00:e2:1c:00:01:e8:11:73:69:08:00 SRC=125.94.12.95 DST=194.87.239.104 LEN=40 TOS=0x00 PREC=0x00 TTL=52 ID=38690 PROTO=TCP SPT=12557 DPT=23 WINDOW=1460$ RES=0x00 SYN URGP=0
Популярные команды управления iptables.
iptables -L -n —line-numbers Посмотреть список правил.
-n номер портов и ip в цифровом варианте.
—line-numbers номер строки.
iptables -F Полностью сбросить правила.
iptables -P INPUT ACCEPT Правила по умолчанию для таблицы INPUT .
iptables -P OUTPUT ACCEPT Правила по умолчанию для таблицы OUTPUT.
iptables -P FORWARD DROP Правила по умолчанию для таблицы FORWARD.
iptables -D INPUT 1 Удаление правила по его номеру в цепочке.
iptables -D INPUT -s 123.45.67.89 -j DROP Удаление правила на основе того, что оно делает.
iptables -I INPUT … Вставка (insert) правила в начало цепочки.
iptables -I INPUT 3 … Или можно указать конкретную позицию.
REDIRECT
Действие REDIRECT предназначено для перенаправления пакетов с одного набора портов на другой внутри одной системы, не выходя за пределы хоста.
Работает REDIRECT только в цепочках PREROUTING и OUTPUT таблицы nat. Таким образом, область применения сводится только к перенаправлению . Чаще всего это используется для прозрачного прокси, когда клиент из локальной сети коннектится на 80 порт, а шлюз редиректит пакеты на локальный порт прокси:
iptables -t nat -A PREROUTING -p tcp —dport 80 -j REDIRECT —to-port 3128
Новые правила автоматически не сохраняются и после перезагрузки сервера не будут действовать. Поэтому после изменения iptables нам нужно сохранить изменения.
iptables-save > /etc/iptables Сохранить текущий настройки в файл iptables.
iptables—restore > /etc/iptables Загрузить правила из файла.
Способ сохранять и загружать правила на ваше усмотрение. Мы с вами познакомились только с основами теории iptables, возможности настройки конечно гораздо больше. Более подробно о которых расскажем в другой статье.