Введение в iptables

iptables - это консольная утилита для управления сетевым фильтром (netfilter) встроенным в ядро Linux начиная с версии 2.4. Фильтрация сетевого трафика тема обширная, но в этой заметке мы коснемся только базовых понятий фильтрации сетевого трафика и основам управления netfilter при помощи iptables. Для начала давайте узнаем жизненный путь пакета, который попадает в нашу систему или генерируется нашей системой.

Все пакеты проходят определенный путь и со всеми ними происходят какие то действия, которые определяются правилами сетевого фильтра.

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

Всего существует 5 стандартных типов цепочек:

PREROUTING - в этой цепочке происходит первоначальная обработка входящего пакета, на данном этапе определяется пункт назначения пакета и осуществляется его передача дальше на обработку. Например, если ваша машина используется в качестве роутера, а пакет предназначается одной из машин в локальной сети, то далее пакет попадет в цепочку FORWARD, или пакет предназначался Web-серверу на вашей машине и тогда пакет попадет в цепочку INPUT.

INPUT - цепока предназначена для входящих пакетов, предназначеных локальному сервису, например Web-серверу, как описано выше.

FORWARD - сюда попадют пакеты проходящие транзитом через вашу машину дальше в локальную сеть.

OUTPUT - а в этой цепочке располагаются правила фильтрации для пакетов, которые были сгенерированы сервисами непосредственно на вашей машине (localhost)

POSTROUTING - эта цепочка существует для окончательно обработки исходящих пакетов. Например, для подмены ip адреса назначения пакета.

Все цепочки организованы в таблицы. Всего их сущесвует 4, но для большинства задач хватит двух: filter и nat. Остальные две: raw и mangle используют редко. Основная таблица, в которой и происходит непосредственная фильтрация - это таблица filter.

Если у вас есть под рукой система на базе Linux, root доступ и консоль, то давайте немного поупражняемся.

Это стандартная конфигурация netfilter. Если простым языком - пропускать все и по всем направлениям. По умолчанию iptables показал нам содержимое таблицы filter и трех цепочек: INPUT, FORWARD, OUTPUT. Ключи переданные iptables -nL указывают показать нам список цепочек (-L) и все адреса хостов в виде цифр: без этого ключа мы увидим localhost в правиле, а с ним 0.0.0.0

Укаждого правила в цепочке существует определенное действие, которое нужно совершить над пакетом, если он подходит под правило.

Стандартные действия, доступные во всех цепочках:

ACCEPT - разрешить прохождение пакета.

DROP - сбросить пакет (запретить прохождение)

REJECT - тоже что и DROP, но с отсылкой ответа «состояния» источнику пакета.

У каждой цепочки сущесвует действие по умолчанию, которое срабатывает когда не было обнаружено правила обработки для пакета.

Общее дествие на цепочку устанавливается командой iptables -P <название цепочки> ACCEPT, этим мы разрешим прохождения всех пакетов для которых не существует правил фильтрации.

Будте внимательны, если вы вдруг установите DROP на цепочку INPUT на удаленной машине, то можете потерять к ней доступ, если так сделать на локальной машине, то весь входящий трафик к вам будет сбрасываться. Это же относится и к остальным цепочкам. При всем этом, общая политика цепочек в DROP при грамотно настроенных правилах фильтрации - является более надежным, с точки зрения защиты, решением - так вы точно ничего не пропустите, а если что то захотите разрешить - добавте фильтр с ACCEPT внутрь цепочки. Эту концепцию можно озвучить как «все что не разрешено - запрещено», в противовес существует и другая концепция в фильтрации трафика - «все что не запрещено - разрешено». Выбирать вам.

Давайте еще немного поупражняемся.

Для начала лучшим решением будет очистить от правил таблицы filter и nat, для этого выполните с правами root:

# iptables -F 
# iptables -F -t nat

затем лучше всего установить на все цепочки по умолчанию разрешающее действие:

# iptables -S
# iptables -S -t nat

Теперь, давайте представим, что вам понадобилось по какой-либо причине заблокировать TCP трафик от конкретного хоста в Сети на 80 порт вашей машины. Сделать это можно так:

# iptables -A INPUT -s 55.44.33.22/32 -p tcp --dport 80 -j DROP

Параметр -A INPUT - добавить правило в цепочку INPUT таблицы filter (она не указывается, если бы нам потребовалось добавить правило в другую цепочку, то необходимо указать -t <название таблицы>). -s 55.44.33.22/32 указывает исходящий ip адрес - тот от кого мы получаем пакет/трафик. -p tcp -протокол. –dport 80 - порт назначения. -j DROP - действие которое сделать с пакетом.

Если перевести это на человеский язык, то получится примерно следующее: заблокировать любые запросы по протоколу TCP, приходящие к нам на 80 порт от хоста 55.44.33.22.

А вот если бы понадобилось не пропускать подобный трафик в нашу локальную сеть, то таблица была бы FORWARD с теми же остальными опциями. При этом путь пакета по цепочкам немного изменится.

Теперь давайте представим ситуацию, что у нас есть Web-сервер внутри локальной сети, но у него нет Public IP, который доступен из Интернет и мы хотим предоставить Миру к нему доступ - у нас там форум по кибер-безопасности, но ресурсы нашей машины не позволяют его обслуживать. Еще говорят: «хост скрыт за NAT». Для того, что бы эта схема работала, на машине выполняющей роль маршрутизатора и имеющей Public IP нам надо «поднять NAT» и настроить «редирект портов».

Давайте сделаем это. Для начала поднимем NAT:

# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 0/0 -o eth0 -j SNAT --to-source 44.55.66.77

Здесь мы добавляем в таблицу NAT (-t nat) в цепочку POSTROUTING (потому как подмена адреса происходит в самом конце) правило глосящее:

все что исходит (-s) от адресов сети 192.168.0.0/24 (наша адресация в локальной сети) на любой из адресов Интернет (-d 0/0) направлять через интерфейс (-o eth0 - на нем прописан наш Public ip 44.55.66.77) подвергнуть (-j SNAT - действие трансляции/подмены адреса), –to-source 44.55.66.77 означает, что надо использовать этот IP в качестве исходящего - то есть, подменять исходящий адрес пакета на этот.

С NAT все, далее делаем редирект или другими словами - обратный NAT:

# iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80

Здесь все тоже самое, добавляется только указание куда перенаправлять трафик поступивший с 80 порт по ip 44.55.66.77. В данном случае на 192.168.0.100, 80 порт.

Обратите внимание, что при такой конфигурации вы не сможете использовать 80 порт на машине-роутере, весь поступающий на него трафик будет перенаправляться на машину в локальной сети.

Тема сетевых фильтров очень обширна. iptables дает вам полный контроль над сетевыми фильтрами машин в вашей сети. С помощью iptables можно не только блокировать или разрешать какие то пакеты/трафик, но и определенным образом вносить изменения внутрь пакетов. Например, это может понадобиться для создания полностью прозрачного прокси и дальнейшего анализа/логирования трафика, сбора статистики. С помощью iptables и bash-scripting можно осуществить простейший, а то и не очень, учет по типу трафика, например, для понимания того - чем занимаются ваши коллеги в рабочее время - если вы системный администратор или ваши друзья - если вы администрируете междомовую локальную сеть.