В этой статье мы поговорим о настройке iptables – межсетевого экрана, работающего непосредственно на хосте. Конечно, хостовые файрволлы администраторы часто отключают, полагаясь исключительно на периметровые средства защиты, чтобы они не мешали администрировать. Однако безопасности много не бывает и при грамотной настройке Iptables не будет мешать выполнению задач системного администрирования.

Система Iptables встроена в ядро Linux. То есть, все сетевые пакеты, которые проходят через данный узел, отправляются или принимаются данным узлом, ядро операционной системы направляет через фильтр iptables. В процессе обработки ядром эти пакеты проходят проверку, по результатам которой к ним применяется указанное в настройках iptables действие. Так пакет может быть передан далее целевому приложению или отброшен.

По типам все пакеты можно разделить на три вида: входящие (Input), проходящие (Forward), исходящие (Output). Рассмотрим каждый из этих видов подробнее.   

Для настройки iptables используются цепочки (chains), поэтому далее говоря о настройках МЭ мы будем использовать этот термин.  Цепочка входящие используется для управления поведением входящих подключений. Например, если пользователь попытается подключиться по SSH к вашему ПК/серверу, iptables попытается сопоставить IP-адрес и порт с правилом в цепочке Input.

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

И, наконец, цепочка Forward. Эта цепочка используется для входящих подключений, которые на самом деле не доставляются локально на данный узел. Здесь можно провести аналогию с маршрутизатором – данные всегда отправляются на него, но редко на самом деле предназначены для самого маршрутизатора (за исключением каких-нибудь маршрутных таблиц OSPF или BGP), данные просто пересылаются своему адресату. Если ваш узел не является программным маршрутизатором (такое тоже иногда бывает) или чем-либо еще, требующим переадресации, вы даже не будете использовать эту цепочку.

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

Идеология МЭ

Перед тем, как начать настраивать правила на любом межсетевом экране необходимо определиться с тем, по какому принципу у нас будет настраиваться доступ. Можно по принципу запрещено все, что не разрешено или разрешено все, что не запрещено. И хотя все прекрасно знают, что безопасным и соответственно правильным является первый принцип, на практике можно встретить разные варианты построения списков доступа. Очень часто бывает так, что по факту запрещаются только отдельные соединения и протоколы а все остальное остается разрешенным (например последнее правило на периметровом МЭ – permit any any).

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

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

 iptables --policy INPUT DROP

iptables --policy OUTPUT DROP

iptables --policy FORWARD DROP

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

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

В iptables пакет можно Принять (Accept), Отбросить (Drop) наше действие по умолчанию и Отклонить (Reject). Сразу может возникнуть вопрос, в чем разница между Отбросить и Отклонить, так как в обоих случаях у нас соединение не устанавливается. В случае Drop соединение прерывается и никакая информация в ответ не отправляется, в то время, как при Reject обратно отправляется сообщение об ошибке.

Типичной иллюстрацией различия этих двух действий является реакция на ping. Слева Drop, справа Reject.

Разрешаем хосты и порты

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

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

Соответственно, последовательность правил очень важна. Для добавления правила в конец списка мы будем использовать iptables -A. Если же требуется вставить правило в определенное место в списке, то нам необходимо использовать iptables -I с указанием номера позиции в списке на которую нужно поставить данную запись.

Также, если нам потребуется заменить одно правило на другое, то необходимо использовать iptables -R также с указанием номером заменяемого правила в списке.

Начнем с простого. Разрешим входящие соединения по TCP.

iptables -A INPUT -p tcp -j ACCEPT

Еще один пример, разрешим исходящие соединения на узел 192.168.222.2

iptables -A OUTPUT -d 192.168.222.2 -j ACCEPT

Здесь ключ -s это адрес источника, а -d это адрес назначения. Если мы хотим разрешить все входящие соединения на наш сервер по HTTP, то необходимо использовать следующее правило:

iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Где dport это и есть порт назначения.

Мы можем разрешить доступ также для отдельной подсети:

iptables -A INPUT -s 10.10.10.0/24 -j ACCEPT

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

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

iptables -A INPUT -p tcp --dport ssh -s 192.168.10.10 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -p tcp --sport 22 -d 192.168.10.10 -m state --state ESTABLISHED -j ACCEPT

Скрипт для автоматизации настройки

В случае, если у вас есть несколько серверов Linux и для каждого из них необходимо применить базовые настройки межсетевого экранирования, мы можем подготовить скрипт, который избавит нас от необходимости ручного ввода отдельных команд. В примере ниже этот скрипт настроит Iptables для организации доступа на веб сервер. То есть, у нас будут доступны входящие соединения по портам 80 и 443, необходимым для работы самого веб сервера. Ну и заодно, наш веб сервер будет доступен для ICMP. Чтобы мы могли его пинговать.

#!/bin/sh

# Очищаем правила Iptables

iptables -P INPUT ACCEPT

iptables -F

iptables -X


iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


# Разрешаем HTTP/HTTPS с любого узла

iptables -A INPUT -p tcp -m tcp -m state -m comment -s 0.0.0.0/0 --dport 80 --state NEW -j ACCEPT --comment " HTTP "

iptables -A INPUT -p tcp -m tcp -m state -m comment -s 0.0.0.0/0 --dport 443 --state NEW -j ACCEPT --comment " HTTPS "



# Разрешаем ICMP

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

 

# Политики по умолчанию

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP


# Сохраняем правила

iptables-save

 

Помимо прочего, в этом скрипте показана команда, предназначенная для сохранения изменений - iptables-save

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

iptables -L -n

Заключение

В этой статье мы рассмотрели основные возможности хостового межсетевого экрана iptables, настройки, применяемые для работы с различными типами трафика и основные команды для администрирования.


17 июля в OTUS пройдет открытый урок, посвященный оптимизации производительности MySQL. На занятии познакомимся с основными аспектами оптимизации MySQL:

  • важнейшие параметры конфигурации;

  • работа с кэшированием;

  • оптимизация структуры БД;

  • поиск медленных запросов;

  • использование репликации и разделения ролей.

Записаться можно на странице курса "Administrator Linux. Advanced".

Комментарии (9)


  1. dlinyj
    07.07.2023 14:29
    +12

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


    А по теме, учить тому, что не встраивается в современные дистрибутивы, такое себе. Если вы не идёте в ногу со временем, то в чём смысл? Сегодня iptables не поставляются в современные дистрибутивы, и даже если команда есть, то это алиас над nftables.


    image


    Подробно, в хорошей и качественной статье.


    1. marks
      07.07.2023 14:29
      +5

      Поддерживаю, публикуется какой-то хлам, по большей части. Ребят, вам самим не стыдно-то, такое постить и в таком количестве? Посмотрите на материалы топовых компаний, и сравните с тем, что валите на Хабр вы.


    1. selivanov_pavel
      07.07.2023 14:29

      Справедливости ради, nftables часто используется через прокладку совместимости в виде команд iptables, потому что куча софта на это завязана. Тот же докер, например.


      1. dlinyj
        07.07.2023 14:29

        Тем не менее, тут позиционируется как статья от компании, и что несёт новое и светлое. iptables статей просто вагон, а вот про nftables не так много.


      1. fedorro
        07.07.2023 14:29
        +2

        Поддерживаю! OTUS, хватит постить хлам! ????


      1. cat_chi
        07.07.2023 14:29

        Справедливости ради, docker довольно-таки похабно работает с правилами iptables, ну и то, что там до сих пор нет нормальной поддержки nftables... Это удручает


    1. ladutsko
      07.07.2023 14:29

      К сожалению, не только эта (
      Может это результат интеграции с присловутой ChatGPT?!


    1. cat_chi
      07.07.2023 14:29

      Раньше я думал, что это Макс Рокатанский такой особенный человек. Который то ли не понимает, что он делает, то ли осознанно превращает Хабр в помойку. Мол, может мстит Хабру за что-то.

      Теперь вижу, что таких кадров в блоге ОТУСа несколько. Размножаются.

      Зато теперь мы знаем, что ОТУС – это не компания, а недоразумение, и нормальный человек им денег не понесёт. Разве не для этого существуют корпоративные блоги? :)


  1. EvilMan
    07.07.2023 14:29
    +2

    Помимо прочего, в этом скрипте показана команда, предназначенная для сохранения изменений - iptables-save

    Внезапно, iptables-save не сохраняет правила, а просто выводит их в stdout.

    Ещё нигде не написали, исходя из каких соображений политика на OUTPUT выставлена в DROP.