Содержание
- Общие сведение о подсистеме netfilter
- Управление правилами iptables
- Взаимодействие правил и цепочек iptables
Общие сведение о подсистеме netfilter
Подсистема netfilter представляет собой средство пакетной фильтрации в ядре Linux (начиная с версии 2.4)
[
46
]
. Утилита iptables используется для управления netfilter.
Примечание: Netfilter/iptables кроме создание межсетевых экранов на основе
пакетной фильтрации (в том числе и с учетом состояния
соединения), также позволяет реализовать различные сложные схемы манипуляции
сетевыми пакетами, в частности трансляцию сетевых адресов (
NAT) для
разделяемого доступа в Интернет и организации прозрачных прокси (см.
"Обеспечение доступа в сеть Интернет"
).
Сетевые пакеты в подсистеме netfilter проходят последовательность цепочек (chain). Каждая
цепочка включает заданный набор таблиц (table), содержащих упорядоченные списки правил. Каждое правило содержит параметры выбора и выполняемое действие при соответствии содержимого пакета параметрам.
Существует пять типов стандартных цепочек, встроенных в систему
[
47
]
:
-
PREROUTING — для изначальной обработки входящих пакетов
-
INPUT — для входящих пакетов, адресованных непосредственно локальному компьютеру
-
FORWARD — для проходящих (маршрутизируемых) пакетов
-
OUTPUT — для пакетов, создаваемых локальным компьютером
-
POSTROUTING — для окончательной обработки исходящих пакетов
Цепочки организованы в четыре таблицы рис. 11.1
[
47
]
:
-
raw — просматривается до передачи пакета системе определения состояний. Содержится в цепочках PREROUTING и OUTPUT.
-
mangle — содержит правила модификации заголовка IP?пакетов. Среди прочего, поддерживает изменения полей TTL и TOS, и
маркеров пакета. Содержится во всех стандартных цепочках.
-
nat — используется для трансляции сетевых адресов. Содержится в цепочках PREROUTING, OUTPUT, и POSTROUTING.
-
filter — основная таблица, предназначенная для фильтрации сетевых пакетов; используется по умолчанию если название таблицы не
указано. Содержится в цепочках INPUT, FORWARD, и OUTPUT.
Рис.
11.1.
Прохождение пакета в подсистеме netfilter (взято из wikipedia.org)
Следует отметить, что одноименные таблицы каждой цепочки независимы.
Входящий пакет (рис 11.1) начинает обрабатываться с цепочки PREROUTING в таблицах raw,
conntrack (определение состояний) и mangle. Затем он обрабатывается правилами таблицы nat данной цепочки. На этом
этапе проверяется, необходима ли модификация адреса получателя пакета ( DNAT ). Важно сменить адрес получателя на данном этапе, так как
маршрут пакета определяется сразу после того, как он покинет цепочку PREROUTING.
Далее возможны два варианта:
- Если целью пакета является этот компьютер, то пакет будет отправлен в цепочку INPUT ; после маршрутизации, он обрабатывается правилами
цепочек INPUT. В случае прохождения цепочек пакет передается приложению.
- Если целью пакета является другой компьютер, то пакет фильтруется правилами цепочки FORWARD таблиц mangle и filter, а
затем к нему применяются правила цепочки POSTROUTING. На данном этапе можно использовать SNAT/MASQUERADE (подмена
источника/маскировка). После этих действий пакет будет отправлен в сеть.
Третий вариант - когда приложение на компьютере, отвечает на запрос или отправляет собственный пакет, то он обрабатывается
цепочкой OUTPUT таблиц raw, conntrack и filter. Затем к нему применяются правила цепочки OUTPUT таблицы nat, для определения, требуется ли использовать DNAT (модификация адреса получателя), пакет фильтруется цепочкой OUTPUT таблицы filter и выпускается в цепочку POSTROUTING. В случае успешного прохождения POSTROUTING пакет
выходит в сеть.
Непосредственно для фильтрации используются таблицы filter. Поэтому в рамках данной темы важно понимать, что для
фильтрации пакетов, предназначенных данному узлу необходимо модифицировать таблицу filter цепочки INPUT, для проходящих пакетов — цепочки FORWARD, для пакетов, созданных данным узлом
— OUTPUT.
Управление правилами iptables
Команда iptables позволяет редактировать правила таблиц netfilter. Каждое правило представляет собой запись, содержащую
в себе параметры отбора (критерии), определяющие, подпадает ли пакет под данное правило, и действие, которое необходимо выполнить в случае
соответствия параметрам отбора
[
48
]
.
В общем виде правила записываются в виде:
iptables [-t table] command [match] [target/jump]
По умолчанию используется таблица filter, если же необходимо указать другую таблицу, то
следует использовать спецификатор -t с указанием имени таблицы. После имени таблицы указывается команда,
определяющая действие: вставить правило, или добавить правило в конец цепочки, или удалить правило и т. п. Match задает параметры
отбора. Target указывает, какое действие должно быть выполнено при условии выполнения критериев в правиле: передать пакет в другую
цепочку правил, "сбросить" пакет, выдать на источник сообщение об ошибке и т. п.
Примечание: для работы с
iptables требуются права
суперпользователя.
Для просмотра существующих правил, команда iptables используется с ключом -L. Так, для просмотра всех цепочек таблицы filter ( -v — для более детального отображения):
Примечание: Далее по тексту данной темы, если не названа таблица, то имеется в виду таблица filter.
Для просмотра цепочки FORWARD нужно указать имя цепочки:
Сбросить все правила (-F) и удалить определенные пользователем цепочки (-X):
# iptables -F
# iptables -X
Для добавления правила в цепочку используется ключ -A. Например, чтобы добавить правило в цепочку POSTROUTING таблицы nat:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Для того, чтобы добавить правило в цепочку FORWARD:
# iptables -A FORWARD -i eth0 --destination 192.168.1.0/24 -j ACCEPT
Ниже в виде таблицы приведены основные параметры отбора пакетов
[
48
]
:
Таблица
1.1.
Параметр |
Описание |
Пример |
--protocol (сокращено -p ) |
Определяет протокол. Опции tcp, udp, icmp, или любой другой
протокол определенный в /etc/protocols
|
iptables -A INPUT -p tcp |
--source (-s) |
IP адрес источника пакета. Может быть определен несколькими путями.
- Одиночный хост: host.domain.tld, или IP адрес: 10.10.10.3
- Пул-адресов (подсеть): 10.10.10.3/24 или 10.10.10.3/255.255.255.0
|
iptables -A INPUT -s 10.10.10.3 |
--destination (-d) |
IP адрес назначения пакета. Может быть определен несколькими путями - смотри — source
|
iptables -A INPUT --destination 192.168.1.0/24 |
--source-port (--sport) |
Порт источник, возможно только для протоколов — protocol tcp, или — protocol udp
|
iptables -A INPUT --protocol tcp --source-port 25 |
--destination-port (--dport) |
Порт назначения, возможно только для протоколов — protocol tcp, или — protocol udp
|
iptables -A INPUT --protocol udp --destination-port 67 |
--state |
Состояние соединения. Доступно, если модуль 'state' загружен с помощью '-m state'.
Доступные опции:
NEW (Все пакеты устанавливающие новое соединение)
ESTABLISHED (Все пакеты, принадлежащие установленному соединению)
RELATED (Пакеты, не принадлежащие установленному соединению, но связанные с ним. Например - FTP в активном режиме использует разные
соединения для передачи данных. Эти соединения связаны.)
INVALID (Пакеты, которые не могут быть по тем или иным причинам идентифицированы. Например, ICMP ошибки не
принадлежащие существующим соединениям)
|
iptables -A INPUT -m state --state NEW,ESTABLISHED |
--in-interface (сокращенно -i ) |
Определяет интерфейс, на который прибыл пакет. Полезно для NAT и машин с
несколькими сетевыми интерфейсами |
iptables -t nat -A PREROUTING --in-interface eth0 |
--out-interface (сокращенно -o ) |
Определяет интерфейс, с которого уйдет пакет. Полезно для NAT и машин с
несколькими сетевыми интерфейсами |
iptables -t nat -A POSTROUTING --out-interface eth1 |
--tcp-flags |
Определяет TCP флаги пакета. Содержит 2 параметра: Список флагов которые следует проверить и список флагов
которые должны быть установлены |
|
--syn |
Сокращение для ‘--tcp-flags SYN,RST,ACK SYN’. Поскольку проверяет TCP флаги, используется с — protocol tcp. В примере показан фильтр для пакетов с флагом NEW, но без флага SYN. Обычно такие пакеты должны
быть выброшены ( DROP ). |
iptables -A INPUT --protocol tcp ! --syn -m state --state NEW |
Действие, которое система выполнит, если пакет в одной из цепочек удовлетворяет условию, устанавливается с помощью ключа -j (--jump).
Можно также передать пакет в другую цепочку.
Стандартные действия:
-
-ACCEPT - пакет покидает данную цепочку и передается в следующую.
-
-DROP - отбросить удовлетворяющий условию пакет.
-
-REJECT - отбросить пакет, отправив отправителю ICMP-сообщение.
-
-LOG - протоколировать пакет.
-
-RETURN - возвратить пакет в предыдущую цепочку.
-
-SNAT - применить трансляцию адреса источника в пакете. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы nat.
-
-DNAT - применить трансляцию адреса назначения в пакете. Может использоваться только в цепочке POSTROUTING таблицы nat.
-
-MASQUERADE — используется вместо SNAT при наличии соединения с динамическим IP.
-
-MARK — используется для установки меток на пакеты.
# iptables -A input -p tcp -s 192.168.0.0/16 --dport 80 -j ACCEPT
Листинг
11.1.
Правило, разрешающее подключения к локальному HTTP-серверу из заданной подсети
# iptables -A FORWARD -s 192.168.1.0/24 -d 192.168.9.9 -j DROP
Листинг
11.2.
Правило, запрещающее проходящий трафика от сети 192.168.1.0/24 к узлу 192.168.9.9