Содержание
В этой статье мы покажем, как управлять файерволом Linux с помощью классическгого iptables вместо firewalld в CentOS / RHEL 7 для фильтрации входящего и исходящего трафика. В этой статье рассмотрена настройка iptables на CentOS 7 для фильтрации входящего трафика, на примере развернутого с нуля облачного виртуального сервера myserver01, доступного из Интернета.
Содержание:
Отключение firewalld в CentOS 7
В CentOS 7 для управления файрволом по умолчанию используется системная служба firewalld. Она предоставляет свой интерфейс, но в итоге также работает через утилиту iptables. При этом управление файроволом должно осуществляться либо через firewalld, либо напрямую через iptables.
firewalld не замена, а обертка вокруг iptables, пользоваться из этого можно тем, что больше нравится, или больше подходит в конкретных условиях. iptables более универсален, это базовый инструмент, но он немного сложнее в освоении. firewalld предоставляет более простой интерфейс, но, например, в CentOS 6 воспользоваться им не получится, да и для других дистрибутивов необходимо наличие нужных установочных пакетов. К тому же, если вы используете приложения, которые производят свои настройки в файрволе, они должны быть совместимы с firewalld (пример таких приложений docker, fail2ban).
Проверим статус firewalld и отключим его.
systemctl status firewalld
В выводе команды обведенная красным область со словом enabled, означает включенную автозагрузку, а область, обведенная желтым, со словом active, означает, что служба запущена.
Останавливаем службу и выключаем для нее автозагрузку:
systemctl stop firewalldsystemctl disable firewalld
Повторно проверяем статус:
Теперь вывод команды показывает disabled для автозагруки (выключена), и inactive означает, что служба выключена.
Синтаксис и правила iptables в CentOS/Red Hat
Iptables – это утилита, с помощью которой настраиваются правила для файрвола в Linux.
Iptables группирует правила файрвола в таблицах, основные это:
- Таблица filter – используется для фильтрации трафика, то есть разрешения и запрещения соединений
- Таблица nat – используется для преобразования адресов (NAT)
- Таблица mangle – прочие модификации заголовков ip пакетов.
Для начала проверим, что iptables установлен в системе(должен быть умолчанию):
rpm -q iptables
Вывод команды показывает, что текущая установленная версия iptables – 1.4.21.
Работа с iptables в командной строке требует root привилегий, поэтому далее будем работать под пользователем root.
Чтобы вывести текущие правила, выполним команду:
iptables [-t таблица] -L [цепочка] [параметры]
Примечание: если не указать название таблицы при вызове команды, по умолчанию используется таблица filter.
Например, результат команды iptables -L, когда в таблицах еще не создано правил:
Рассмотрим вывод команды подробнее.
Таблица filter содержит три типа правил, так называемые chain(цепочки):
- INPUT – в этой цепочке обрабатываются входящие ip пакеты, предназначенные для самого хоста;
- OUTPUT – в этой цепочке обрабатываются исходящие ip пакеты от самого хоста;
- FORWARD – эта цепочка нужна для перенаправления ip пакетов. Используется, если вы хотите использовать сервер, как маршрутизатор.
Напротив каждой цепочки указана политика по умолчанию (policy), которая определяет, что нужно делать, в случае, если соединение не попало ни в одно из правил. Политика по умолчанию может принимать два значения и определяет сам подход к организации файрвола:
- ACCEPT – по умолчанию все соединения разрешены, правилами блокируются нежелательные соединения;
- DROP – по умолчанию все соединения запрещены, правилами разрешаются нужные соединения.
Создание правил фильтрации трафика в iptables
Фильтр iptables по интерфейсу
Начнем создавать правила. Синтаксис команды для добавления нового правила в конец указанной цепочки выглядит так:
iptables [-t таблица] -A <цепочка> <критерии> -j <действие>
Для начала, разрешим трафик через локальный loopback интерфейс(127.0.0.1), что необходимо для работы некоторых приложений:
iptables -A INPUT -i lo -j ACCEPT
Разберем по порядку:
- Мы указываем цепочку INPUT, т.е. правило будет применяться для входящих соединений.
- Далее, используем ключ -i(—in-interface), чтобы определить входящий интерфейс, на который приходит ip пакет.
- Завершаем команду ключом -j(—jump), определяющим действие, которое будет выполнено для всех ip пакетов, соответствующих критерию из пункта 2. В данном случае ACCEPT – разрешить соединение. Кроме того, к основным действиям с соединениями также относятся:
- DROP – запретить соединение, источник соединения не информируется, ip пакет просто отбрасывается;
- REJECT – запретить соединение, источник соединения информируется сообщением.
Фильтр iptables по порту, протоколу или IP адресу
Теперь добавим разрешающее правило для подключения к нашему Linux серверу по SSH на порт 22.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
В этом правиле критериями являются порт и протокол. Протокол (tcp, udp, icmp, all) задается ключом -p(—protocol), порт назначения (т.е. порт на который будут приходить ip пакеты к серверу) —dport.
Примечание: если вы хотите использовать в критериях порт назначения или порт источник(—dport или —sport), то указывать протокол обязательно.
Допустимо указывать диапазон портов через двоеточие, например
--dport 6000:6063
Если нам известны ip адреса клиентов, с которых мы будет подключаться к серверу, более безопасным будет разрешить доступ только с этих ip адресов. В этом случае, в критерии нужно добавить ключ –s(—src, —source), задающий ip адрес или подсеть источника соединения, например, таким правилом:
iptables -A INPUT -p tcp -s 94.41.174.122 --dport 22 -j ACCEPT
доступ на 22 порт будет разрешен только с ip адреса 94.41.174.122.
Частично разрешим icmp запросы, 3-х типов:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTiptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPTiptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT
Эти правила разрешают работу утилит ping, traceroute и позволяют работать механизму для определения MTU между двумя хостами.
Фильтр iptables по состоянию соединения
Для корректной работы потребуется создать правило, разрешающее уже установленные соединения:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Здесь в критерии используется ключ -m, для загрузки модуля state, который дает возможность определить текущее состояние ip пакета из возможных:
- NEW – относится к входящим ip пакетам, участвующим в установке соединения;
- ESTABLISHED и RELATED – относится к входящим ip пакетам, участвующим в уже установленных соединениях, или соединениях, инициированных из уже установленных(связанные соединения);
- INVALID — относится к входящим ip пакетам, если к ним не применимо ни одно из указанных выше состояний.
Задание политики iptables по умолчанию
Минимальный набор разрешающих правил для файрвола готов, осталось установить политику по умолчанию, запрещающую все входящие соединения, не соответствующие нашим правилам. Для этого в команде iptables служит ключ -P, устанавливает политику по умолчанию для заданной цепочки, в нашем случае:
iptables -P INPUT DROP
Внимание: прежде чем использовать эту команду, необходимо убедиться, что ваши текущие правила разрешают вам подключиться к серверу, иначе вы просто заблокируете себе доступ!Посмотрим на результатурующую таблицу правил iptables, добавим ключ -v, чтобы показать более подробный вывод:iptables -L -v
Включить логи iptables
Iptables позволяет записывать информацию о проходящих ip пакетах в системный журнал. Реализуется это с помощью специфичного действия LOG над соединением, после которого, ip пакет продолжает движение по цепочке нетронутым. Для примера, создадим правило, которое будет записывать в системный журнал все события соединений на порт 445 (tcp):
iptables -A INPUT -p tcp --dport 445 -j LOG --log-prefix "IN SMB DROP: "
здесь —log-prefix задает префикс для всех сообщений, логируемых нашим правилом. Это удобно, если у вас несколько разных правил логирования, или для дальнейшей программной обработки. Если теперь попробовать подключиться снаружи к нашему серверу на порт 445, например через telnet, в файле /var/log/messages появятся записи:
Разберем вывод:
IN SMB DROP
: префикс, который мы задали опцией —log-prefixIN=eth0
интерфейс, на который принят ip пакет, для исходящих соединений содержит пустое значениеOUT=
интерфейс, с которого отправлен ip пакет, для входящих соединений, содержит пустое значениеMAC=
соединенные вместе в следующем порядке: MAC-адрес назначения, MAC-адрес источника, EtherType — 08:00 соответствует IPv4.SRC=
ip адрес источника, от которого отправлен ip пакетDST=
ip адрес назначения, на который отправлен ip пакетLEN=
размер ip пакета в байтахSPT=
порт источника, от которого отправлен ip пакетDPT=
порт назначения, на который отправлен ip пакет
Сохранение и восстановление правил фильтрации iptables
В заключении, настроим автозагрузку правил, после перезагрузки сервера. Для этого должен быть установлен пакет iptables-services и активирован сервис. Установим пакет через yum:
yum install iptables-servicessystemctl enable iptables
Проверим статус службы iptables:
systemctl status iptables
Параметр автозагрузки установлен в enabled (включена), параметр active указывает, что служба запущена.
При загрузке сервис будет читать содержимое файла /etc/sysconfig/iptables, и восстанавливать сохраненные правила. Чтобы сохранить в него наши правила, воспользуемся командой:
iptables-save > /etc/sysconfig/iptables
Можно восстановить правила из файла командой:
iptables-restore < /etc/sysconfig/iptables
Теперь можно перезагрузить сервер, и убедиться, что правила файервола восстановились при загрузке.
В следующей статье мы покажем, как использовать iptables для создания NAT правил перенаправления трафика для шлюза-доступа на базе CentOS из / во внутренюю сеть организации.
Во всех операционных системах, основанных на базе ядра Linux, имеется встроенный межсетевой экран, осуществляющий контроль и фильтрацию входящего и исходящего трафика, исходя из заданных пользователем или платформой правил. В дистрибутиве CentOS 7 по умолчанию такую функцию выполняет утилита iptables, взаимодействуя со встроенным брандмауэром netfilter. Иногда системному администратору или менеджеру сети приходится настраивать работу этого компонента, прописывая соответствующие правила. В рамках сегодняшней статьи мы бы хотели поговорить об основах конфигурации iptables в упомянутой выше ОС.
Настраиваем iptables в CentOS 7
Сам инструмент доступен к работе сразу же после завершения инсталляции CentOS 7, но дополнительно потребуется установить некоторые сервисы, о чем мы и поговорим далее. В рассматриваемой платформе имеется еще один встроенный инструмент, выполняющий функцию фаервола под названием FirewallD. Для избежания конфликтов при дальнейшей работе рекомендуем отключить этот компонент. Развернутые инструкции по этой теме читайте в другом нашем материале по следующей ссылке.
Подробнее: Отключение firewallD в CentOS 7
Как известно, в системе могут применяться протоколы IPv4 и IPv6. Сегодня мы остановимся на примере IPv4, но если вы хотите осуществлять конфигурацию для другого протокола, потребуется вместо команды iptables в консоли использовать ip6tables.
Установка сервисов iptables
Первоочередно следует добавить в систему дополнительные компоненты рассматриваемой сегодня утилиты. Они помогут в настройке правил и других параметров. Загрузка осуществляется из официального хранилища, поэтому не отнимет много времени.
- Все дальнейшие действия будут производиться в классической консоли, поэтому запустите ее любым удобным методом.
За установку сервисов отвечает команда sudo yum install iptables-services
. Введите ее и нажмите на клавишу Enter.</li>
Подтвердите учетную запись суперпользователя, указав пароль от нее. Обратите внимание, что при запросах sudo вводимые символы в строке никогда не отображаются.</li>
Будет предложено добавить в систему один пакет, подтвердите это действие, выбрав вариант y.</li>
По завершении инсталляции проверьте текущую версию инструмента: sudo iptables --version
.</li>
Результат появится в новой строке.</li>
</ol>
Теперь ОС полностью готова для дальнейшей настройки межсетевого экрана через утилиту iptables. Мы предлагаем ознакомиться с конфигурацией по пунктам, начав с управления сервисами.
Остановка и запуск сервисов iptables
Управление режимом работы iptables требуется в тех случаях, когда нужно проверить действие определенных правил или просто выполнить перезапуск компонента. Делается это при помощи встроенных команд.
- Введите
sudo service iptables stop
и нажмите на клавишу Enter, чтобы остановить сервисы.
Для подтверждения этой процедуры укажите пароль суперпользователя.</li>При успешном выполнении процесса отобразится новая строка, свидетельствующая о внесении изменений в конфигурационный файл.</li>Запуск сервисов производится практически так же, только строка обретает вид sudo service iptables start
.</li></ol>
Подобная перезагрузка, запуск или остановка утилиты доступна в любой момент, не забудьте только вернуть обратное значение, когда это будет востребовано.
Просмотр и удаление правил
Как уже было сказано ранее, управление межсетевым экраном производится путем ручного или автоматического добавления правил. Например, некоторые дополнительные приложения могут обращаться к инструменту, изменяя определенные политики. Однако большинство подобных действий все же делается вручную. Просмотр списка всех текущих правил доступен через команду sudo iptables -L
.
В отобразившемся результате будет информация по трем цепочкам: «INPUT», «OUTPUT» и «FORWARD» — входящий, исходящий и пересылаемый трафик соответственно.
Определить статус всех цепочек можно, введя sudo iptables -S
.
Если увиденные правила вас не устраивают, они достаточно просто удаляются. Весь список очищается так: sudo iptables -F
. После активации правила будут стерты абсолютно для всех трех цепей.
Когда необходимо затронуть только политики из какой-то одной цепи, к строке добавляется дополнительный аргумент:
sudo iptables -F INPUT
sudo iptables -F OUTPUT
sudo iptables -F FORWARD
Отсутствие всех правил означает, что сейчас не применяется никаких настроек фильтрации трафика ни в одну из сторон. Далее системный администратор уже самостоятельно задает новые параметры, используя всю ту же консоль, команду и различные аргументы.
Прием и сбрасывание трафика в цепях
Каждая цепь настраивается отдельно для приема или блокирования трафика. Выставив определенное значение, можно добиться того, что, например, весь входящий трафик будет блокироваться. Для этого команда должна быть sudo iptables --policy INPUT DROP
, где INPUT — название цепи, а DROP — значение сброса.
Точно такие же параметры задаются и для других цепей, например, sudo iptables --policy OUTPUT DROP
. Если же необходимо выставить значение на прием трафика, тогда DROP изменяется на ACCEPT и получается sudo iptables --policy INPUT ACCEPT
.
Разрешение и блокировка портов
Как известно, все сетевые приложения и процессы работают через определенный порт. Путем блокировки или разрешения определенных адресов можно контролировать доступ всех сетевых целей. Давайте разберем проброс порта на примере 80. В «Терминале» будет достаточно ввести команду sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
, где -А — добавление нового правила, INPUT — указание цепи, -P — определение протокола, в этом случае TCP, а —dport — порт назначения.
Точно такая же команда относится и к порту 22, который используется сервисом SSH: sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
.
Для блокирования указанного порта применяется строка точно такого же вида, только в конце ACCEPT изменяется на DROP. В итоге получается, например, sudo iptables -A INPUT -p tcp --dport 2450 -j DROP
.
Все эти правила заносятся в конфигурационный файл и вы можете просмотреть их в любой момент. Напоминаем, осуществляется это через sudo iptables -L
. Если вместе с портом необходимо разрешить еще и сетевой IP-адрес, строка немного видоизменяется — после TPC добавляется -s и сам адрес. sudo iptables -A INPUT -p tcp -s 12.12.12.12/32 --dport 22 -j ACCEPT
, где 12.12.12.12/32 — необходимый IP-адрес.
Блокирование происходит по тому же принципу, меняя в конце значение ACCEPT на DROP. Тогда получается, например, sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22 -j DROP
.
Блокирование ICMP
ICMP (Internet Control Message Protocol) — протокол, который входит в состав TCP/IP и задействован для передачи сообщений об ошибках и экстренных ситуациях при работе с трафиком. Например, когда запрашиваемый сервер недоступен, именно этот инструмент выполняет сервисные функции. Утилита iptables позволяет заблокировать его через брандмауэр, а сделать это можно командой sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
. Она произведет блокировку запросов от вашего и к вашему серверу.
Входящие запросы блокируются немного иначе. Тогда нужно ввести sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP
. После активации данных правил сервер не будет отвечать на ping-запросы.
Предотвращение несанкционированных действий на сервере
Иногда серверы подвергаются DDoS атакам или другим несанкционированным действиям со стороны злоумышленников. Правильная настройка межсетевого экрана позволит обезопасить себя от подобного рода взломов. Для начала мы рекомендуем задать такие правила:
- Пропишите в консоли
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
, где —limit 20/minute — ограничение на частоту положительных результатов. Единицу измерения вы можете указывать самостоятельно, например,/second, /minute, /hour, /day
. —limit-burst number — ограничение на число пропускаемых пакетов. Все значения выставляются индивидуально по предпочтениям администратора. - Далее можно запретить сканирование открытых портов, чтобы убрать одну из возможных причин взлома. Введите первую команду
sudo iptables -N block-scan
. - Затем укажите
sudo iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST -m limit —limit 1/s -j RETURN
. - Последняя третья команда имеет вид:
sudo iptables -A block-scan -j DROP
. Выражение block-scan в данных случаях — название используемой цепи.
Показанные сегодня настройки являются лишь основой работы в инструменте управления межсетевым экраном. В официальной документации утилиты вы найдете описание всех доступных аргументов и опций и сможете настроить брандмауэр конкретно под свои запросы. Выше были рассмотрены стандартные правила безопасности, которые применяются чаще всего и в большинстве случаев обязательны. Мы рады, что смогли помочь Вам в решении проблемы.Опишите, что у вас не получилось. Наши специалисты постараются ответить максимально быстро.
Помогла ли вам эта статья?
Всем доброго времени суток и прочих разностей.
Продолжу, пожалуй, тему серверов, авось кому-то пригодится зачем-то куда-то где-то. Сегодня кратенько хочется поговорить про IPTables, чтобы создать буквально самую простейшую базовую фильтрацию от различного типа атак, да и просто прикрыть порты, чтобы не брутфорсили и всё такое.
Кому-то сие может пригодится для небольшой настройки своего, допустим, VPS‘а (если он у Вас есть), а кому-то просто поможет обезопасить систему от лишней ереси.. И хотя конечно мануал будет краткий и не охватит все аспекты, но в качестве базы подойдет вполне.
Рассказывать буду на примере CentOS, но, в общем-то, оно применимо и для других систем.
Содержание:
Базовая защита с помощью IPTables
IPTables — простой фаервол, установленный на большинстве дистрибутивов Linux. Мануалы Linux‘ов гласят, что IPT — это инструмент управления пакетными фильтрами IPv4 и NAT, то есть, это инструмент фильтрации и блокировки интернет-трафика. Короче есть почти везде и используется частенько.
Давайте приступим. Все команды указаны для SSH, но их результирующую можно в общем-то добавлять ручками в сам список iptables непосредственно через редактор. Смотрите как Вам удобнее, по мне проще SSH‘шем.
Для начала порой есть смысл выполнить:
iptables -F
Сие сбрасывает правила фаерволла как таковые.
Можно не выполнять, если IPTables уже был кем-то настроен и Вы боитесь потерять сделанные настройки. К слову, при определенных правилах маршрутов может сделать сервер недоступным и придется обращаться к хостеру для отключения IPTables. В общем можно, но с осторожностью.
Базовые правила фильтрации ереси (сначала идет команда, потом мой комментарий, комментарий забивать в консоль не надо):
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP #блокирует нулевые пакеты
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP #сброс пакетов XMAS
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #защита от syn-flood
Базовая защита SSH (на этом примере можно защищать FTP и другие порты):
-A INPUT -s ВАШ_IP -p tcp -m tcp --dport 22 -j ACCEPT #разрешает доступ по SSH (при условии, что порт 22-ой) с ВАШ_IP, где ВАШ_IP - это IP-адрес с которого нужен доступ (строку можно повторять нужное число раз, перечисляя разные IP-шники)
-A INPUT -p tcp --dport 22 -j DROP #запрещает доступ по SSH со всех IP, кроме указанных в строке выше
Разрешаем порты для нужных сервисов (на примере нескольких базовых):
iptables -A INPUT -i lo -j ACCEPT #разрешает трафик на локальный интерфейс. localhost часто используется для размещения, например, базы данных, к которой подключаются веб-сайт и почтовый сервер, т.е таким образом, сервер имеет доступ к базе данных, но взломать её через интернет сложно.
iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT #разрешает трафик на 80-ый и 443-ий порты, т.е веб-сервер, т.е http и https
Почта (если сервер не выступает как почтовый, то можно не разрешать):
iptables -A INPUT -p tcp -m tcp --dport 25 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 465 -j ACCEPT #разрешает smtp-трафик
iptables -A INPUT -p tcp -m tcp --dport 110 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 995 -j ACCEPT #разрешает pop-трафик
iptables -A INPUT -p tcp -m tcp --dport 143 -j ACCEPT iptables -A INPUT -p tcp -m tcp --dport 993 -j ACCEPT #разрешает imap-трафик
Разрешаем исходящие соединения, в целях, например, использования ping и других внутренних приложений:
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #если не собираетесь использовать, то можно не указывать, но тогда есть вероятность того, что не будут работать, скажем, обновления из интернета
По аналогии разрешите доступ ко всем нужным портам, в частности, со своего IP-адреса. Порты могут быть любыми, в частности, если на сервере есть панель, то не забудьте разрешить доступ к её порту, а то не попадете туда через веб-морду.
Проделав всё необходимое, собственно, остается лишь:
iptables -P OUTPUT ACCEPT iptables -P INPUT DROP #закрываем остальные порты наглухо и разрешаем исходящие соединения c сервера
iptables -L -n #проверяем заданные правила, мало ли что-то забыли
iptables-save | sudo tee /etc/sysconfig/iptables #сохраняем изменения
service iptables restart #перезагружаем iptables для принятия изменений
Совсем базово как-то так. Думаю, что при включении банальной логики, у Вас получится настроить необходимый минимум
Послесловие
Такие дела. Пользуйтесь на здоровье.
Если есть вопросы, дополнения и всё такое прочее, то то велком в комментарии.
Подписка:Используемые источники:
- https://winitpro.ru/index.php/2019/08/05/nastrojka-fajrvola-iptables/
- https://lumpics.ru/configuring-iptables-on-centos-7/
- https://sonikelf.ru/pervichnaya-nastrojka-iptables-dlya-veb-servera-na-primere-centos/