IPTables — утилита командной строки, является стандартным интерфейсом управления работой межсетевого экрана (брандмауэра) netfilter для ядер Linux, начиная с версии 2.4

Iptables используется для IPv4, для IPv6 используется ip6tables, arptables - ARP, ebtables - Ethernet

x_tables — бэкенд для ip_tables, ip6_tables и arp_tables. В этом модуле определены основные операции для работы с фаерволами «таблично-цепочечной» структуры и их компонентами.

 

Всю работу по фильтрации трафика выполняет ядро системы. Iptables не является демоном и не создает новых процессов в системе. Включение или выключение iptables это всего лишь отправка сигнала в ядро. Большая скорость фильтрации достигается за счёт анализа только заголовков пакетов.

 

Иногда под словом IPTables имеется в виду и сам межсетевой экран Netfilter.

 

Все пакеты делятся на три типа: входящие, исходящие и проходящие. Входящие — это те, которые были отправлены на этот компьютер, исходящие — отправленные из этого компьютера в сеть. А проходящие — это пакеты, которые просто должны быть пересланы дальше, например, если ваш компьютер выступает в качестве маршрутизатора.

 

В целом есть 3 сущности:

-Правило

-Цепочка - последовательность правил

-Таблица

 

Правила Iptables

 

Для каждого типа пакетов можно установить набор правил, которые по очереди будут проверяться на соответствие с пакетом и если пакет соответствует, то применять к нему указанное в правиле действие. Правила образуют цепочку, поэтому input, output и forward называют цепочками, цепочками правил. Действий может быть несколько:

- ACCEPT — разрешить прохождение пакета дальше по цепочке правил;

- DROP — удалить пакет;

- REJECT — отклонить пакет, отправителю будет отправлено сообщение, что пакет был отклонен;

- LOG — сделать запись о пакете в лог файл;

- QUEUE — отправить пакет пользовательскому приложению.

- RETURN - возвращает пакет в ту цепочку, из которой он прибыл;

- SNAT - применить source NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочках POSTROUTING и OUTPUT таблицы NAT;

- DNAT - применить destination NAT ко всем удовлетворяющим условию пакетам. Может использоваться только в цепочке POSTROUTING таблицы NAT*.

- MASQUERADE - может применяться только в цепочке POSTROUTING таблицы NAT. Используется при наличии соединения с динамическим IP. Похож на SNAT, однако имеет свойство забывать про все активные соединения при потере интерфейса. Это полезно при наличии соединения, на котором время от времени меняется IP-адрес, но при наличии постоянного IP это только доставит неудобства. В том числе поэтому рекомендуется для статических IP использовать SNAT.

 

Правила могут проверять любые соответствия, например, по ip, по порту получателя или отправителя, заголовкам пакета и многому другому. Если пакет не подходит ни одному из правил, то к нему применяется действие по умолчанию.

++++++++++++++++++++++++++++++++++++

 

Таблицы Iptables

 

Над цепочками правил в iptables есть еще один уровень абстракции, и это таблицы. В системе есть несколько таблиц, и все они имеют стандартный набор цепочек input, forward и output. Таблицы предназначены для выполнения разных действий над пакетами, например для модификации или фильтрации. фильтрация пакетов iptables осуществляется в таблице filter:

 

С помощью модуля, который можно загрузить через правила, Iptables может также отслеживать соединения. Это означает, что можно создать правила, определяющие, что делать с пакетом, на основе его отношения к предыдущим пакетам. Эта функция называется «отслеживанием состояния» (state tracking), «отслеживанием соединений» (connection tracking) или же «механизмом определения состояний» (state machine).

 

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

Другими словами, правила в начале цепочки должны быть более специфическими и подробными, чем правила в конце. Тогда пакет будет проходить сначала специфические правила, а затем — более общие, что создает расширяющийся шаблон. Если пакет не соответствует никаким правилам цепочки, то он отвечает самому общему правилу —  политике по умолчанию.

 

В iptables используется четыре вида таблиц:

- raw — предназначена для работы с сырыми пакетами, пока они еще не прошли обработку;

- mangle — предназначена для модификации пакетов;

- nat — обеспечивает работу nat, если вы хотите использовать компьютер в качестве маршрутизатора;

- filter — основная таблица для фильтрации пакетов, используется по умолчанию.

 

Таблица mangle

Основное назначение таблицы mangle - внесение изменений в заголовок пакета. В этой таблице могут производиться следующие действия:

- установка бита Type Of Service;

- установка поля Time To Live;

- установка метки на пакет, которая может быть проверена в других правилах;

 

Цепочки в таблице mangle:

- PREROUTING — используется для внесения изменений в пакеты на входе в iptables, перед принятием решения о маршрутизации;

- POSTROUTING — используется для внесения изменений в пакеты на выходе из iptables, после принятия решения о маршрутизации;

- INPUT — используется для внесения изменений в пакеты, перед тем как они будут переданы локальному приложению;

- OUTPUT — используется для внесения изменений в пакеты, поступающие от приложения внутри iptables;

- FORWARD — используется для внесения изменений в транзитные пакеты;

 

Таблица nat

Таблица используется для преобразования сетевых адресов (Network Address Translation) и когда встречается пакет, устанавливающий новое соединение. В этой таблице могут производиться следующие действия:

- DNAT (Destination Network Address Translation) – преобразование адреса назначения в заголовке пакета;

- SNAT (Source Network Address Translation) – изменение исходного адреса пакета;

- MASQUERADE – используется в тех же целях, что и SNAT, но позволяет работать с динамическими IP-адресами;

 

Цепочки в этой таблице:

- PREROUTING – используется для внесения изменений в пакеты на входе в iptables;

- OUTPUT – используется для преобразования адресов в пакетах, перед дальнейшей маршрутизацией;

- POSTROUTING – используется для преобразования пакетов, перед отправкой их в сеть;

 

 

Таблица filter

Таблица используется для фильтрации пакетов. В этой таблице есть три цепочки:

- Input — обрабатывает входящие пакеты и подключения. Например, если какой-либо внешний пользователь пытается подключиться к вашему компьютеру по ssh или любой веб-сайт отправит вам свой контент по запросу браузера. Все эти пакеты попадут в эту цепочку;

- forward — эта цепочка применяется для проходящих соединений. Сюда попадают пакеты, которые отправлены на ваш компьютер, но не предназначены ему, они просто пересылаются по сети к своей цели. Как я уже говорил, такое наблюдается на маршрутизаторах или, например, если ваш компьютер раздает wifi;

- output — эта цепочка используется для исходящих пакетов и соединений. Сюда попадают пакеты, которые были созданы при попытке выполнить ping mail.ru или когда вы запускаете браузер и пытаетесь открыть любой сайт.

 

Но если вы думаете что можно просто полностью закрыть цепочку Input для увеличения безопасности, то вы очень сильно ошибаетесь. При работе сети используются обе цепочки input и output. Например, вы пытаетесь выполнить ping, данные отправляются через output, но ответ приходит через input. То же самое происходит при просмотре сайтов и других действиях. А вот цепочка forward может вообще не использоваться если ваш компьютер не является маршрутизатором. Так что настройка iptables должна выполняться очень аккуратно.

+++++++++++++++++++++++++++++++++

 

В системе netfilter каждый пакет, проходящий через механизм определения состояний, может иметь одно из четырёх возможных состояний:

NEW — пакет открывает новый сеанс. Классический пример — пакет TCP с флагом SYN.

ESTABLISHED — пакет является частью уже существующего сеанса.

RELATED — пакет открывает новый сеанс, связанный с уже открытым сеансом. Например, во время сеанса пассивного FTP клиент подсоединяется к порту 21 сервера, сервер сообщает клиенту номер второго, случайно выбранного порта, после чего клиент подсоединяется ко второму порту для передачи файлов. В этом случае второй сеанс (передача файлов по второму порту) связан с уже существующим сеансом (изначальное подсоединение к порту 21).

INVALID — все прочие пакеты.

+++++++++++++++++++++++++++++++++

 

Команды iptables

 

Общий вид команды iptables:

$ iptables -t таблица действие цепочка дополнительные_параметры

таблица указывает таблицу, с которой нужно работать, этот параметр можно упустить, действие — нужное действие, например, создать или удалить правило, а дополнительные параметры описывают действие и правило, которое нужно выполнить.

 

Основные действия, которые позволяет выполнить iptables:

-A — добавить(append) правило в цепочку; Эта часть команды сообщает iptables о необходимости внести правило в конец цепочки.

— проверить все правила

-D — удалить правило;

-I — вставить правило с нужным номером;

-L — вывести все правила в текущей цепочке;

-S — вывести все правила;

-F — очистить все правила;

-N — создать цепочку;

-X — удалить цепочку;

-P — установить действие по умолчанию.

 

 

Дополнительные опции для правил:

-p — указать протокол, один из tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh или all;

-s — указать ip адрес устройства-отправителя пакета;

-d — указать ip адрес получателя;

-i — входной сетевой интерфейс;

-o — исходящий сетевой интерфейс;

-j — выбрать действие, если правило подошло.

-m — добавить модуль

 

Просмотр правил iptables:

# iptables -nvL

# iptables -S

Вывести правила с нумерацией:

# iptables -nvL --line-numbers

Просмотр правил цепочки INPUT:

# iptables -nvL INPUT

Очистить правила:

# iptables -F

# iptables -F INPUT

При этом политика по умолчанию не изменяется!

 

Удалить пятое правило в таблице INPUT:

# iptables -D INPUT 5

Все эти действия выполняются для таблицы по умолчанию — filter

 

Указать правила по умолчанию(policy):

# iptables -P INPUT ACCEPT

# iptables -P OUTPUT ACCEPT

# iptables -P FORWARD DROP

Фильтровать пакеты, которые нужно заблокировать мы можем по множеству критериев, например, протоколу, ip адресу, маске сети, порту и многому другому.

 

Блокировать входящие пакеты с 8.8.8.8:

# iptables -A INPUT -s 8.8.8.8 -j DROP

Можно использовать доменное имя хоста:

# iptables -A INPUT -s test.host.net -j DROP

Удалить блокировку для подсети:

# iptables -D INPUT -s 8.8.8.0/24 -j DROP

Блокировать порт:

# iptables -A INPUT -p tcp -s 8.8.8.8 --dport 22 -j DROP

# iptables -A INPUT -p tcp -s 8.8.8.8 --dport ssh -j DROP

Блокировать 22 порт для всех кроме 8.8.8.8:

# iptables -A INPUT ! -s 8.8.8.8 -p tcp --dport 22 -j DROP

Запретить все исходящие пакеты на хост 192.168.1.95:

# iptables -A OUTPUT -d 192.168.156.156 -j DROP

Запретить доступ к vk.com:

# iptables -A OUTPUT -d vk.com  -j REJECT

Как и в случае с источником пакета можно использовать адреса под сети и доменные имена. Отрицание также работает.

 

Разрешить входящие эхо-запросы:

# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Разрешить все исходящие пакеты с порта 80:

# iptables -A INPUT -p tcp --sport 80 -j ACCEPT

Открыть диапазон портов:

# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

Разрешить получать данные от DHCP-сервера:

# iptables -A INPUT -p UDP --dport 68 --sport 67 -j ACCEPT

Разрешить rsync с определенной сети:

# iptables -A INPUT -i eth0 -p tcp -s 192.168.1.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

Разрешаем IMAP/IMAP2 трафик:

# iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

Port Forwarding

Направить трафик с порта 442 на 22, это значит что входящие ssh-соединения могут быть принятыми с порта 422 и 22.

# iptables -t nat -A PREROUTING -p tcp -d 192.168.1.15 --dport 422 -j DNAT --to 192.168.1.15:22

Также надо разрешить входящие соединения с порта 422:

# iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
Как и в случае с портом источника нужно указать протокол. Можно использовать отрицание.

 

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

# iptables -A INPUT -s 192.168.1.0/24 -j LOCAL_NET

 

Сохранять правила Iptables можно утилитой iptables-persistent:

# apt-get install iptables-persistent

Сохранить настройки iptables:

# /sbin/iptables-save

# iptables-save > /etc/iptables/rules.v4

Правило приема пакетов с loopback device:

# iptables -I INPUT 1 -i lo -j ACCEPT

-I INPUT 1: флаг -I говорит iptables вставить (insert) правило. Данный флаг отличается от флага -А (который просто вносит правило в конец цепочки); он указывает цепочку, в которую нужно внести правило, и расположение правила в ней. В данном случае, правило нужно вставить в самое начало цепи INPUT, вследствие чего все правила передвинутся на одну позицию. Это правило нужно разместить в начале цепочки, поскольку оно является одним из основных правил и не должно зависеть от остальных.

-i lo: данный компонент правила пропускает пакеты, которые используют интерфейс lo («lo» — это другое название для loopback device). Это значит, что любой пакет, использующий данный интерфейс, должен быть принят.

 

Правило не сбрасывать все текущие соединения, а также принять все соединения, имеющие к ним отношение:

# iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

-m conntrack: кроме набора основных функций iptables также имеет набор расширений, или модулей, которые отвечают за дополнительные возможности фаервола. Данная часть команды говорит о том, что пользователю необходим доступ к функциям модуля conntrack. Этот модуль позволяет использовать команды, решающие, что делать с пакетом, на основе его отношения к предыдущим соединениям.

--ctstate: одна из команд, доступных при вызове модуля conntrack. Данная команда позволяет отслеживать отношение пакетов к другим пакетам, просмотренным ранее. Ей заданы значения ESTABLISHED (что позволяет принимать пакеты, которые являются частью существующего соединения) и RELATED (принимает пакеты, которые связаны с уже установленным соединением).

 

Многие протоколы требуют двусторонних коммуникаций. Например, если нужно разрешить соединения по SSH, то добавить правила надо будет и в цепочку input и в цепочку output. Но что, если нужно только разрешить доступ только входящим соединениям? Разрешит ли добавление правила в цепочку output и исходящие SSH-соединения?

Для таких случаев используются состояния соединений. Они позволяют описывать двусторонние коммуникации, в которых разрешается установка только соединений определенной направленности. В примере ниже разрешены SSH-соединения, поступающие от хоста 10.10.10.10, но SSH-соединения к этому хосту запрещены. Однако, системе разрешается отправка информации по SSH в случае уже установленной сессии, что делает возможной SSH-коммуникацию между хостами:

# iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

# iptables -A OUTPUT -p tcp --sport 22 -d 10.10.10.10 -m conntrack --ctstate ESTABLISHED -j ACCEPT

Просмотреть атрибуты активных подключений можно в псевдофайле /proc/net/nf_conntrack (или /proc/net/ip_conntrack)

+++++++++++++++++++++++++++++++++

 

Пример базового набора правил

 

В большинстве случаев конечному пользователю (рабочая станция) достаточно выполнить такую последовательность команд:

iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -P INPUT DROP

Для сервера:

iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

iptables -A INPUT -p tcp -s 8.8.8.8 -m conntrack --ctstate NEW --dport 22 -j ACCEPT

и т.д. открываем нужные порты

iptables -P INPUT DROP

 

 

Материалы:

https://losst.ru/nastrojka-iptables-dlya-chajnikov

https://ru.wikipedia.org/wiki/Iptables

http://www.8host.com/blog/nastrojka-faervola-s-pomoshhyu-iptables-na-ubuntu-14-04/

https://ru.wikibooks.org/wiki/Iptables

https://proft.me/2013/06/15/iptables-setevaya-bezopasnost-i-filtraciya-paketov/

https://notessysadmin.com/minimum-rules-for-iptables

http://www.k-max.name/linux/iptables-v-primerax/