Читайте также:
|
|
Основные термины:
iptables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана netfilter для ядер Linux, начиная с версии 2.4. Для использования утилиты iptables требуются привилегии суперпользователя (root). Иногда под словом iptables имеется в виду и сам межсетевой экран netfilter.
Фильтрация – разрешение или запрещение по некоторым критериям.
Правило — состоит из критерия, действия и счетчика. Если пакет соответствует критерию, к нему применяется действие, и он учитывается счетчиком. Критерия может и не быть — тогда неявно предполагается критерий «все пакеты». Указывать действие тоже не обязательно — в отсутствие действия правило будет работать только как счетчик.
Критерий — логическое выражение, анализирующее свойства пакета и/или соединения и определяющее, подпадает ли данный конкретный пакет под действие текущего правила.
Действие — описание действия, которое нужно проделать с пакетом и/или соединением в том случае, если они подпадают под действие этого правила.
Счетчик — компонент правила, обеспечивающий учет количества пакетов, которые попали под критерий данного правила. Также счетчик учитывает суммарный объем таких пакетов в байтах.
Цепочка – упорядоченная последовательность правил. Цепочки можно разделить на пользовательские и базовые.
Базовая цепочка — цепочка, создаваемая по умолчанию при инициализации таблицы. Каждый пакет, в зависимости от того, предназначен ли он самому хосту, сгенерирован им или является транзитным, должен пройти положенный ему набор базовых цепочек различных таблиц. Схема следования пакетов приведена на рисунке. Кроме того, базовая цепочка отличается от пользовательской наличием «действия по умолчанию» (default policy). Это действие применяется к тем пакетам, которые не были обработаны другими правилами этой цепочки и вызванных из нее цепочек. Имена базовых цепочек всегда записываются в верхнем регистре (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).
Пользовательская цепочка — цепочка, созданная пользователем. Может использоваться только в пределах своей таблицы. Рекомендуется не использовать для таких цепочек имена в верхнем регистре, чтобы избежать путаницы с базовыми цепочками и встроенными действиями.
Таблица — независимая группа цепочек. При вызове команды iptables таблица указывается в формате -t имя_таблицы. При отсутствии явного указания, используется таблица filter. Стандартные таблицы: mangle, nat, filter. Бывают еще пользовательские таблицы. Не все цепочки есть в каждой таблице.
Дополнительные сведения:
Пакет на одной машине проходит примерно следующий путь:
Идеология:
К нам на комп пришел пакетик. Быть может он пришел к нам... а может и не к нам: может он транзитом идет к кому-то еще? А может не пришел он, а мы сами его отправляем... Вот оно как бывает..
Есть 5 мест, где можно фильтровать пакеты. Это PREROUTING, FORWARD, INPUT, OUTPUT и POSTROUTING.
Пакет приходит к нам на интерфейс и сначала идет PREROUTING, там мы видим стандартный IP-пакет, то есть, тип трафика, адрес источника, адрес назначения и прочие данные из заголовка IP-пакета. Впрочем, это мы видим везде (во всех 5 местах). В PREROUTING мы еще не знаем, через какой интерфейс выйдет пакет, еще не принято решение о маршрутизации. Тут нужно ставить правила, если мы хотим фильтровать весь входящий трафик.
После PREROUTING идет так называемый «routing desigion» - мы определяем по таблице маршрутизации как дальше пойдет пакет: к нам или не к нам, и если не к нам, то с какого интерфейса уйдет.
Если пакет предназначается нам, то он попадает в INPUT. Тут нужно ставить правила, если мы хотим фильтровать только трафик, предназначенный нам (локальной машине).
Если пакет идет транзитом, то он попадает сначала в FORWARD, потом в POSTRUTING. В FORWARD мы уже знаем, с какого интерфейса уйдет пакет, так как решение о маршрутизации уже принято.
Если пакет идет от нас, то он попадает в OUTPUT, потом идет routing desigion, потом пакет попадает в POSTROUTING.
Netfilter — это 5 tcp hook'ов, в которых можно зарегистрировать фильтры. Эти фильтры называются таблицами iptables. Таблица (обработчик) на обработку получает пакет.
Какие могут быть результаты фильтрации? Пропустить; не пропустить; изменить, а потом пропустить.
Основные обработчики: mangle, nat и filter. Порядок применения обработчиков: mangle → nat → filter.
Mangle — есть во всех 5 местах. Используется для специфичных изменений в пакетах (прицепить на пакет метку, изменить поля заголовка). В этот фильтр ссыпаются все заголовки пакетов (но не сами пакеты), так что он легковесный и работает достаточно быстро.
Nat — в PREROUTING, POSTROUTING и OUTPUT. Используется для трансляции адресов.
Filter — в INPUT, OUTPUT, FORWARD. Filter — это таблица по умолчанию, куда заносятся правила, если не указана никакая другая таблица.
Каждый обработчик регистрирует цепочку проверок (chain). В проверке указывается с чем делать (match) и что делать. Match'ей может быть много, правило применяется, если пакет удовлетворяет всем условиям вместе. Действие с пакетом может производиться только одно. Если нужно производить с пакетом несколько действий, то нужно писать несколько правил.
Действия бывают терминирующие и нетерминирующие. Терминирующие — пакет вынимается из текущей цепочки, дальнейший просмотр правил завершается (DROP, ACCEPT, etc.). Нетерминирующие — правила продолжают просматриваться (например, можно поставить метку).
Правила заносятся по одному и применяются в порядке занесения.
Nat использует connection tracking. Его задача — подмена адресов. Функция connect организовывает порт из динамического диапазона портов. Она тоже делает bind, но там этот random'ный порт.
# iptables -t nat -A POSTROUTING -o eth1 -s 10.0.0.0/8 -j SNAT --to-source ip_for_inet
Это означает: в таблицу nat в цепочку POSTROUTING добавить правило, что если пакет приходит с интерфейса eth1 из сети 10.0.0.0/8 делаем подмену адреса источника на ip_for_inet.
Можно вместо -j SNAT --to-source ip_for_inet написать -j MASQUERADE
nat держит в ядре таблицу nat address table.
nat применяется для первого пакета соединения. Если правило срабатывает, то в таблице делается запись о соответствии
серый_IP:port | белый_IP:our_port
Потом, когда пакеты приходят на роутер, до всех правил просматривается эта таблица и происходит обратная подмена.
Когда соединение по факту порвется, запись из таблицы удалится.
Если же написано MASQUERADE, то подмена происходит так же, но адрес, на который подменяем, смотрим каждый раз заново (берет первый адрес интерфейса и подставляет его). Это нужно, если нашему роутеру раздается динамический IP, но это создает нехилую нагрузку при частых подключениях.
Есть два счетчика — счетчик пакетов и счетчик байт. На nat счетчики сработают только один раз — на первом пакете соединения. Поэтому для подсчета трафика нужно лезть в mangle.
В SNAT (source NAT) идет замена IP-ареса источника. Чаще всего используется в соединении vpn), но в SNAT нельзя указать порты.
Сохранить и вывести содержимое:
# iptables-save
Сохранить счетчики:
# iptables-save -c
Сохранить счетчики таблицы mangle в файл mangle_counters:
# iptables-save -c -t mangle > /home/nata/mangle_counters
Пример:
В таблицу nat, цепочку PREROUTING добавить правило: всё, что пришло на интерфейс eth1, на ip 192.168.1.2 по протоколу tcp на порт 12345 перенаправить (подменить адрес назначения) на 10.10.4.5, на порт 22:
# iptables -t nat -A PREROUTING -i eth1 -d 192.168.1.2 -p tcp --dport 12345 -j DNAT --to-destination 10.10.4.5:22
mangle — только в ней можно изменять заголовки пакета
nat — только в ней можно изменять адреса назначения и адрес отправителя
Критерии:
Общие:
-i — интерфейс, на который приходит пакет
-o — интерфейс, с которого уходит пакет
-p — протокол
-s, --src — адрес источника/отправителя
-d, --dst — адрес назначения/получателя
limit, подгружается явно ключом -m limit, может задавать ограничения по количеству пакетов в единицу времени
Модуль conntrack работает с данными о соединениях (фильтр по состоянию соединения и т. д.)
модуль connmark — работает с метками. Работает в связке с действием mark.
модуль hashlimit - фильтр по кольчеству match'ей по какому-нибудь правилу в секунду:
# iptables -s 10.0.0.0/8 --hashlimit-upto 1000/second -j ACCEPT
Модуль iprange разрешает задавать диапазоны ip-адресов.
Модуль connlimit — может ограничить количество соединений с одного адреса на сервер.
Модуль owner — работает только в OUTPUT, можно проверять, какой пользователь генерит этот трафик.
recent — если за недавнее время пришли n пакетов от кого-то, то делать то-то. Полезно от DdoS атак. Он ведет списки.
u32 – страшно, но можно фильтровать по любым битам пакета IP!
TCP:
--sport — порт источника
--dport — порт назначения
--tcp-flags
--icmp-type
--syn
-m mac — фильтрация по MAC-адресу
# iptables [-t table] -A chain rule
Вместо -A (add) можно -D (delete)
Есть стандартные действия: ACCEPT, DROP, REJECT.
Если пакет ничему не соответствует — политика по умолчанию (ACCEPT, DROP, REJECT — для стандартных цепочек, а для своих цепочек — возврат в то место, где ушли в эту цепочку). Первые правила нужно делать такие, чтоб они обрабатывали большую часть траффика.
Есть 2 счетчика: сколько пакетов соответствовало правилу и сколько байт прошло. Короче, можно считать траффик.
Цели (полезное) или «что делать с пакетом»:
DNAT — куда перенаправлять
LOG — куда в syslog запихнуть какое сообщение (нетерминирующее и довольно медленное действие)
MASQUERADE — подставить свой IP
SNAT — замена адреса источника
TEE — чтоб спараллелить траффик
TTL — поменять TTL
MARK
NFQUERY
NOTRACK — отключить отслеживание соединения для какого-то трафика.
ULOG — выкидывать в пользовательское пространство часть пакета (для подсчета трафика)
и т. д.
Примерчики:
# iptables -t nat -A POSTROUTING -j SNAT --to-source ip_for_inet
# iptables -A INPUT -j ACCEPT
(в таблицу filter (она по дефолту, если не указана другая), цепочку INPUT — все пакеты принимать).
Есть 2 способа, чтобы увидеть, что происходит:
1) conntrack — трассировщик — входит в iptables. В файл /proc/net/ip_conntrack записывается содержимое пакетов.
2) tcpdump — видим, что пакеты идут не туда.
Дата добавления: 2015-10-23; просмотров: 118 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
DNS — Domain Name Service | | | VLAN — Virtual Local Area Network |