Автозапуск правил iptables debian

Обновлено: 04.07.2024

Продолжаем наше знакомство с фаерволом Netfilter & Iptables. Во второй части статьи речь пойдет об управлении правилами iptables. Мы научимся добавлять правила в межсетевой экран, сохранять их и восстанавливать. Рассмотрим утилиты для управления правилами и напишем свой скрипт управления.

Отключение Selinux и Firewalld в CentOS/RHEL системах

Если вы хотите начать использовать iptables в CentOS или других Red Hat производных системах, то перед настройкой необходимо отключить Selinux и firewalld.

Для отключения selinux отредактируем файл /etc/sysconfig/selinux.

Firewalld - надстройка над iptables, играющая роль брандмауэра, применяется в RHEL системах по умолчанию. Так как управлять фаерволом мы будем при помощи собственных правил, то firewalld необходимо отключить.

Добавление и сохранение правил iptables

Для примера добавим какое-нибудь безобидное правило, чтобы не затрагивать подключение. Например запретим прохождение транзитных пакетов.

Проверим текущие настройки межсетевого экрана командой iptables -L -n -v.

В цепочке FORWARD действием по умолчанию значится DROP, следовательно правило работает.

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

Изменения в правилах сохраняются/записываются посредством встроенной утилиты iptables-save. Необходимо создать файл в который будут записываться правила.

Так-как я нахожусь в системе под root, то команда создаст файл в домашней директории root-пользователя /root/iptables_rules. Для создания файла в другом каталоге, команда должна выглядеть так:

Воспользуемся iptables-save и сохраним изменения, записав их в созданный файл iptables_rules.

Cодержимое файла iptables_rules, в который были записаны правила, будет выглядеть так:

Утилита iptables-save считала текущие настройки правил из оперативной памяти и записала их в указанный файл, в форме понятной для пользователя, то есть в форме правил.

Политики по умолчанию записываются после знака двоеточия (:).

  • iptables -P FORWARD DROP будет записано как :FORWARD DROP

Обычные правила записываются после политик по умолчанию, без слова iptables. Например нужно запретить любые подключения с машины под адресом 192.168.1.100, добавляем нужное правило (iptables -A INPUT -s 192.168.1.100 -j DROP) в файл iptables_rules.

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

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

Применение и восстановление правил iptables

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

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

Для восстановления правил после перезагрузки или включения системы необходимо применять iptables-restore. Чтобы не проделывать процедуру восстановления правил каждый раз, правила можно добавить в автозагрузку.

CentOS

В CentOS добавить правила в автозагрузку можно посредством правки файла rc.local.

Теперь правила будут применяться в фаерволе при запуске системы. Для того чтобы запретить загрузку через rc.local, уберите добавленную строку или закомментируйте ее.

Debian & Ubuntu

В Debian & Ubuntu все работает также, только rc.local расположен в каталоге /etc, загрузку можно прописать здесь. Можно сделать иначе, в Debian & Ubuntu запуск правил удобнее прописать в конф. файле сетевых интерфейсов /etc/network/interfaces.

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

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

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

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

iptables-services в CentOS/RHEL системах

В CentOS существует утилита управления правилами iptables, делающая все вышеописанное, она создает файл для записи, сохраняет изменения, загружает правила при запуске системы. Эта утилита называется iptables-services.

После установки в директории /etc/sysconfig появляются файлы iptables и ip6tables, в эти файлы производится запись правил. В файл iptables производится запись правил для протокола IPv4, в файл ip6tables для протокола IPv6.

Конфигурационный файл находится в /etc/sysconfig/iptables-config. Здесь нас интересуют два параметра:

  • IPTABLES_SAVE_ON_STOP="no" - сохранение текущих правил при остановке демона iptables, по умолчанию отключено.
  • IPTABLES_SAVE_ON_RESTART="no" - сохранение текущих правил при перезапуске/перезагрузке системы, по умолчанию отключено.

Включим сохранение текущих правил, нужно заменить значения с "no" на "yes". Правила будут сохраняться автоматически в файл /etc/sysconfig/iptables, при перезагрузке системы/службы iptables. Также правила можно сохранять командой restart.

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

iptables-persistent в Debian & Ubuntu

Почти то же, что и iptables-services, только немного неудобнее.

Во время установки будет задано два вопроса, на которые следует ответить положительно.

iptables debian ubuntu

После установки в каталоге /etc/iptables появятся файлы rules.v4 и rules.v6. В эти файлы будут записываться правила межсетевого экрана.

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

Команда записывает изменения правил в файл /etc/iptables/rules.v4, в процессе выполнения запрашивается подтверждение. Если после добавления нового правила вы не выполните эту команду, то оно будет работать только до первой перезагрузки или отключения системы.

Автоматически сохранять текущие правила при перезагрузке iptables-persistent не может.

Для подстраховки можно воспользоваться рассмотренным выше способом и добавить в файл /etc/network/interfaces, команду для автоматического сохранения правил.

Также после установки пакета появляется демон netfilter-persistent при помощи которого можно управлять правилами iptables.

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

Выполняться они могут через команду - service

  • service netfilter-persistent start - запустить сервис
  • service netfilter-persistent stop - остановить сервис
  • service netfilter-persistent restart - перезапустить сервис
  • service netfilter-persistent reload - восстановить правила из файлов rules.v4/rules.v6
  • service netfilter-persistent save - сохранить правила в файлы rules.v4/rules.v6
  • service netfilter-persistent flush - полностью очищает текущие правила, все становится открыто, но не очищает файл с записанными правилами. Поэтому после перезагрузки, правила из файла считаются и загрузятся снова, если его предварительно не очистить.

Таким образом для сохранения правил можно пользоваться как dpkg-reconfigure так и service netfilter-persistent save, например.

Скрипт для правил iptables

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

Перед написанием скрипта, установите iptables-services в CentOS, iptables-persistent в Debian. На самом деле можно обойтись и без них, но с ними немного удобнее.

Создаем скрипт, по привычке я называю его ipt.sh, скрипт можно назвать как угодно, например myname.sh, где myname это имя скрипта.

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

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

Примечание: обязательно смените имя сетевого интерфейса ens3 на свое (eth0 или enp0s3) в правиле разрешающем выходной трафик.

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

Если вы пишете скрипт в CentOS, то указываем /etc/sysconfig/iptables, если в Debian или Ubuntu, то /etc/iptables/rules.v4. Именно поэтому в начале я говорил, что должны стоять iptables-services и iptables-persistent, соответственно.

Основная часть скрипта готова. В конец скрипта я еще дописываю какую-нибудь фразу, чтобы знать что скрипт выполнился, например - "Правила обновлены!".

В конечном виде скрипт выглядит так.

Скрипт написан. Теперь его надо сделать исполняемым.

После чего его необходимо выполнить.

Если после выполнения скрипта проверить состояние фаервола, можно увидеть следующее.

Межсетевой экран в порядке, правила применены и работают. А что с файлом для сохранения?

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

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

Блог про Linux, Bash и другие информационные технологии

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

Команда iptables-save выдает на стандартный вывод действующие в данный момент правила iptables, поэтому для сохранения их в файл надо использовать перенаправление потоков:

Команда iptables-restore делает, как вы уже догадались, обратное. То есть восстанавливает правила iptables. Работает она тоже со стандартными потоками, поэтому загрузка правил будет выглядеть так:

А теперь давайте более подробно посмотрим, как же, собственно, организовать загрузку правил автоматически.

Способ 1. Простой способ.

Самый простой способ загрузки таблиц - это вызывать загрузку после поднятия основного сетевого интерфейса при помощи параметра post-up, размещенного в файле /etc/network/interfaces

Что для этого потребуется? В первую очередь нам потребуется директория, в которой будут храниться файлы с таблицами. В соответствии со стандартом FHS, это будет /etc/iptables/, в ней мы будем хранить файлы с правилами, полученными при помощи iptables-save. Перед настройкой правил сначала сбросим содержимое правил по умолчанию:

Теперь посмотрим, что у нас получилось:

У вас должны быть чистые списки правил. Это состояние желательно сохранить на случай необходимости сброса правил.

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

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

Теперь делаем еще одно действие, которое нам позволит не переписывать название файла с правилами для загрузки. Создаем символическую ссылку на файл, в который мы только что сохранили правила. Пусть это будет файл iptables-20130904-223007, тогда делаем так:

И последнее, что надо сделать - изменить файл /etc/network/interfaces, дописав одну строчку. Должно получиться примерно следующее:

И после этого сохраняем.

В общем, вот и всё. Теперь после поднятия интерфейса правила iptables будут загружены автоматически. Какие у этого способа есть минусы? Если кто-нибудь изменит файл /etc/network/interfaces, например, какая-нибудь программа-менеджер сети, то строчка с загрузкой правил может потеряться. Не факт, конечно, но вероятность есть. Второе - если у вас несколько сетевых интерфейсов, то вам надо либо вешать на событие post-up каждого интерфейса, либо точно знать, что выбранный вами интерфейс точно поднимается. Вариация этого способа - размещение скрипта загрузки правил в директории /etc/network/. В таком случае По соответствующему событию правила будут загружаться автоматически.

Способ 2. Совсем простой способ.

Способ 3. Самый сложный, но и самый интересный с моей точки зрения.

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

Начнем с того, что создадим наш скрипт и поместим его в директорию /etc/init.d, где у нас хранятся скрипты для других сервисов.

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

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

У нас уже есть обработка параметров и тела всех функций, осталось только написать внутренности этих функций. Начнем со старта, напишем содержимое функции do_start:

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

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

Теперь мы можем просмотреть список файлов с правилами и сказать, какой из этих файлов является файлом по умолчанию. Это нам необходимо для того, чтобы в дальнейшем можно было указывать, какой файл с правилами должен быть по умолчанию. Следующая функция - do_makedefault(). Ее задача - сделать некоторый файл с правилами файлом по умолчанию, чтобы он загружался автоматически при старте нашего скрипта. Поскольку файл, который у нас загружается, всегда будет иметь одно и то же название, он всегда будет просто символической ссылкой, а указывать эта ссылка будет на разные файлы. В этой функции у нас будет использоваться еще один параметр скрипта, поэтому добавим значение $2 в вызов функции в структуре case. Должно получиться так:

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

Вот, собственно, сам скрипт почти закончен. Осталось сделать еще одну малость - автоматическое создание директорий, в которых будут храниться правила, если их не существует, и, если файл /etc/iptables/iptables.default не существует, то сбросим правила и политики и создадим файл iptables.clean, после чего создадим символическую ссылку на него с названием iptables.default. Для этого напишем отдельную функцию do_init():

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

Осталось теперь включить получившийся скрипт в автозапуск:

Всё. Теперь правила будут загружаться каждый раз после загрузки, после выполнения скрипта networking. Если сеть стартовать при использовании LSBInit не будет, то правила фаервола загружаться тоже не будут. Надеюсь, этот скрипт будет вам полезен. Любые замечания в комментариях приветствуются.

В Linux Debian версий 6/7/8 "по умолчанию" правила iptables не сохраняются автоматически. Это не недоработка, а своего рода защита от неподготовленного пользователя, коих с появлением пакетных дистрибутивов развелось хоть пруд пруди. Инструкции большая часть новоявленных "администраторов" читать не любит, пробавляясь всё больше подсказками на форумах, пользуясь которыми успешно блокируют сами себе доступ к удалённой машине. Так вот, если в результате бездумного манипулирования сильным и резким инструментом сетевые подключения заблокированы напрочь, то достаточно перезагрузить сервер, сделав тем самым "как было".

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

Скрипт сохраняет настройки в файлах "/etc/iptables/rules.v4" и "/etc/iptables/rules.v6" (очевидно, для каждого протокола отдельно). Изначально, если вы или какая-нибудь программа не успели добавить правила, там пусто.

Наверное невредно будет проконтролировать и сверить с задуманным текущую конфигурацию iptables. Сделать это можно следующей командой (вывод с номерами правил, последовательно применяемых - что важно):

Текущий набор правил нужно сохранять принудительно:

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

Ну и, естественно, можно загрузить сохранённый ранее набор правил:

Если есть желание вывести текущий набор правил в отличающийся от заданного по умолчанию файл (в качестве резервной копии, например), можно сделать это с помощью соответствующей утилиты пакета iptables (этот набор из пяти-шести мини-программ и модулей ядра является стандартным набором для всех без исключения современных дистрибутивов Linux):

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

Ясное дело, что имеется и утилита восстановления конфигурации из файла:


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

[ уже посетило: 6002 / +3 / -1 ] [ интересно! / нет ]


Поблагодарить автора ( сделайте свой денежный вклад в хорошее настроение )

Настройка осуществляется на:

Создаём файл настроек для IPTABLES:

Разрешаем его запуск:

В него добавляем:

Теперь разберём созданные правила подробнее.

В IPTABLES используется три вида таблиц:

Соответственно, нас интересует третья таблица Filter. В этой таблицы имеются три встроенные цепочки:

Пакет, проходящий через эти цепочки, исходя из правила может быть пропущен (ACCEPT) или отброшен (DROP):

$IPTABLES -P INPUT DROP

Пакеты, проходящие фильтр OUTPUT соответственно будут пропущены:

$IPTABLES -P OUTPUT ACCEPT

$IPTABLES -A INPUT -i lo -j ACCEPT

В следующем правиле для фильтра входящих соединений INPUT мы указываем:

Добавим ещё несколько правил:

Перезапустим скрипт, что бы правила вступили в силу, заодно проверим ошибки:

Пропущен пробел после tcp .

Chain FORWARD (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Ещё несколько примеров использования.

Проверить статус IPTABLES:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 180K packets, 12M bytes)
pkts bytes target prot opt in out source destination

-L : показать список правил;
-v : выводить дополнительную информацию;
-n : отображать ip адрес и порт числами, а не перобразовывать в FQDN-имя.

Вывести текущие правила, только INPUT:

Или только OUTPUT:

Добавление и удаление правил.

Вывести текущие правила INPUT с указанием строк (номеров правил):

Что бы добавить правило перед 5:

Заблокировать входящие соединения для IP 8.8.8.8 :

Посмотрим в правилах:

Разрешить SSH с адресов начиная от 10.0.0.5 и до 10.0.0.10 включительно:

Ограничить количество параллельных соединений к серверу для одного адреса

Для ограничений используется connlimit модуль. Чтобы разрешить только 3 SSH соединения на одного клиента:

Читайте также: