HOWTO Основы работы с iptables

1078

Сегодня я на время вернусь к истокам моего проекта. Ведь первоначально, когда это был не столько блог, сколько стационарный сайт «чисто на HTML» главная его цель была собирать статьи, книги, HOWTO и даже страницы manpages. Со временем от чисто архивного, пакет перешел к боле новостному. Но я не забыл о необходимости накапливать информацию.

Поэтому не смог пройти мимо прекрасного HOWTO написано уважаемым Ite — «Основы работы с iptables». Я думаю, что это руководство будет очень полезно как системным администраторам, так и просто продвинутым пользователям, не боящимся командной строки. Согласитесь, что покупка квартиры без посредников всегда выгоднее, как впрочем и аренда жилья. То же самое касается самостоятельного выполнения основных системных задач. А это требует определенных знаний. Вот поэтому предлагаю почитать спрятанное под катом руководство. Жмите на Далее…

Основы работы с iptables.

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

Введение.
Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI, iptables начинает обработку пакетов с 3-го(сетевого) уровня, после того как пакет по кабелю попал на сетевую карту, он передается в ядро ОС, а именно в netfilter, далее пакет проходит ряд таблиц и только после этого попадает в приложение(или не попадает, если пакет шел транзитом), которому он был адресован. Именно таблицами и правилами netfilter`а управляет утилита iptables.

Таблицы и цепочки.
В iptables существуют 3 таблицы:

filter — Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки
INPUT — сюда попадает все входящие пакеты
FORWARD — сюда попадают пакеты предназначенные другой машине в сети
OUTPUT — все исходящие пакеты
Над пакетамми проходящими в таблице filter можно делать следующие действия:
DROP — блокировать пакет
ACCEPT — разрешить(пропустить далее) пакет.
Это цепочка используется по умолчанию.

nat — Используется для трансляции сетевых адресов(NAT)
PREROUTING — используется для DNAT(трансляция адреса назначения)
POSTROUTING — тут происходит SNAT(Source Address Translation)
OUTPUT — Все исходящие из этой цепочки пакеты
Действия, используемые в этой цепочке:
DNAT — как уже упоминалось, используется для трансляции адреса назначения, использую это действие, мы можем пробросить порт, либо целую машину в другую сеть.
SNAT — изменяет исходные адреса пакетов, используется для того, чтобы машины в локальной сети имели доступ в интернет(в случае если наш компьютер — роутер)
MASQUERADE — по сути тоже самое, что и SNAT, только считается что больше нагружает систему. Если у вас выделенный ip — динамический, то нужно использовать именно его, если не хотите каждый раз переписывать правила SNAT.

mangle — Таблица для изменения заголовков пакетов. Имеет цепочки: PREROUTING, FORWARD, OUTPUT, POSTROUTING. У всех цепочек роль одна — вносить изменения в заголовок пакета на различных стадиях движения этого пакета через цепочки iptables. Над этими пакетами можно проводить действия TOS, TTL, MARK.

С точки зрения iptables трафик бывает 3х типов:
Входящий
Транзитный
Исходящий
Движение пакета происходит в следующем последствии:

После прохождения nat(PREROUTING), основываясь на записях в mangle(PREROUTING) и nat(PREROUTING), ядро принимает решение какой будет трафик, входящим или транзитным. Если трафик оказался транзитным, то идем в цепочку mangle(FORWARD),
если входящим, то в mangle(INPUT).
1. Входящий трафик — данные, которые принимает приложение запущенное на компьютере
2. Исходящий трафик — трафик, который передает приложение через сеть
3. Транзитный трафик — трафик, который проходит через наш компьютер другим(в случае если наш компьютер работает как маршрутизатор)

Работа с iptables.
Теперь после того, как мы имеем представление как течет через нас трафик, мы можем что-нибудь с ним сделать.

Основные ключи iptables:
-t (-table) — правило указывает таблицу, в которую будут вноситься изменения, без указания этого ключа используется таблица filter
-A (-append) — добавление новой записи в конец цепочки
-D (-delete) — удаление правила
-I (-insert) — вставляет правило над цепочкой с указаным номером
-R (-replace) — заменяет определенные критерии цепочки с номером
-L (-list) — листинг правил цепочки
-F (-flush) — удаление всех правил из цепочки
-P (-policy) — задать действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.

Ключи классификации и выделения пакетов
-p (-protocol) — используется для указания конкретного протокола для обработки, список всех протоколов можно посмотреть в /etc/protocols/
-s(-src, -source) — адрес исходящих пакетов для фильтрации.
-d (-dst, -destination) — адрес назначения пакетов для фильтрации.
-i (-in-interface) — интерфейс с которого приходит пакет
-o (-out-interface) — интерфейс на который уходит пакет
-sport (-source-port) (может использоваться с ключами -p tcp и -p udp) — порт с которого был отправлен пакет
-dport (-destination-port) (может использоваться с ключами -p tcp и -p udp) — порт на который отправляется пакет
Так же есть ключ, который укаывается, когда мы аботаем с протоколом icmp (-p icmp):
-icmp-type — указывается над каким конкретно типом ICMP пакета проводить операцию. Типы ICMP описаны в RFC 792.
На всех ключах классфикации возможно применения специального символа !, который буквально означает “кроме”, например:
правило

iptables -A -p tcp -s 192.168.1.7/32 —dport 80 -j DROP

указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 на 80 TCP порт(обычно веб-сервер) необходимо блокировать. А правило:

iptables -A -p tcp -s 192.168.1.7/32 —dport !80 -j DROP

указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 кроме 80 TCP порта необходимо блокировать.

Строим свои правила iptables.

С теорией покончено, переходим к практике. Попробуем настроить фаерволл(цепочка filter) Первым делом, когда вы настраиваете фаервол с нуля, необходимо убедиться, что все правила пусты, сделать это можно командой:
iptables -L
Если картина примерно следующая, то можно приступать к написанию своих правил фильтрации:

1
2
3
4
5
6
7
8
9
10
11
debian:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
debian:~#

Если в какой-то из цепочек присутствуют правило, удалим их по одной или воспользуемся ключом -F и очистим цепочку полностью
пример:

iptables -F INPUT

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

Какой действие(ACCEPT или DROP) должно выполнятся над этими пакетами решать вам, однако хочу предостеречь, если вы настраиваете фаерволл удаленно по ssh, то прежде чем поставить политику DROP на цепочку INPUT, напишите правило, разрешающие соединения к 22 порту TCP:

iptables -A INPUT -p tcp —dport 22 -j ACCEPT

После чего можно смело применять политику DROP на цепочку INPUT:

iptables -P INPUT DROP

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

1
2
3
4
5
debian:~# iptables -L INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  —  anywhere             anywhere            tcp dpt:ssh
debian:~#

Допустим мы имеем сеть 192.168.1.0/24, внений ip-адрес: 65.25.2.83. Прчием локальная сеть подлючена к интерфейсу eth0, а интернет к eth1.
Теперь поставим задачу нашему фаерволлу: Максимальная безопасность(политику DROP мы уже поставили), доступ к Веб-серверу могут иметь только IP-адрес 192.168.1.170, доступ к IMAP могут иметь все, однако доступ к smtp-серверу разрешить только локальным пользователям(сеть 192.168.1.0/24).
Незабываем, что цепочка INPUT равно обрабатывает все интерфейсы, если конкретный не указан в параметре -i.
Для доступа к веб-серверу напишем следующие правило:

iptables -A INPUT -p tcp —dport 80 -s 192.168.1.170 -j ACCEPT

Сервер IMAP работает на 143 TCP-порту, следовательно правило будет выглядеть следующим образом:

iptables -A INPUT -p tcp —dport 143 -j ACCEPT

Правило для обработки SMTP входящх пакетов выглядит так:

iptables -A INPUT -p tcp —dport 25 -s 192.168.1.0/32 -j ACCEPT

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

iptables -R INPUT 1 -p tcp —dport 22 -s 34.1.63.169 -j ACCEPT

где 34.1.63.169 — ip-адрес, с которого мы собираемся заходить на сервер по SSH

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

1
2
3
4
5
6
7
8
9
debian:~# iptables -t filter -L INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  —  34.1.63.169        anywhere            tcp dpt:ssh
ACCEPT     tcp  —  192.168.1.170        anywhere            tcp dpt:www
ACCEPT     tcp  —  anywhere             anywhere            tcp dpt:imap2
ACCEPT     tcp  —  192.168.1.0          anywhere            tcp dpt:smtp
debian:~#

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

Поставим следующую задачу: нам необходимо организовать доступ в интернет из локальной сети по портам 80 и 110 и компьютеру с ip-адресом 192.168.1.2 по всем портам.

Первым делом установим политику по умолчанию для цепочки FORWARD в DROP:

iptables -P FORWARD DROP

Затем нам необходимо, чтобы пакеты проходящие через цепочку FORWARD таблицы filter фильтровались таким, чтобы все пользователи сети 192.168.1.0/24 имели доступ к 80 и 110 портам tcp:

iptables -A FORWARD -s 192.168.1.0/24 -p tcp -m multiport -dports 80,110 -i eth0 -j ACCEPT

здесь -m multiport -dports указывает, что мы будем перечислять порты через запятую, а -i eth0 что трафик будет идти из интерфейса локальной сети.
Следующее правило разрешает хождение в обратную сторону, когда клиенты локальной сети будут получать данные из интернета:

iptables -A FORWARD -d 192.168.1.0/24 -p tcp -m multiport —sports 80,110 -i eth1 -j ACCEPT

Теперь правила для хоста 192.168.1.2:

1
2
iptables -A FORWARD -s 192.168.1.2 -i eth0 -j ACCEPT
iptables -A FORWARD -d 192.168.1.2 -o eth1 -j ACCEP

T

И теперь добавляем самое волшебное правило, правило маскарада в цепочку POSTROUTING таблицы nat:
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Под конец опубликую получившиеся таблицы filter и nat:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
debian:~# iptables -t filter -L
Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  —  34.1.63.169          anywhere            tcp dpt:ssh
ACCEPT     tcp  —  192.168.1.170        anywhere            tcp dpt:www
ACCEPT     tcp  —  anywhere             anywhere            tcp dpt:imap2
ACCEPT     tcp  —  192.168.1.0          anywhere            tcp dpt:smtp

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  —  192.168.1.0/24       anywhere            multiport dports www,pop3
ACCEPT     tcp  —  anywhere             192.168.1.0/24      multiport sports www,pop3
ACCEPT     all  —  192.168.1.2          anywhere
ACCEPT     all  —  anywhere             192.168.1.2

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
debian:~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  —  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
debian:~#

.end
Теперь пользователи довольствуются интернетом, а мы заслуженной банкой пива :)
В статье конечно описаны далеко не все возможности программы iptables, пожалуй только самые “популярные”, в статье не описано как работать с состояниями пакета(NEW, RELATED, ESTABLISHED), не описана работы с таблицей mangle да и еще много всего, я оставляю изучение этого на вас, в добавок кину пару ссылок:

1. http://www.opennet.ru/docs/RUS/iptables/#NATTABLE — очень полезный ресурс, описания полной работы iptables
2. http://iptables.ru/ — пошаговое руководство для ленивых
3. http://posix.ru/network/iptables/ — тоже неплохое руководство

PS. Возмоно просить об этом глупо, но господа, которые копируют статьи на другие сайты, если не хотите указывать источник, указывайте хотябы автора статей.
ite, [email protected]