Настройка Linux-файрвола с помощью iptables в CentOS / RHEL 7
13.12.2019
Андрей
CentOS, Linux
Один комментарий
В этой статье мы покажем, как управлять файерволом 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 firewalld
systemctl disable firewalld
Повторно проверяем статус:

Теперь вывод команды показывает disabled для автозагруки (выключена), и inactive означает, что служба выключена.
Синтаксис и правила iptables в CentOS/Red Hat
Iptables – это утилита, с помощью которой настраиваются правила для файрвола в Linux.
Iptables группирует правила файрвола в таблицах, основные это:
- Таблица filter – используется для фильтрации трафика, то есть разрешения и запрещения соединений
- Таблица nat – используется для преобразования адресов (NAT)
- Таблица mangle – прочие модификации заголовков ip пакетов.
Для начала проверим, что iptables установлен в системе(должен быть умолчанию):

Вывод команды показывает, что текущая установленная версия iptables – 1.4.21.
Работа с iptables в командной строке требует root привилегий, поэтому далее будем работать под пользователем root.
Чтобы вывести текущие правила, выполним команду:
iptables [-t таблица] -L [цепочка] [параметры]
Например, результат команды 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.
Допустимо указывать диапазон портов через двоеточие, например
Если нам известны 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 ACCEPT
iptables -A INPUT -p icmp —icmp-type destination-unreachable -j ACCEPT
iptables -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
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-prefix
- IN=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-services
systemctl enable iptables
Проверим статус службы iptables:
systemctl status iptables

Параметр автозагрузки установлен в enabled (включена), параметр active указывает, что служба запущена.
При загрузке сервис будет читать содержимое файла /etc/sysconfig/iptables, и восстанавливать сохраненные правила. Чтобы сохранить в него наши правила, воспользуемся командой:
Можно восстановить правила из файла командой:
Теперь можно перезагрузить сервер, и убедиться, что правила файервола восстановились при загрузке.
В следующей статье мы покажем, как использовать iptables для создания NAT правил перенаправления трафика для шлюза-доступа на базе CentOS из / во внутренюю сеть организации.
Предыдущая статья Следующая статья
Записки IT специалиста
Основы iptables для начинающих. Как сохранить правила и восстановить их при загрузке
- Автор: Уваров А.С.
- 05.12.2021
Для тех, кто только начинает изучать iptables неприятной неожиданностью оказывается тот факт, что правила брандмауэра не сохраняются и не восстанавливаются при перезагрузке системы. Фактически это означает полностью открытый брандмауэр и такое положение дел нас, естественно, не устраивает. К счастью, в Linux существует несколько способов сохранения единожды введенных правил iptables, поэтому следует изучить их и выбрать наиболее подходящий для вашей конфигурации. А о всех плюсах и минусах мы расскажем в данной статье.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
В свое время один из основателей UNIХ Деннис Ритчи сказал: «UNIX прост. Но надо быть гением, чтобы понять его простоту.» Все это в полной мере можно применить и к преемнику UNIX-систем — Linux и иногда эта простота ставит в тупик. Хорошим примером здесь является iptables — простой и мощный брандмауэр, уже не первый год, стоящий на страже сетевых рубежей системы. И когда выясняется, что он не умеет сохранять и восстанавливать правила, то многие испытывают весьма противоречивые ощущения.
Вопреки распространенному заблуждению iptables не является брандмауэром, а предоставляет удобный интерфейс к netfilter, который является настоящим брандмауэром Linux-систем, его задача — интерпретировать команды пользователя на более низкие уровни и вывести информацию оттуда в удобном для восприятия варианте. Единственный способ взаимодействия с iptables — это интерфейс командной строки — CLI. Мы можем создавать, изменять, удалять правила, а также получать информацию о состоянии брандмауэра, но в любом случае все взаимодействие строится по форме запрос — ответ. Реальную работу выполняет спрятанный далеко внутри системы netfilter, а iptables только лишь позволяет удобно общаться с ним.
Понимание этого во многом проливает свет на сложившуюся ситуацию, iptables — всего лишь интерфейс и своих настроек у него быть не может, но именно он позволяет передать правила сетевого взаимодействия в netfilter и получать от него удобочитаемые ответы и именно этим его свойством мы и воспользуемся.
Существует несколько способов сохранить введенные нами в iptables правила, а затем и восстановить их при загрузке системы. Разберем их подробнее.
Скрипты
Самый старый, но не потерявший эффективности способ. Если единственная возможность взаимодействия с iptables — это интерфейс командной строки, то скрипт — самый первый способ автоматизации, если мы не хотим постоянно повторять одни и те же действия вручную.
Скрипт для настройки iptables мы можем расположить где угодно, но лучше следовать стандартным расположениям Linux и разместить его в /etc. Создадим для этого отдельную директорию iptables, создадим в ней файл скрипта и сделаем его исполняемым:
Теперь можем открыть его любым доступным редактором и внести минимальную конфигурацию брандмауэра, разрешающую только подключения по SSH:
Здесь следует обратить ваше внимание на самую первую секцию — сброс настроек, в приведенном примере сброшены будут только настройки таблицы filter и если вы используете другие таблицы, то их также нужно будет сбросить, так для nat добавьте:
А для mangle:
Для чего это делается? Смысл в том, что данный скрипт может быть запущен как вручную, так и при перезапуске сетевых служб, а команда iptables -A просто добавляет правило в конец указанной цепочки и если не выполнять предварительной очистки, то итоговые правила могут стать бесконечно далеки от того, что задумал администратор.
Хорошо, но как теперь запускать данный скрипт? Для систем использующих ifupdown перейдем в /etc/network/interfaces и добавим в конце секции с нужным сетевым адаптером или вообще в самом конце файла:
Данное правило выполнит указанный нами скрипт перед инициализацией сетевого интерфейса.
Все изменения в конфигурацию брандмауэра следует вносить в указанный скрипт, а для их применения достаточно выполнить:
или перезагрузить систему.
Просмотреть текущее состояние брандмауэра можно командой:
Ключ -v выводит дополнительную информацию и счетчики, а -n отвечает за вывод IP-адресов и портов в виде чисел, а не DNS-адресов и имен служб.
![]()
Внимательный читатель заметит, что вывод команды показывает нам только таблицу filter и это действительно так. Как мы помним, filter — таблица по умолчанию и используется если мы явно не задали таблицу, чтобы просмотреть, скажем, таблицу nat, выполните:
Где ключ -t позволяет указать интересующую таблицу.
iptables-save / iptables-restore
Это штатная утилита, выполняющая ту же самую задачу: сохранить правила iptables в файл и потом загрузить их оттуда. Использование предельно простое, чтобы сохранить правила используйте:
Результатом выполнения данной команды будет текстовый файл с набором всех используемых правил.
![]()
Сначала идет имя таблицы, в нашем случае правила заданы только для filter, затем политики по умолчанию для цепочек (везде ACCEPT), за которыми следуют сами правила. Обратите внимание, что синтаксис записей несколько другой, если в скрипте мы писали:
то в файле просто:
Потому что скрипт сначала вызывал iptables, а потом уже передавал ему команду, в нашем же случае вызывать iptables нет необходимости.
Впоследствии данный файл можно редактировать, добавляя в него дополнительные правила, также можно делать это интерактивно, через командный CLI-интерфейс. С этим будет связан один тонкий момент, и мы вернемся к нему позже.
Для восстановления следует использовать:
Куда прописать эту команду? Можно точно также в /etc/network/interfaces, в конце файла добавляем:
А теперь зададимся вопросом: чтобы сохранить правила iptables их нужно предварительно ввести. Да, это можно сделать либо вручную, выполнив указанные в скрипте команды, либо выполнив сам скрипт, второе удобнее, особенно если у вас сложная конфигурация брандмауэра. Этот же способ позволяет просто и удобно перейти от скриптов к iptables-restore: загружаем систему, сохраняем правила через iptables-save и заменяем вызов скрипта на iptables-restore.
В некоторых материалах в сети также рекомендуют добавить в /etc/network/interfaces
На первый взгляд — вполне грамотное решение, но не рекомендуем этого делать не подумав. Почему? Редко кто управляет брандмауэром интерактивно: добавляя, удаляя или изменяя записи через командную строку, потому что более удобно и наглядно это можно сделать, внося изменения непосредственно в файл. Однако если вы после этого выключите или перезагрузите систему, то все ваши изменения будут перезаписаны текущим состоянием брандмауэра и будут потеряны.
Поэтому лучше ограничиться только iptables-restore, а если вы все-таки внесли изменения интерактивно, то можно сразу после этого вручную выполнить iptables-save.
iptables-persistent
Время не стоит на месте, все течет, все меняется. На смену старому доброму ifupdown приходят новые системы: NetworkManager, netplan, systemd-networkd и прописывать вызов скриптов или iptables-restore в их конфигурацию становится проблематичным занятием, если вообще возможным. Но и разработчики тоже держат руку на пульсе, в Debian и Ubuntu появился новый пакет — iptables-persistent, который позволяет сохранять и автоматически загружать правила брандмауэра, не оглядываясь на используемую систему инициализации сети.
Установить его очень просто:
В процессе установки будет предложено сохранить текущие правила iptables, поэтому очень желательно, чтобы они к этому времени существовали. Внести их можно как интерактивно, так и с помощью скрипта.
![]()
Одновременно с этим будут сохранены правила для IPv6 и в итоге в директории /etc/iptables у вас будет два набора правил для четвертой и шестой версии протоколов. Синтаксис файла ничем не отличается от того, что создает iptables-save и точно также его можно редактировать, внося новые правила.
Также в системе появляется новая служба — netfilter-persistent, которая позволяет удобно управлять брандмауэром, так если вы внесли изменения в файл с правилами и хотите их применить, то выполните:
Для сохранения текущей конфигурации отдайте команду:
А если вам надо полностью очистить конфигурацию брандмауэра, то наберите:
Это удобно если вам нужно проверить, не является ли брандмауэр причиной каких-либо проблем, быстро сбрасываем конфигурацию, проверяем и загружаем ее заново.
Заключение
Какой из трех предложенных вариантов является наиболее предпочтительным? Если мы говорим о современных системах, то это iptables-persistent, который позволяет полностью автоматизировать процесс и вообще более не беспокоиться о правилах брандмауэра. Но это решение доступно только пользователям Debian или Ubuntu.
Также не стоит списывать со счетов скрипты или iptables-save / iptables-restore, эти методы продолжают работать и делают это просто и надежно. В любом случае помните, что Linux предоставляет множество путей решений одной и той же задачи и выбирайте решение исходя из собственной ситуации, требований и имеющихся знаний, и опыта.
Научиться настраивать MikroTik с нуля или систематизировать уже имеющиеся знания можно на углубленном курсе по администрированию MikroTik. Автор курса, сертифицированный тренер MikroTik Дмитрий Скоромнов, лично проверяет лабораторные работы и контролирует прогресс каждого своего студента. В три раза больше информации, чем в вендорской программе MTCNA, более 20 часов практики и доступ навсегда.
Дополнительные материалы:
Помогла статья? Поддержи автора и новые статьи будут выходить чаще:
![]()
Или подпишись на наш Телеграм-канал: ![]()
Перенос правил iptables на новый сервер
При смене сервера часто возникает необходимость перенести правила iptables. Данное руководство продемонстрирует простой способ переноса активных правил фаервола с одного сервера на другой.
Требования
Для выполнения руководства нужно иметь два сервера. Исходный сервер, на котором находятся правила фаервола, называется в руководстве сервером A; целевой сервер – B.
Также нужно иметь права sudo.
Просмотр правил iptables
Прежде чем приступить к переносу правил брандмауэра, нужно просмотреть их. Для этого выполните следующую команду на сервере A:
sudo iptables -S
Example output:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -m conntrack —ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp —dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 80 -j ACCEPT
-A INPUT -s 15.15.15.51/32 -j DROP
Теперь нужно перенести эти правила на другой сервер.
Экспорт правил Iptables
Команда iptables-save сохранит текущие правила брандмауэра в stdout, после чего его можно будет сохранить в файл.
Используйте эту команду на сервере А, чтобы экспортировать правила в файл iptables-export.
sudo iptables-save > iptables-export
После этого в домашнем каталоге появится файл iptables-export, при помощи которого можно перенести правила фаервола на другой сервер.
Просмотр файла (опционально)
Проверьте, содержит ли новый файл все необходимые данные:
cat iptables-export
# Generated by iptables-save v1.4.21 on Tue Sep 1 17:32:29 2015
*filter
:INPUT ACCEPT [135:10578] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [8364:1557108] -A INPUT -m conntrack —ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp —dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp —dport 80 -j ACCEPT
-A INPUT -s 15.15.15.51/32 -j DROP
COMMIT
# Completed on Tue Sep 1 17:32:29 2015
Как видите, данный файл содержит все текущие правила iptables, и теперь можно скопировать этот файл на целевой сервер.
Перенос правил на целевой сервер
Проще всего для этого использовать scp или же просто скопировать и вставить содержимое файла в новый файл на целевом сервере.
Ниже показано, как при помощи scp скопировать файл по сети в каталог /tmp.
Итак, запустите команду scp на сервере А, указав логин и IP-адрес сервера.
scp iptables-export user@server_b_ip_address:/tmp
Пройдя авторизацию, файл будет скопирован в каталог /tmp на сервер В.
Примечание: Содержимое каталога /tmp будет удалено при перезагрузке системы. Не забудьте переместить файл в более надёжный каталог.
Импорт правил
Теперь можно загрузить перенесённые правила.
Примечание: В случае необходимости сейчас можно обновить их, добавив данные нового сервера; отредактируйте файл /tmp/iptables-export, внеся всё необходимое.
Когда правила будут соответствовать требованиям данного сервера, загрузите их из файла iptables-export при помощи команды iptables-restore.
На сервере В запустите:
sudo iptables-restore < /tmp/iptables-export
Чтобы убедиться, что правила загружены успешно, используйте:
sudo iptables -S
Сохранение правил
Несохранённые правила фаервола действительны только в течение одной сессии; чтобы сделать набор правил постоянным, нужно его сохранить. Убедитесь, что вы на сервере В, и следуйте соответствующему разделу.
Сохранение правил в Ubuntu
Для сохранения правил брандмауэра система Ubuntu предлагает пакет iptables-persistent. Чтобы установить этот пакет, введите команду:
sudo apt-get install iptables-persistent
Во время установки программа предложит сохранить текущие правила iptables. Выберите yes.
В дальнейшем для сохранения новых или обновлённых правил используйте команду:
sudo invoke-rc.d iptables-persistent save
Сохранение правил в CentOS 6 и 7
По умолчанию системы CentOS 6 и 7 используют фаервол FirewallD; чтобы сохранить правила iptables, используйте:
sudo service iptables save
Это сохранит текущие правила iptables в файл /etc/sysconfig/iptables, который загрузится после перезапуска системы.
Iptables в CentOS 7 (Linux). Что это. Настройка
Для управления им (включение/отключение, перезагрузка, добавление в автозагрузку и др.), нужно установить пакет:
Теперь можно включить и добавить в автозагрузку:
Редактирование iptables. Внесение правил
Для внесения правил можно либо изменять непосредственно сам оригинальный файл iptables, либо создать для него отдельный новый файл — скрипт, который будет ДОПИСЫВАТЬ в него нужные правила. Таким образом удобно переносить свои настройки с сервера на сервер.
Способ 1. Редактирование самого файла (не рекомендую)
В CentOS 7 конфиг фаервола iptables находится в папке /etc/sysconfig/
Отредактировать его можно командой:
И добавляем правила, которые нам нужны.
Например, для nginx, который работает на 80 порту, можно добавить правило:
Способ 2. Создание доп. скрипта (рекомендую)
Лучше создать новый файл-скрипт и редактировать именно его, чтобы все наши настройки были в этом одном файле без всякого лишнего, того, что по дефолту уже стоит в самом файле iptables.
Создаем его прямо в папке /etc/ с названием iptables_my выполнив команду:
где .sh — это расширение файла, указывающее на то, что это скрипт.
Важно! После каждого редактирования этого скрипта, его нужно запускать каждый раз, чтобы он выполнился и ПЕРЕЗАПИСАЛ изменения.
Вносим нужные правила (о них чуть ниже).
Делаем файл исполняемым командой:
Проверяем, что скрипт дописал правила и они работают:
Для наглядности лучше запустить эту команду до запуска скрипта и после и потом сравнить выдачу в консоли, какие изменения вступили в силу.
Содержание файла-скрипта для iptables
Открываем порт для NGINX (как пример)
В нашем скрипте находим такую строку:
И по аналогии вставляем ниже нее нужную нам строчку:
После этого снова запускаем скрипт, чтобы он перезаписал правила!