Погружение в Iptables – теория и настройка

Что представляет собой iptables

Данная утилита – это надежный межсетевой экран, минимизирующий риск вирусных и хакерских атак. Процесс настройки файрвола происходит через командную строку при помощи установленных команд, которые позволяют юзеру самостоятельно контролировать поступление и отправление трафика.

Файрвол предусмотрен стандартно во всех операционных системах Линукс. Для установки, если его внезапно не оказалось в сборке, или обновления следует применить такую команду:

sudo apt-get install iptables

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

В случае настроек Iptables по удаленному SSH-соединению, пользователю следует проявлять аккуратность: одно ошибочное правило способно прервать подключение и запретить юзеру доступ к удаленной машине.

Что делать с соединением

Настроив поведение утилиты, которое будет происходить автоматически, следует приступать к правилам, обрабатывающим входящий/исходящий трафик. Основные способы взаимодействия с трафиком:

Accept – разрешение определенного соединения;

Drop – игнорирование запросов (межсетевой экран продолжает свое функционирование, будто никакого запроса не происходило, а запрашивающие ресурсы не узнают об игнорировании);

Reject – блокировка входящего трафика и отправка ответных сообщений с обозначением ошибки (в таком случае запрашивающие ресурсы будут уведомлены о блокировке их трафика).

Пример того, как будет выглядеть ping для

Разрешенного соединения (Accept):

Ping для разрешенного соединения
Скриншот №2. Ping для разрешенного соединения

Проигнорированного трафика (Drop):

Ping для проигнорированного трафика
Скриншот №3. Ping для проигнорированного трафика

Отклоненного подключения (Reject):

Ping для отклоненного подключения
Скриншот №4. Ping для отклоненного подключения

Почему?

😪Мы тщательно прорабатываем каждый фидбек и отвечаем по итогам анализа. Напишите, пожалуйста, как мы сможем улучшить эту статью.

Вступление

Iptables в настоящее время является стандартом де-факто в среде современных linux дистрибутивов. Я даже сходу не могу припомнить, что еще используют в качестве фаервола. Так что любому администратору линукс приходится сталкиваться в своей работе с настройкой этого межсетевого экрана.

К этому фаерволу существуют разные обвязки, которые используются для более “удобной” настройки. В ubuntu есть ufw, в centos – firewalld, с другими не знаком. Лично я не вижу никакого удобства в использовании этих инструментов.

Я привык настраивать линуксовый фаервол по-старинке, как научился в самом начале работы. Мне кажется это наиболее простым и удобным способом, которым я с вами и поделюсь. Суть его сводится к тому, что создается скрипт с правилами фаервола. Этот скрипт можно легко редактировать под свои нужды и переносить с сервера на сервер.

Что делать с соединениями от одного айпи

Для блокировки трафика, поступающего из одного и того же источника (например, айпи 120.120.120.120) подойдет команда:

iptables -A INPUT -s 120.120.120.120 -j DROP

Для блокировки трафика, поступающего с нескольких айпишников в определенном диапазоне, следует воспользоваться стандартной записью масок посредством слэша:

iptables -A INPUT -s 120.120.120.0/24 -j DROP

Либо записью необходимого диапазона:

iptables -A INPUT -s 120.120.120.0/255.255.255.0 -j DROP

Брандмауэр на основе зон

Firewalld – это брандмауэр на основе зоны: каждая зона может быть настроена так, чтобы принимать или отклонять некоторые службы или порты и, следовательно, с другим уровнем безопасности.

Зоны могут быть связаны с одним или несколькими сетевыми интерфейсами.

Обычно firewalld поставляется с набором предварительно сконфигурированных зон: чтобы перечислять эти зоны и, в общем, взаимодействовать с брандмауэром, мы будем использовать утилиту firewall-cmd.

Я работаю в системе Fedora 27, давайте посмотрим, какие существуют доступные зоны:

Converting an iptables rule to a firewall-cmd rule

There are two options you can try,

  1. One disable firewalld and start using iptables for some still you get familiar with firewalld.
    To do so,

    • systemctl disable firewalld
    • systemctl enable iptables (after installing iptables)

You can use iptables commands itself.

  1. Second option – Firewalld command

firewall-cmd --permenent --direct --add-rule ipv4 nat PREROUTING 0 -p udp --dport 514 -j REDIRECT --to-ports 1670

Above firewalld cmd will do you the purpose.

Panic mode

Panice mode- это режим, который следует использовать только в ситуациях, когда есть серьезные проблемы с сетевой средой.

Когда этот режим активен, все существующие соединения отбрасываются, и все входящие и исходящие пакеты удаляются.

Он может быть включен таким образом:

# firewall-cmd --panic-on

Чтобы выйти из этого режима:

# firewall-cmd --panic-off

Можно даже запросить его статус, выполнив:

# firewall-cmd --query-panic

Rich rules в firewalld

Rich rules предоставляют гораздо больший уровень контроля, благодаря более тонким настройкам. Также их можно использовать для настройки ведения лога, маскарадинга, проброс портов и ограничения трафика.

Синтаксис и примеры rich rules подробно описаны в соответствующей странице руководства.

man 5 firewalld.richlanguage

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

Рассмотрим наиболее важные опции для работы с rich rules.

—add-rich-rule=’ПРАВИЛО’ — добавить правило, в данном примере мы разрешаем трафик с диапазона 10.0.0.0/24 только в диапазон 192.168.0.10/32 через TCP-порты c 8080 по 8090.

$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept' 
success

—list-rich-rules — вывод всех rich rules для указанной зоны. Мы видим только что созданное нами правило.

$ firewall-cmd --permanent --zone=testing --list-rich-rules

—remove-rich-rule — удалить rich rule, синтаксис такой же как у —add-rich-rule.

$ firewall-cmd --permanent --zone=testing --remove-rich-rule='rule family=ipv4 source address=10.0.0.0/24 destination address=192.168.0.10/32 port port=8080-8090 protocol=tcp accept'
success

Создадим rich rule, отклоняющее любой трафик с диапазона 192.168.0.10/24.

$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.0.10/24 reject'
success

Reject выдает ICMP-пакет об отклонении, тогда как drop просто отклоняет трафик без дополнительных действий. Поэтому drop может быть предпочтительнее в плане безопасности, так как ответ об отклонении раскрывает существование системы.

При использовании в rich rules адресов источника или получателя нужно указывать семейство rule family ipv4 или ipv6 в зависимости от используемой адресации.

Rich rules могут использоваться для ограничения трафика. Например, так можно ограничить количество входящих SSH-соединений десятью в минуту:

$ firewall-cmd --permanent --add-rich-rule='rule service name=ssh limit value=10/m accept' 
success

Также можно применять rich rules для записи сообщений в файл лога. Которое также может быть ограничено. Здесь мы ведем лог SSH-соединений с диапазона адресов 192.168.0.0/24, но количество записей ограничено 50 в минуту. Записываются только сообщения уровня ‘info’ или более важные.

$ firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="ssh" log prefix="ssh" level="info" limit value="50/m" accept'
success

Действия

Ну и последнее, о чем нужно рассказать, прежде чем мы с вами начнем писать правила – это target. В контексте iptables, target – это действие, которое нужно проделать с пакетом или соединением, которое совпало с критериями правила.

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

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

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

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

Есть действия, которые доступны только в определенной цепочке и таблицах, например, только в табоице nat и цепочках OUTPUT и PREROUTING доступно действие DNAT, которое используется в NAT’ировании и меняет Destination IP пакета.

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

Дополнительно

Чтобы вывести сконфигурированное ранее правило:

iptables –L

Чтобы просмотреть данные о входящих/исходящих пакетах и трафике, достаточно добавить ключ –v.

Данные об имени хоста, протоколах, сетях появятся в цифровом виде, если дописать в команду –n.

:/>  Где написать cmd

Разом удалить все имеющиеся установленные правила возможно командой:

iptables –F

Задача

Изучить основные концепции firewalld и способы взаимодействия с ним с помощью утилиты firewall-cmd

Зоны и службы firewalld

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

Firewalld фильтрует входящий трафик по различным зонам в зависимости от конкретных правил, применяемых к каждой зоне. При определении зоны для входящего соединения будет применяться следующая логика. Если IP-адрес отправителя соответствует определенным для зоны значениям, то пакет будет направляться через эту зону.

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

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

drop — минимальный уровень доверия. Все входящие соединения блокируются без ответа, допускаются только исходящие соединения.

Как определиться с назначением файрвола

Перед тем, как заниматься настройкой утилиты, потребуется разобраться с ее предназначением, а именно – действующими цепочками правил, то есть то, что она будет делать по умолчанию. Как отреагировать, когда запрашиваемые соединения не подходят ни к одному правилу?

Для начала потребуется понять, какие из настроек межсетевого экрана уже установлены. Для этого применяется команда –L:

Настройки межсетевого экрана
Скриншот №1. Настройки межсетевого экрана

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

Если в процессе эксплуатации Iptables конфигурация была кем-то изменена, значения могут стоять другие. Проверить это можно за пару секунд, достаточно ввести команды:

iptables --policy INPUT ACCEPTiptables --policy OUTPUT ACCEPTiptables --policy FORWARD ACCEPT

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

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

iptables --policy INPUT DROPiptables --policy OUTPUT DROPiptables --policy FORWARD DROP

Как отключить iptables

Если вы вдруг решите, что firewall вам больше не нужен, то отключить его можно следующим образом:

# systemctl stop iptables.service

Эта команда останавливает фаервол. А следующая удаляет из автозагрузки:

# systemctl disable iptables.service

Отключив сетевой экран, мы разрешили все соединения.

Как сохранить изменения в конфигурации файрвола

После всех изменений, которые мы внесли в цепочку межсетевого экрана, понадобится их сохранение. Иначе перезапуск утилиты удалит проделанные нами настройки. Команда сохранения будет различаться от дистрибутива к дистрибутиву Линукс.

Для Убунту команда выглядит так:

=sudo /sbin/iptables-save

Для Red Hat и CentOS:

=/sbin/service iptables save

Либо

=/etc/init.d/iptables save

Какие бывают правила

Для легкой работы с файрволом разработана тройка основных правил (команд):

1.Input.

Правило применяется, когда необходимо контролировать входящий трафик. Например, когда юзер подключается к удаленному серверу по протоколу Secure Shell, файрвол начнет сравнивать его айпи с другими айпи из своего списка. В зависимости от результата, то есть от наличия в списке запретов, доступ пользователю будет открыт или закрыт.

2.Forward.

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

3.Output.

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

Примечание:

Делая ping к внешнему хосту, машина не только отправляет пакет, но и дожидается обратного ответа. Поэтому, настраивая Iptables, не нужно забывать о наличии двухсторонних коммуникаций и запрещать подключение к серверам через протокол SSH.

Настройка маскарадинга в firewalld

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

Маскарадинг для зоны можно включить опцией —add-masquerade

$ firewall-cmd --permanent --zone=testing --add-masquerade
success

При помощи опции —query-masquerade мы можем убедиться, что маскарадинг успешно включен. В данном случае мы запросим постоянную конфигурацию, так как изменили только ее и еще не выполнили перезапуск.

$ firewall-cmd --permanent --query-masquerade
yes

В нашем примере маскарадингу будет подвергаться любой пакет, отправляемый на адреса, указанные в зоне ‘testing’. Для более тонкой настройки можно воспользоваться rich rules.

$ firewall-cmd --permanent --zone=testing --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 masquerade'
success

Здесь маскарадинг выполняется для всего трафика с диапазона адресов 192.168.1.0/24.

Настройка фаервола

Для управления правилами фаервола я использую скрипт. Создадим его:

# mcedit /etc/iptables.sh

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

Мы рассмотрим ситуацию, когда сервер является шлюзом в интернет для локальной сети.

Первым делом зададим все переменные, которые будем использовать в скрипте. Это не обязательно делать, но рекомендуется, потому что удобно переносить настройки с сервера на сервер. Достаточно будет просто переназначить переменные.

Перед применением новых правил, очищаем все цепочки:

Блокируем весь трафик, который не соответствует ни одному из правил:

Разрешаем весь трафик локалхоста и локалки:

Разрешаем делать ping:

Если вам это не нужно, то не добавляйте разрешающие правила для icmp.

Открываем доступ в инет самому серверу:

Если вы хотите открыть все входящие соединения сервера, то добавляйте дальше правило:

Делать это не рекомендуется, привожу просто для примера, если у вас появится такая необходимость.

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

Теперь добавим защиту от наиболее распространенных сетевых атак. Сначала отбросим все пакеты, которые не имеют никакого статуса:

Блокируем нулевые пакеты:

Закрываемся от syn-flood атак:

Следом за этими правилами рекомендуется поставить правила на запрет доступа с определенных IP, если у вас имеется такая необходимость. Например, вас задолбал адрес 84.122.21.197 брутом ssh. Блокируем его:

Если вы не ставите ограничений на доступ из локальной сети, то разрешаем всем выход в интернет:

Следом запрещаем доступ из инета в локальную сеть:

Чтобы наша локальная сеть пользовалась интернетом, включаем nat:

Чтобы не потерять доступ к серверу, после применения правил, разрешаем подключения по ssh:

И в конце записываем правила, чтобы они применились после перезагрузки:

Мы составили простейший конфиг, который блокирует все входящие соединения, кроме ssh и разрешает доступ из локальной сети в интернет. Попутно защитились от некоторых сетевых атак.

Сохраняем скрипт, делаем исполняемым и запускаем:

# chmod 0740 /etc/iptables.sh
# /etc/iptables.sh

Выполним просмотр правил и проверим, все ли правила на месте:

# iptables -L -v -n


Обращаю ваше внимание – применять правила нужно лишь в том случае, если у вас имеется доступ к консоли сервера. При ошибке в настройках вы можете потерять доступ. Убедитесь, что в нештатной ситуации вы сможете отключить фаервол и скорректировать настройки.

О состояниях соединения

Существует множество протоколов, которым требуется двусторонняя коммуникация. К примеру, пользователю понадобилось поработать с SSH-соединением, ему придется внести правило сразу и в Output, и в Input.

:/>  Не загружается система из-за жесткого диска

Что делать, если юзер хочет предоставить разрешение исключительно входящему соединению? В этом случае поможет состояние соединения. Оно даст возможность пользователю описать любую двустороннюю коммуникацию, в которой разрешено подключение заданного направления.

Разрешим соединение типа SSH, приходящее через хост 120.120.120.120. Система будет отправлять данные по этому протоколу только, если сессия установлена.

iptables -A INPUT -p tcp --dport ssh -s 120.120.120.120 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 120.120.120.120 -m state --state ESTABLISHED -j ACCEPT

Как сохранить изменения в конфигурации файрвола

После всех изменений, которые мы внесли в цепочку межсетевого экрана, понадобится их сохранение. Иначе перезапуск утилиты удалит проделанные нами настройки. Команда сохранения будет различаться от дистрибутива к дистрибутиву Линукс.

Для Убунту команда выглядит так:

=sudo /sbin/iptables-save

Для Red Hat и CentOS:

=/sbin/service iptables save

Либо

=/etc/init.d/iptables save

Отключение firewalld

Вопрос отключения firewalld я уже касался в теме по настройке сервера. Первым делом отключим firewalld, который присутствует в centos 7 по-умолчанию сразу после установки:

# systemctl stop firewalld

Теперь удалим его из автозагрузки, чтобы он не включился снова после рестарта:

# systemctl disable firewalld

После этого на сервере настройки сетевого экрана становятся полностью открытыми. Посмотреть правила iptables можно командой:

# iptables -L -v -n


Дальше пойдет информация исключительно по конфигурированию только iptables. Темы firewalld я больше касаться не буду.

Открытие портов

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

Было добавлено разрешение на входящие соединения по 80-му и 443-му портам, которые использует web сервер в своей работе.

Если у вас установлен почтовый сервер, то нужно разрешить на него входящие соединения по всем используемым портам:

Для корректной работы DNS сервера, нужно открыть UDP порт 53

И так далее. По аналогии можете открыть доступ для всех необходимых сервисов.

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

Отлично, теперь давайте приближаться к практике. Как Вы уже поняли, мы будем писать правила, поэтому нам нужно понять, как они строятся.

Подключения к определенному порту

Следующая команда сделает блокировку соединений типа Secure Shell с хостом 120.120.120.120:

iptables -A INPUT -p tcp --dport ssh -s 120.120.120.120 -j DROP

На месте Secure Shell допустимо применение любого протокола. После команды –р указывается тип подключений, в данном случае – TCP. В случае, когда используется другой тип, следует указывать его.

Любому айпишнику будет запрещено подключаться к машине по Secure Shell соединению, если выполнить:

iptables -A INPUT -p tcp --dport ssh -j DROP

Помогла статья? подписывайся на telegram канал автора

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

Правила

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

Ну допустим у нас есть сетевое устройство с адресом 192.168.1.1, на котором мы настроили iptables таким образом, чтобы запрещать любые ssh (порт 22) соединения на данный адрес. Если есть пакет, который идёт, например, с адреса 192.168.1.

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

Каждое правило в iptables состоит из критерия, действия и счётчика

  • Критерий – это условие, под которое должны подпадать параметры пакета или текущее соединение, чтобы сработало действие. В нашем примере – этим условием является наличие пакета на входящем интерфейсе, устанавливающего соединение на порт 22
  • Действие – операция, которую нужно проделать с пакетом или соединением в случае выполнения условий критерия. В нашем случае – запретить пакет на порт 22
  • Счетчик – сущность, которая считает сколько пакетов было подвержено действию правила и на основании этого, показывает их объём в байтах.

Проброс (forward) порта

Рассмотрим ситуацию, когда необходимо выполнить проброс портов с внешнего интерфейса на какой-то компьютер в локальной сети. Допустим, вам необходимо получить rdp доступ к компьютеру 10.1.3.50 из интернета. Делаем проброс TCP порта 3389:

Если вы не хотите светить снаружи известным портом, то можно сделать перенаправление с нестандартного порта на порт rdp конечного компьютера:

Проброс портов в firewalld

Как следует из названия, при пробросе портов весь трафик, отправленный на конкретный порт, будет перенаправляться либо на другой порт локальной системы, либо на порт внешней системы. Если требуется проброс на внешнюю сеть, нужно также настроить маскарадинг.

В рассмотренном ниже примере локальная система будет перенаправлять весь трафик, отправленный на порт 22, на TCP-порт 2222 на адрес 10.0.0.10. Правило перенаправления портов будет применяться только для отправителей, указанных в зоне ‘testing’.

$ firewall-cmd --permanent --zone=testing --add-forward-port=port=22:proto=tcp:toport=2222:toaddr=10.0.0.10
success

Убедиться в успешной работе проброса портов можно при помощи опции —query-forward-port.

$ firewall-cmd --permanent --zone=testing --query-forward-port=port=22:proto=tcp:toport=2222:toaddr=10.0.0.10
yes

Целиком вводить запись, которую вы делали при добавлении проброса портов, достаточно неудобно. Лучше воспользоваться опцией —list-all, она покажет все перенаправляемые порты.

Разрешение и блокировка указанных соединений iptables

Как только политика отношения к трафику настроена, пора приступать к определению правил для конкретных соединений. Мы рассмотрим вариант с отклонением указанного подключения. Способы для разрешения и игнорирования будут устанавливаться похожим методом.

Воспользуемся командой –А. Она позволит добавить новое правило к уже имеющейся цепочке. Межсетевой экран начинает проверку с самого верха, проходя по каждому из правил до тех пор, пока не обнаружит совпадения или не закончит список.

В случае, когда необходимо разместить правила в определенное место (перед каким-то определенным), следует воспользоваться командой:

iptables -I [цепочка] [номер позиции по списку для нового правила]

Свяжите зону с интерфейсом

Создание зоны – это только первый шаг: теперь мы должны связать ее с сетевым интерфейсом.

Предположим, мы хотим использовать нашу новую созданную зону, связывая ее с интерфейсом ethernet через ens5f5: вот команда, которая позволяет нам выполнить задачу:

# firewall-cmd --permanent --zone=linuxconfig --add-interface=ens5f5

если мы запрашиваем зону на назначенные ей интерфейсы, мы должны увидеть:

# firewall-cmd --zone=linuxconfig --list-interfaces
ens5f5

Удаление интерфейса из зоны так же просто:

# firewall-cmd --remove-interface=ens5f5 --zone=linuxconfig

Синтаксис 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 и какие опции для этого нужно использовать:

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

Создание пользовательской зоны

До сих пор мы посмотрели, как изменять существующие зоны.

Также можно создать несколько новых, и это так же просто.

Предположим, мы хотим создать пользовательскую зону под названием linuxconfig:

# firewall-cmd --permanent --new-zone=linuxconfig

Создана новая пустая зона: по умолчанию в ней не разрешены службы или порты.

Также можно создать зону, загрузив файл конфигурации:

# firewall-cmd --permanent --new-zone-from-file=file --name=linuxconfig

Где file – это путь к файлу, содержащему определение зоны.

Обратите внимание, что при создании или удалении зоны параметр -permanent является обязательным: ошибка будет отображена, если он не указан.

Таблица

Таблицы – это набор базовых и пользовательских цепочек. В зависимости от того, в какой таблице находится цепочка правил, с пакетом или соединением производятся определённые действия

Существует 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 в виде следующей схемы:

Трансляция сетевых адресов (nat)

Командой firewall-cmd можно настроить NAT с маскарадингом или пробросом портов. Маскарадинг можно настроить только для IPv4, но не для IPv6.

Требования

Полномочия root

Управление firewalld

В Centos 7  firewalld установлен по умолчанию, если же его нет, то можно установить следующей командой:

$ yum install firewalld

После установки нужно включить службу

$ systemctl start firewalld

Добавляем в автозагрузку

$ systemctl enable firewalld

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

Проверить работу и доступность службы можно командой

$ sudo firewall-cmd --state

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

При настройке конфигурации firewalld командой firewall-cmd можно указать опцию —permanent для изменения постоянных файлов конфигурации, записанных на диске. Если запускать команду без этой опции, изменится только текущая конфигурация, и при перезапуске все изменения будут потеряны. Если вы внесли изменения в текущую конфигурацию, можно сохранить их в постоянную при помощи команды

sudo firewall-cmd --runtime-to-permanent

При внесении изменений в постоянную конфигурацию они не будут применены, пока вы не выполните

 firewall-cmd --reload

Изменения можно сделать временными при помощи опции —timeout, в которой мы можем указать время действия правила в секундах, по истечении которого оно будет удалено.Это очень полезно при удаленном управлении системой: вы не сможете постоянно заблокировать себе доступ из-за ошибки в правиле, так как по истечении указанного времени изменение будет отменено. Опции —timeout и —permanent нельзя использовать одновременно.

Далее мы рассмотрим ряд других распространенных и полезных опций команды firewall-cmd. Если не указывать зону при изменении конфигурации, будет использоваться зона по умолчанию. Зону можно указать при помощи опции —zone=ИМЯ_ЗОНЫ

—get-default-zone — вывод зоны, установленной в качестве зоны по умолчанию, изначально это зона public.

$ firewall-cmd --get-default-zone

—new-zone=ИМЯ_ЗОНЫ — создание новой пользовательской зоны, требуется опция —permanent.

$ firewall-cmd --permanent --new-zone=testing
success

—set-default-zone — изменение зоны по умолчанию public на любую желаемую зону. Данная зона по умолчанию будет использоваться на всех интерфейсах, если не указано иное.

$ firewall-cmd --permanent --set-default-zone=testing

—get-zones — вывод списка всех доступных зон.

$ firewall-cmd --get-zones

—list-all-zones выводит более подробную информацию о каждой зоне, для примера приведем результат для одной из них.

$ firewall-cmd --list-all-zones

—get-active-zones выводит только те зоны, которые в данный момент используются и связаны с каким-либо интерфейсом.

$ firewall-cmd --get-active-zones

—get-services позволяет получить список предварительно заданных служб, которые можно использовать в правилах брандмауэра. Эти службы привязаны к портам.

$ firewall-cmd --get-services

Установка iptables

На самом деле фаервол у нас на сервере уже стоит и работает, просто нет никаких правил, все открыто. Установить нам нужно будет дополнительные утилиты управления, без которых конфигурировать iptables невозможно. Например, нельзя будет перезапустить фаервол:

# systemctl restart iptables.service
Failed to issue method call: Unit iptables.service failed to load: No such file or directory.

Или добавить в автозапуск не получится:

# systemctl enable iptables.service
Failed to issue method call: No such file or directory

Чтобы подобных ошибок не было, установим необходимый пакет с утилитами:

# yum -y install iptables-services

Теперь можно добавить iptables в автозагрузку и запустить:

# systemctl enable iptables.service
# systemctl start iptables.service

Заключение

Как и обещал, выкладываю готовый скрипт с основным набором правил, которые мы рассмотрели iptables.sh

Хочу еще раз обратить внимание, что при настройке iptables необходимо быть предельно внимательным. Не начинайте это дело, если не имеете доступа к консоли сервера. Даже во время написания этой статьи я потерял доступ к серверу из-за нелепой ошибке в правилах. Ошибка эта возникла из-за копирования и потери двойного тире – оно заменилось на одинарное.

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

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Оставьте комментарий