30 видео на IT - тематику на нашем YouTube канале

ћерион Ќетворкс

12 минут чтени€

Ќачина€ своЄ знакомство с iptables, следует рассказать про netfilter. Netfilter - это набор программных хуков внутри €дра Linux, которые позвол€ют модул€м €дра регистрировать функции обратного вызова от стека сетевых протоколов.

’ук (hook) - это программный элемент, который позвол€ет перехватывать функции обратного вызова в чужих процессах.

Netfilter €вл€етс€ основой дл€ построени€ Firewall'а в дистрибутивах Linux, но дл€ того, чтобы он заработал в полную силу его нужно настроить.  ак раз с помощью iptables мы можем взаимодействовать с хуками Netfilter и создавать правила фильтрации, маршрутизации, изменени€ и транслировани€ пакетов. »ногда про Netfilter забывают и называют эту св€зку просто iptables.


¬ведение

»так, iptables - это утилита дл€ настройки программного Firewall'а (межсетевого экрана) linux, котора€ предустанавливаетс€ по умолчанию во все сборки Linux, начина€ с версии 2.4. «апускаетс€ iptables из командной строки (CLI) под пользователем с правами root и настраиваетс€ там же.

ћожете в этом убедитьс€, набрав команду iptables -V в командной строке, она покажет вам версию iptables.

верси€ iptables

ѕочему же iptables всем так понравилс€, что его стали включать во все сборки Linux? ¬сЄ дело в том, что iptables действительно очень прост в настройке. — помощью него можно решить следующие задачи:

  • Ќастроить stateless и statefull фильтрацию пакетов версий IPv4 и IPv6;
  • Stateless - это фильтраци€, основанна€ на проверке статических параметров одного пакета, например: IP адрес источника и получател€, порт и другие не измен€ющиес€ параметры.
    Statefull - это фильтраци€, основанна€ на анализе потоков трафика. — помощью нее можно определить параметры целой TCP сессии или UDP потока.
  • Ќастраивать все виды трансл€ции IP адресов и портов NAT, PAT, NAPT;
  • Ќастроить политики QoS;
  • ѕроизводить различные манипул€ции с пакетами, например - измен€ть пол€ в заголовке IP.

ѕрежде чем переходить к практике, давайте обратимс€ к теории и поймЄм саму логику iptables.


Ћогика и основные пон€ти€ iptables


ѕравила

 ак и все файрволлы, iptables оперирует некими правилами (rules), на основании которых решаетс€ судьба пакета, который поступил на интерфейс сетевого устройства (роутера).

Ќу допустим у нас есть сетевое устройство с адресом 192.168.1.1, на котором мы настроили iptables таким образом, чтобы запрещать любые ssh (порт 22) соединени€ на данный адрес. ≈сли есть пакет, который идЄт, например, с адреса 192.168.1.15 на адрес 192.168.1.1 и порт 22, то iptables скажет: УЁ, нет, брат, тебе сюда нельз€Ф и выбросит пакет.

»ли вообще ничего не скажет и выбросит, но об этом чуть позже :)

 аждое правило в iptables состоит из критери€, действи€ и счЄтчика

  •  ритерий - это условие, под которое должны подпадать параметры пакета или текущее соединение, чтобы сработало действие. ¬ нашем примере Ц этим условием €вл€етс€ наличие пакета на вход€щем интерфейсе, устанавливающего соединение на порт 22
  • ƒействие - операци€, которую нужно проделать с пакетом или соединением в случае выполнени€ условий критери€. ¬ нашем случае Ц запретить пакет на порт 22
  • —четчик - сущность, котора€ считает сколько пакетов было подвержено действию правила и на основании этого, показывает их объЄм в байтах.

÷епочки

Ќабор правил формируетс€ в цепочки (chains)

—уществуют базовые и пользовательские цепочки.

Ѕазовые цепочки - это набор предустановленных правил, которые есть в iptables по умолчанию.

—уществует 5 базовых цепочек и различаютс€ они в зависимости от того, какое назначение имеет пакет. »мена базовых цепочек записываютс€ в верхнем регистре.

  • PREROUTING - правила в этой цепочке примен€ютс€ ко всем пакетам, которые поступают на сетевой интерфейс извне;
  • INPUT - примен€ютс€ к пакетам, которые предназначаютс€ дл€ самого хоста или дл€ локального процесса, запущенного на данном хосте. “о есть не €вл€ютс€ транзитными;
  • FORWARD - правила, которые примен€ютс€ к транзитным пакетам, проход€щими через хост, не задержива€сь;
  • OUTPUT - примен€ютс€ к пакетам, которые сгенерированы самим хостом;
  • POSTROUTING - примен€ютс€ к пакетам, которые должны покинуть сетевой интерфейс.

¬ базовых цепочках об€зательно устанавливаетс€ политика по умолчанию, как правило Ц принимать (ACCEPT) или сбрасывать (DROP) пакеты. ƒействует она только в цепочках INPUT, FORWARD и OUTPUT


“аблица

“аблицы - это набор базовых и пользовательских цепочек. ¬ зависимости от того, в какой таблице находитс€ цепочка правил, с пакетом или соединением производ€тс€ определЄнные действи€

—уществует 5 таблиц:

  • filter - таблица, выполн€юща€ функции фильтрации пакетов по определЄнным параметрам. ¬ большинстве случаев вы будете использовать именно еЄ. —одержит следующие встроенные цепочки: FORWARD, INPUT, OUTPUT;
  • raw - чтобы пон€ть предназначение этой таблицы, нужно понимать логику работы statefull firewall'а. ƒело в том, что по умолчанию, iptables рассматривает каждый пакет как часть большого потока и может определить какому соединению принадлежит тот или иной пакет. — помощью raw таблицы настраиваютс€ исключени€, которые будут рассматривать пакет как отдельную, ни к чему не прив€занную сущность. —одержит следующие встроенные цепочки: INPUT, OUTPUT;
  • nat - таблица, предназначенна€ целиком по функции трансл€ции сетевых адресов. —одержит следующие встроенные цепочки: PREROUTING, OUTPUT, POSTROUTING;
  • mangle - таблица, предназначенна€ дл€ изменени€ различных заголовков пакета. ћожно, например, изменить TTL, количество hop'ов и другое. —одержит следующие встроенные цепочки: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING>;
  • security - используетс€ дл€ назначени€ пакетам или соединени€м неких меток, которые в дальнейшем может интерпретировать SElinux.

“еперь мы можем представить себе логику iptables в виде следующей схемы:

—хема iptables
ƒействи€

Ќу и последнее, о чем нужно рассказать, прежде чем мы с вами начнем писать правила - это target. ¬ контексте iptables, target - это действие, которое нужно проделать с пакетом или соединением, которое совпало с критери€ми правила.

»так, наиболее используемые действи€:

  • ACCEPT - разрешить прохождение пакета;
  • DROP - тихо выбросить пакет, не сообща€ причин;
  • QUEUE - отправл€ет пакет за пределы логики iptables, в стороннее приложение. Ёто может понадобитьс€, когда нужно обработать пакет в рамках другого процесса в другой программе;
  • RETURN - остановить обработку правила и вернутьс€ на одно правило назад. Ёто действие подобно break'у в €зыке программировани€.

ѕомимо этих четырех, есть ещЄ масса других действий, которые называютс€ расширенными (extension modules):

  • REJECT - выбрасывает пакет и возвращает причину в виде ошибки, например: icmp unreachable;
  • LOG - просто делает запись в логе, если пакет соответствует критери€м правила;

≈сть действи€, которые доступны только в определенной цепочке и таблицах, например, только в табоице nat и цепочках OUTPUT и PREROUTING доступно действие DNAT, которое используетс€ в NAT'ировании и мен€ет Destination IP пакета. ¬ той же таблице, только в цепочке POSTRUNNING доступно действие SNAT, мен€ющее Source IP пакета.

ќтдельно остановимс€ на действии MASQUERADE, которое делает то же самое что SNAT, только примен€етс€ на выходном интерфейсе, когда IP адрес может мен€тьс€, например, когда назначаетс€ по DHCP.


ѕишем правила

ќтлично, теперь давайте приближатьс€ к практике.  ак ¬ы уже пон€ли, мы будем писать правила, поэтому нам нужно пон€ть, как они стро€тс€.

»так, допустим у нас есть хост с адресом 192.168.2.17, на 80 (http) порту которого, работает вэб-сервер Apache. ћы заходим на адрес http://192.168.2.17 с хоста с адресом 192.168.2.2 и всЄ отлично работает:

сервер Apache доступен

ј теперь открываем командную строку под root на хосте 192.168.2.17 и пишем:

 iptables -A INPUT -p tcp -s 192.168.2.2 --dport 80 -j DROP 

ѕопробуем открыть открыть http://192.168.2.17 ещЄ раз:

сервер Apache недоступен

”пс, не работает. ƒавайте теперь разбиратьс€, что мы наделали?

¬сЄ очень просто Ц данной командой мы:

  • вызвали утилиту iptables;
  • -A - этим ключом мы указали, что нужно добавить правило к существующей цепочке;
  • INPUT - указали цепочку, к которой хотим добавить правило;
  • -p tcp - €вно указали протокол TCP. «десь также можно указывать другие протоколы (udp, icmp, sctp), или номер протокола, инкапсулируемого в IP (17 Ц udp, 6 Ц tcp и др.);
  • -s 192.168.2.2 - указали, какой адрес источника должен быть у пакета, который мы хотим фильтровать;
  • --dport 80 - указали адресованные какому порту пакеты мы хотим фильтровать. ¬ данном случае - 80, на котором работает наш сервер Apache.
  • -j DROP - указали что нужно сделать с пакетом, параметры которого совпали с данными критери€ми. ¬ данном случае Ц просто тихо выбросить.

“аким образом, мы заблокировали все пакеты с адреса 192.168.2.2 на локальный порт 80 и тем самым закрыли доступ к нашему серверу Apache дл€ данного хоста.

ќбратите внимание Ц мы не указывали таблицу, в цепочки которой мы хотим добавить правило. ѕоэтому, по умолчанию таблица - filter. ƒл€ €вного указани€ таблицы нужно перед указанием цепочки ввести ключ -t или (--table)

„тобы открыть доступ оп€ть просто помен€ем ключ -A в правиле на -D, тем самым мы удалим данное правило из iptables.


—интаксис iptables

ƒрузь€, на самом деле в iptables очень богатый синтаксис правил. ѕолный список ключей и параметров вы можете найти в официальном гайде на iptables.org. ћы же приведЄм самые УходовыеФ опции, которыми вы, веро€тно, будете пользоватьс€. „тобы вы не запутались, мы приводим их в табличках ниже.

ƒл€ удобства, в iptables реализовано очень много сокращений дл€ разных ключей. Ќапример, мы писали ключ -A вместо полного --append, -p вместо полного --proto и -s вместо полного --source, дальше мы покажем, что ещЄ можно сократить и где применить.

ЌачнЄм с команд дл€ редактировани€ правил и цепочек Ц добавлени€, удалени€, замены и так далее:

коротко синтаксис правила применение
-A --append {цепочка правила} добавить правило к цепочке (в самое начало)
-D --delete {цепочка правила} удалить правило из цепочки
-D --delete {номер правила в цепочке} удалить правило из цепочки по номеру (1 - x)
-I --insert {номер правила вцепочке} вставить правило в цепочку по номеру (1 - x)
-R --replace {номер правила вцепочке} заменить правило в цепочке по номеру (1 - x)
-X --delete-chain {цепочка} удалить цепочку (только дл€ пользовательских)
-E --rename-chain {старое им€ цепочки} {новое им€ цепочки} переименовать цепочку
-N --new {им€ цепочки} создание новой пользовательской цепочки
-C --check {правило цепочки} проверит наличие правила в цепочке
-F --flush {цепочка} удал€ет все правила в цепочке, если цепочка не указана Ц удал€тс€ все правила
-Z --zero {цепочка} {номер правила вцепочке} обнул€ет все счЄтчики пакетов и байтов в цепочке или всех цепочках
-P --policy {цепочка} {номер правила вцепочке} измен€ет политику по умолчанию, она должна основыватьс€ на встроенном targetТe {ACCEPT, DROP, QUEUE}

ѕродолжим синтаксисом настройки правил Ц на каком сетевом интерфейсе следить за пакетами, какой протокол провер€ть, адрес источника, назначени€ и так далее.

 стати, перед некоторыми параметрами можно ставить восклицательный знак - !, означающее логическое Ќ≈. ¬ таблице мы пометим такие параметры таким значком Ц (!)
коротко синтаксис опции применение
-p (!) --proto {протокол} протокол {tcp, udp, udplite, icmp, esp, ah, sctp} или номер протокола {16,7}, all - все протоколы
-4 --ipv4 указывает версию протокола ipv4
-6 --ipv6 указывает версию протокола ipv6
-s (!) --source {адрес/маска} указывает ip адрес источника
-d (!) --destination {адрес/маска} указывает ip адрес назначени€
-m --match включает дополнительные модули, €вно задающимис€ данным ключем. например <code>m limit --limit 3/min</code> - установит лимит на количество пакетов в минуту
-f (!) --fragment включает обработку фрагментированных пакетов, в которых нет параметров изначального полного пакета, содержащихс€ в первом фрагменте пакета
-i (!) --in-interface {им€ интерфейса} обрабатывает только вход€щие пакеты, прилетающие на сетевой интерфейс {им€ интерфейса}
-o (!) --out-interface {им€ интерфейса} обрабатывает только исход€щие пакеты, прилетающие на сетевой интерфейс {им€ интерфейса}
--set-counters {пакеты} {байты} включает счЄтчик дл€ ключей--insert, --append, --replace

“еперь рассмотрим опции дл€ действий, которые должны сработать по совпадению критериев:

коротко синтаксис опции применение
-j --jump {действие} примен€ет одно из действий accept, drop, reject и другие
-g --goto {цепочка} переходит к другой цепочке правил

“еперь рассмотрим какую информацию мы можем выт€нуть с помощью iptables и какие опции дл€ этого нужно использовать:

коротко синтаксис команды применение
-l --list {цепочка} {номер правила} показывает правила в цепочке или всех цепочках. по умолчанию покажет таблицу filter
-s --list-rules{цепочка} {номер правила} показывает текст правила в цепочке или всех цепочках
-n --numeric покажет параметры правила в числовом виде. например не порт будет не http, а 80
-v --verbose выводит более подробную информацию
-v --version покажет версию iptables
-x --exact покажет точные значени€ числовых параметров
--line-numbers покажет номера правил

ƒл€ быстрого получени€ информации о настроенных правилах и о метриках их срабатывани€, часто примен€етс€ команда, комбинирующа€ 3 ключа - iptables -nLv. Ќапример, дл€ настроенного нами ранее правила Ц вывод будет такой:

вывод nLv
ѕример посложнее

ƒавайте рассмотрим ещЄ один пример. ƒопустим у нас во локальной сети есть хост 192.168.2.19 с сервером Apache. ћы хотим сделать его доступным из »нтернета. ƒл€ этого нам нужно воспользоватьс€ возможност€ми таблицы nat и написать правило, которое будет перенаправл€ть вход€щий http трафик на внешний интерфейс (пусть будет enp0s3 с адресом 101.12.13.14) и порт 80 на адрес нашего сервера внутри сети и 80 порт Ц 192.168.2.19:80. ѕо сути Ц нужно сделать проброс портов.

Ќапишем такое правило:

 iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to 192.168.2.19:80

“еперь если мы перейдЄм по адресу http://101.12.13.14, то должны попасть на наш Apache.

¬озможности iptables настолько обширны, что мы могли бы начать писать новую Ѕазу знаний по нему. ¬ статье мы показали лишь базовые варианты применени€. Ёто действительно великий инструмент и освоить его не так уж сложно. Ќадеюсь, данна€ стать€ ¬ам в этом поможет. —пасибо за внимание!


ѕолезна ли ¬ам эта стать€?


Ёти статьи могут быть вам интересны: