Видео ролики бесплатно онлайн

Смотреть японки видео

Официальный сайт avto4avto 24/7/365

Смотреть видео бесплатно

24.09.10 19:45 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(Изменение Сетевого Адреса Отправителя)
OUTPUT - Все исходящие из этой цепочки пакеты
Действия, используемые в этой цепочке:
DNAT - как уже упоминалось, используется для трансляции адреса назначения, использую это действие, мы можем пробросить порт, либо целую машину в другую сеть.
SNAT - изменяет исходные адреса пакетов, используется для того, чтобы машины в локальной сети имели доступ в интернет(в случае если наш компьютер - роутер)
MASQUERADE - по сути тоже самое, что и SNAT, только считается что больше нагружает систему. Если у вас выделенный ip - динамический, то нужно использовать именно его, если не хотите каждый раз переписывать правила SNAT.

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

С точки зрения iptables трафик бывает 3х типов:
Входящий
Транзитный
Исходящий
Движение пакета происходит в следующей последовательности:
=iptables
После прохождения 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 пакета проводить операцию. Типы 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 ACCEPT
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/ - очень полезный ресурс, описания полной работы iptables
2. http://iptables.ru/ - пошаговое руководство для ленивых
3. http://posix.ru/network/iptables/ - тоже неплохое руководство

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


Теги:

Username 24.09.10 20:06 # +6
Спасибо
le087 24.09.10 20:18 # +2
я присоединяюсь
m0nhawk 24.09.10 20:55 # +1
Я присоединяюсь к присоединению!
Denis 24.09.10 22:38 # +0
Присоединяюсь к присоединению к присоединению! :P

Замечательная статья, идет на панель закладок.
Zend 24.09.10 22:48 # +0
Получилась цепочка :-)
FalleN 25.09.10 01:49 # +1
C-C-C-C-C-COMBO B-B-BREAKER!!
le087 24.09.10 20:06 # +0
... на меня нашло просвещение! Хороший пост.
s2h 24.09.10 20:16 # +0
хмм прочитал первые несколько абзацев даже все понял... надо добавить в закладки
exelens 24.09.10 20:21 # +0
Побольше бы таких постов и авторов.
xT 24.09.10 20:24 # +1
А мне больше нравится такая картинка, хотя тоже самое абсолютно:
ite 24.09.10 20:27 # +1
Картинка немного не верна, после прохождения filter(OUTPUT) и filter(FORWARD) не происходит выбора решения о маршрутизации. А моим прототипом была эта :) : http://www.opennet.ru/docs/RUS/iptables/misc/iptables-tutorial/images/tables_traverse.jpg
Alex2ndr 27.09.10 11:53 # +0
Обратите внимание на то, что ваша картинка тоже не верна( в отличии от прототипа :) ). У Вас нету Решения о маршрутизации после Локальных процессов. Исправьте пожалуйста.
greynix 24.09.10 21:11 # +1
Хорошая статья, большое спасибо, добавлю некоторые моменты:
1.
iptables начинает обработку пакетов с 3-го(сетевого) уровня
, но кроме того iptables может работать и фильтровать данные по заголовкам на канальном уровне (т.е. банально по MAC адресу)
2. если мы делаем политику DROP по умолчанию на все цепочки, то необходимо учитывать что тот же ssh, кроме того что он принимает пакеты и они приходят в цепочку INPUT нашего iptables, отвечает же он через цепочку OUTPUT. И если у нас закрыто OUTPUT (DROP), то даже правило iptables -A INPUT -p tcp --dport 22 -j ACCEPT нас не спасет и ssh работать не будет. В этом случае (если вы как я - параноик) в цепочку OUTPUT необходимо добавить как минимум правило iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT (в этом случае сервер будет отвечать на уже установленные соединения , но не сможет сам создавать новые подключения)
P.S.Сам просто очень часто на это натыкался, может кому нибудь поможет.
ite 25.09.10 02:00 # +1
да, вы правы :)
Slip 24.09.10 23:52 # +0
Спасибо. Реквестую больше примеров, особенно для домашнего применения.
ite 25.09.10 01:59 # +3
На самом деле примеров я хотел добавлять наоборот по-меньше, чтобы народ понял как и научился сам соствлять правила, примеров можно найти сотни во все интернете

%username% love BDSM!

xT 25.09.10 02:14 # +0
и? в конце поста есть эта ссылка

%username% love BDSM!

main 25.09.10 18:30 # +1
Плюсую даже не прочитав!

P.S> потом прочитаю :)
n7y 25.09.10 20:07 # +0
Много спасибо за мануал!

На всякий случай, помещу тут пример простого файерволла: http://slackwiki.org/Simple_firewall- авось кому пригодиться (хотя бы в качестве примера)
stasikos 29.09.10 08:56 # +0
Имхо юзать echo 1 > /proc/net/something не тру
вместо этого лучше использовать sysctl
Hellion 26.09.10 14:30 # +0
Спасибо за статью, ползительно :)
Alex2ndr 27.09.10 14:01 # +0
Я надеюсь конструктивная критика принимается :)
Может показаться, что все что я напишу - придирки к словам. Но это не так. Определения должны быть четко указаны, иначе они могут ввести в заблуждение.


Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI

Это не верно. Транзитные пакеты не поднимаются выше 3-го уровня по OSI. К тому же откуда эта 5-ка? У официальной модели OSI 7 уровней. У неофициальной модели TCP/IP - 4 уровня.

iptables начинает обработку пакетов с 3-го(сетевого) уровня,

Во-первых вы ниже пишите что пакет обрабатывает ядро(точнее его модуль - netfilter) а тут почему-то iptbales. Во-вторых, как уже сказали выше - обработка начинается с ethernet фрэйма ( т е со второго уровня).

filter - Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки

Имеет 3 стандартные цепочки. Ведь можно же свои наделать в большом кол-ве.

Это цепочка используется по умолчанию.

Во-первых - не цепочка, а таблица. Во-вторых лучше сказать так: При операциях с правилами, если таблица не указана явно, будет происходить работа в таблице filter. Ну или в таком смысле. Прошу прощения - формулировать мысли умею плохо.

mangle - Таблица для изменения заголовков пакетов.

По большому счету nat это тоже изменение адреса назначения/отправления в заголовке пакета. Поэтому здесь лучше воспользоваться определением из man iptables - mangle: This table is used for specialized packet alteration.(Эта таблица используется для специализированных изменений пакетов).


Нигде не сказано что же такое за -j. Только в примерах оно сразу начинает использоваться. Возможно стоит указать какой-нить общий порядок создания правил:
1
2
3
4
5
iptables [-t <b>таблица</b>] {-A|-D} <b>цепочка</b> <b>спецификация_правил</b>
где
<b>спецификация_правил</b> = [<b>условие</b>...] [<b>цель</b>]
<b>условие</b> = -m <b>имя_условия</b> [<b>опции_условия</b>]
<b>цель</b> = -j <b>имя_цели</b> [<b>опции_цели</b>]

Взял опять же из man iptables

Кроме этого т к это статья для новичков, то возможно в конце стоит дать грамотный каркас скрипта, для добавления правил. Если вам это интересно - напишите здесь. У меня есть кое-какие наброски - готов поделится.
Alex2ndr 27.09.10 14:04 # +0
Прошу прощения. Не воспользовался предпросмотром, в результате получилось как-то плоховато оформлено. Я новичок в данном оформлении и не знаю как изменить комментарий.
kstep 28.09.10 12:57 # +0
Править комменты может только кровавая администрация.
ite 29.09.10 01:24 # +0
Контруктивная критикаконечо принимается, но первое: прежде чем критиковать прочитайте внимательно статью, это относится к вашему 2-у замечанию:
выше сказано:
Именно таблицами и правилами netfilter`а управляет утилита iptables.
Да, безусловно эти два понятия различаются, но к чему разводить эту разницу понятий, тем более что практически во всех руководствах указывается именно iptables. По поводу второго уровня: iptables начинает обработку именно с 3-го уровня, вся фильтрация по мак-адресам основывается на арп-таблицах, и к канальному имеет косвенное отношение, скажем, если бы нам необходимо было обрабатывать pppoe-соединение(который работает на канальном уровне), то iptables нам бы не помог, пришлось бы использовать что-то вроде ebtables
Далее:
Замечание номер 1:
На счет транзитных пакетов согласен. И модель стека протоколов TCP/IP уровневая: Физический, канальный, сетевой, транспортный, прикладной. Какой вы из них выкинете?

3: К чему это в статье "ОСНОВЫ работы с iptables"? Кому надо будет - дойдет до этого сам, кому нет, хватит и стандартных.

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

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

Спасибо за критику.
Alex2ndr 29.09.10 10:54 # +0
По поводу второго уровня: iptables начинает обработку именно с 3-го уровня, вся фильтрация по мак-адресам основывается на арп-таблицах, и к канальному имеет косвенное отношение, скажем, если бы нам необходимо было обрабатывать pppoe-соединение(который работает на канальном уровне), то iptables нам бы не помог, пришлось бы использовать что-то вроде ebtables

Да - вы правы. Я забыл что за 2-й уровень отвечают иные утилиты. Помню что в ядро и та и другая информация попадает, а то что она обрабатывается другой утилитой - забыл :(


И модель стека протоколов TCP/IP уровневая: Физический, канальный, сетевой, транспортный, прикладной. Какой вы из них выкинете?

Снова я ошибся. Я исходил из книги У. Ричард Стивенс "TCP/IP крупным планом". там рассматривается TCP/IP модель, состоящая из 4-х уровней(те же, но без физического - http://www.soslan.ru/tcp/tcp01.html). В то время как в Википедии эта же модель имеет 5 уровней(те что вы описали). Предполагаю, что с момента написания книги были некоторые изменения.


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

Это не мое определение а авторов man страницы для iptables в debian lenny. Я тоже с ним не согласен по тому же поводу.

Спасибо за ваши ответы!
Всегда интересно изучить что-то новое или уточнить изменившиеся моменты.

PS Посмотрите на мой коммент относительно рисунка чуть выше.

Посты Комментарии
Последние посты
    Посты Комментарии
    Последние комментарии
      Посты Комментарии
      Изменения
        Посты Комментарии Изменения Черновики Избранное
        Черновики (все)
          Посты Комментарии Изменения Черновики Избранное
          Избранное (всё)
            Посты Комментарии Изменения Черновики Избранное
            Лучшие блоги (все 158)
            Топ пользователей Топ блогов
            Топ пользователей Топ блогов
            Элита (все 3233 из 234 городов)
            Топ пользователей Топ блогов
            welinux.ru

            Смотреть видео онлайн

            Онлайн видео бесплатно


            Смотреть русское с разговорами видео

            Online video HD

            Видео скачать на телефон

            Русские фильмы бесплатно

            Full HD video online

            Смотреть видео онлайн

            Смотреть HD видео бесплатно

            School смотреть онлайн