Настройка iptables centos 7
На защиту сервера от внешних угроз в первую очередь встает межсетевой экран, который фильтрует входящий и исходящий траффик. Настройкой iptables — частного случая фаервола на CentOS я хочу заняться в данной статье, а также рассказать о его установке и отключении. Мое руководство не будет исчерпывающим, я рассмотрю лишь те аспекты, которые считаю наиболее важными и сам использую в своей работе.
Вступление
Iptables в настоящее время является стандартом де-факто в среде современных linux дистрибутивов. Я даже сходу не могу припомнить, что еще используют в качестве фаервола. Так что любому администратору линукс приходится сталкиваться в своей работе с настройкой этого межсетевого экрана.
К этому фаерволу существуют разные обвязки, которые используются для более «удобной» настройки. В ubuntu есть ufw, в centos — firewalld, с другими не знаком. Лично я не вижу никакого удобства в использовании этих инструментов. Я привык настраивать линуксовый фаервол по-старинке, как научился в самом начале работы. Мне кажется это наиболее простым и удобным способом, которым я с вами и поделюсь. Суть его сводится к тому, что создается скрипт с правилами фаервола. Этот скрипт можно легко редактировать под свои нужды и переносить с сервера на сервер.
Отключение firewalld
Вопрос отключения firewalld я уже касался в теме по настройке сервера. Первым делом отключим firewalld, который присутствует в centos 7 по-умолчанию сразу после установки:
Теперь удалим его из автозагрузки, чтобы он не включился снова после рестарта:
После этого на сервере настройки сетевого экрана становятся полностью открытыми. Посмотреть правила iptables можно командой:
Дальше пойдет информация исключительно по конфигурированию только iptables. Темы firewalld я больше касаться не буду.
Установка iptables
На самом деле фаервол у нас на сервере уже стоит и работает, просто нет никаких правил, все открыто. Установить нам нужно будет дополнительные утилиты управления, без которых конфигурировать iptables невозможно. Например, нельзя будет перезапустить фаервол:
Или добавить в автозапуск не получится:
Чтобы подобных ошибок не было, установим необходимый пакет с утилитами:
Теперь можно добавить iptables в автозагрузку и запустить:
Настройка фаервола
Для управления правилами фаервола я использую скрипт. Создадим его:
Далее будем наполнять его необходимыми правилами. Я буду разбирать все значимые части скрипта, а полностью его приведу в виде текстового файла в конце статьи. Правила сделаны в виде картинок, чтобы запретить копирование и вставку. Это может привести к ошибкам в работе правил, с чем я сам столкнулся во время подготовки статьи.
Мы рассмотрим ситуацию, когда сервер является шлюзом в интернет для локальной сети.
Первым делом зададим все переменные, которые будем использовать в скрипте. Это не обязательно делать, но рекомендуется, потому что удобно переносить настройки с сервера на сервер. Достаточно будет просто переназначить переменные.
Перед применением новых правил, очищаем все цепочки:
Блокируем весь трафик, который не соответствует ни одному из правил:
Разрешаем весь трафик локалхоста и локалки:
Разрешаем делать ping:
Если вам это не нужно, то не добавляйте разрешающие правила для icmp.
Открываем доступ в инет самому серверу:
Если вы хотите открыть все входящие соединения сервера, то добавляйте дальше правило:
Делать это не рекомендуется, привожу просто для примера, если у вас появится такая необходимость.
Дальше разрешим все установленные соединения и дочерние от них. Так как они уже установлены, значит прошли через цепочки правил, фильтровать их еще раз нет смысла:
Теперь добавим защиту от наиболее распространенных сетевых атак. Сначала отбросим все пакеты, которые не имеют никакого статуса:
Блокируем нулевые пакеты:
Закрываемся от syn-flood атак:
Следом за этими правилами рекомендуется поставить правила на запрет доступа с определенных IP, если у вас имеется такая необходимость. Например, вас задолбал адрес 84.122.21.197 брутом ssh. Блокируем его:
Если вы не ставите ограничений на доступ из локальной сети, то разрешаем всем выход в интернет:
Следом запрещаем доступ из инета в локальную сеть:
Чтобы наша локальная сеть пользовалась интернетом, включаем nat:
Чтобы не потерять доступ к серверу, после применения правил, разрешаем подключения по ssh:
И в конце записываем правила, чтобы они применились после перезагрузки:
Мы составили простейший конфиг, который блокирует все входящие соединения, кроме ssh и разрешает доступ из локальной сети в интернет. Попутно защитились от некоторых сетевых атак.
Сохраняем скрипт, делаем исполняемым и запускаем:
Выполним просмотр правил и проверим, все ли правила на месте:
Обращаю ваше внимание — применять правила нужно лишь в том случае, если у вас имеется доступ к консоли сервера. При ошибке в настройках вы можете потерять доступ. Убедитесь, что в нештатной ситуации вы сможете отключить фаервол и скорректировать настройки.
Открытие портов
Теперь немного расширим нашу конфигурацию и откроем в iptables порты для некоторых сервисов. Допустим, у нас работает веб-сервер и необходимо открыть к нему доступ из интернета. Добавляем правила для веб-трафика:
Было добавлено разрешение на входящие соединения по 80-му и 443-му портам, которые использует web сервер в своей работе.
Если у вас установлен почтовый сервер, то нужно разрешить на него входящие соединения по всем используемым портам:
Для корректной работы DNS сервера, нужно открыть UDP порт 53
И так далее. По аналогии можете открыть доступ для всех необходимых сервисов.
Проброс (forward) порта
Рассмотрим ситуацию, когда необходимо выполнить проброс портов с внешнего интерфейса на какой-то компьютер в локальной сети. Допустим, вам необходимо получить rdp доступ к компьютеру 10.1.3.50 из интернета. Делаем проброс TCP порта 3389:
Если вы не хотите светить снаружи известным портом, то можно сделать перенаправление с нестандартного порта на порт rdp конечного компьютера:
Если вы пробрасываете порт снаружи внутрь локальной сети, то обязательно закомментируйте правило, которое блокирует доступ из внешней сети во внутреннюю. В моем примере это правило:
Либо перед этим правилом создайте разрешающее правило для доступа снаружи к внутреннему сервису, например вот так:
Включение логов
Во время настройки полезно включить логи, чтобы мониторить заблокированные пакеты и выяснять, почему отсутствует доступ к необходимым сервисам, которые мы вроде бы уже открыли. Я отправляю все заблокированные пакеты в отдельные цепочки (block_in, block_out, block_fw), соответствующие направлению трафика и маркирую в логах каждое направление. Так удобнее делать разбор полетов. Добавляем следующие правила в самый конец скрипта, перед сохранением настроек:
Все заблокированные пакеты вы сможете отследить в файле /var/log/messages.
После того, как закончите настройку, закомментируйте эти строки, отключив логирование. Обязательно стоит это сделать, так как логи очень быстро разрастаются. Практического смысла в хранении подобной информации лично я не вижу.
Как отключить iptables
Если вы вдруг решите, что firewall вам больше не нужен, то отключить его можно следующим образом:
Эта команда останавливает фаервол. А следующая удаляет из автозагрузки:
Отключив сетевой экран, мы разрешили все соединения.
Заключение
Как и обещал, выкладываю готовый скрипт с основным набором правил, которые мы рассмотрели iptables.sh
Хочу еще раз обратить внимание, что при настройке iptables необходимо быть предельно внимательным. Не начинайте это дело, если не имеете доступа к консоли сервера. Даже во время написания этой статьи я потерял доступ к серверу из-за нелепой ошибке в правилах. Ошибка эта возникла из-за копирования и потери двойного тире — оно заменилось на одинарное.
А представляете, если это был бы удаленный сервер? Ко мне так обратился один знакомый, который попросил настроить firewall на веб-сервере. Предыдущий админ заставил его 2 раза приезжать к размещению машины и сбрасывать настройки неправильно сконфигурированного экрана, что в конечном счете и привело к прекращению сотрудничества. Это было давно, но случай мне запомнился. Сейчас практически все хостинги предлагают платно или бесплатно удаленный KVM доступ. Лучше озаботиться об этом заранее.
Заметка, в основном, для себя, чтобы не ошибиться и ничего не забыть. Всего, естественно, не охватить сразу, так что со временем буду добавлять записи. Подробного описания ключей и опции тут не будет, только конкретные примеры iptables.
Для работы с файлом конфигурации поставим текстовый редактор:
Итак, в стандартной установке этой программы в CentOS 7 файл правил iptables выглядит следующим образом.
Хоть нас и предупреждают, что редактировать этот файл не рекомендуется, именно сюда будут записываться новые правила iptables. Синтаксис строки с правилом аналогичен синтаксису команды. Пройдемся немного по основным командам.
Просмотр текущего состояния iptables:
Тут у нас 3 цепочки правил:
- INPUT — для входящих пакетов, здесь и будут отображаться записываемые правила.
- FORWARD — для входящих пакетов, перенаправленных на выход, в данном случае все запрещено, так как компьютер не является роутером.
- OUTPUT — для исходящих пакетов, тут всё разрешено.
Можно посмотреть каждую цепочку отдельно, например:
2. Добавление и удаление правил iptables.
В терминале CentOS 7 последовательно выполните следующие команды:
Перезагружаем iptables:
Как уже говорилось выше, управлять правилами можно, редактируя конфигурационный файл /etc/sysconfig/iptables или используя команды. Следующая команда разрешает входящие соединения с локальной сети, записывая правило 5-ой строкой в цепочку INPUT.
Нижеприведенная команда запретит нам посещать сайт известной компании.
Таким образом можно заблокировать сеть негодяев, пытающихся что-то выведать и сломать на нашем сервере.
Отличия параметра I от параметра A заключается в том, что I позволяет вставлять правило в определенное место по номеру, без номера помещает правило на 1-ое место. A вставляет правило в конце цепочки. Если Вы поместите правило с помощью параметра A ниже 6-ой строки в листинге выше, то оно не сработает, так как 6-ая строка запрещает все, что не было разрешено раньше. Правила выполняются строго по очереди.
Следующая команда удаляет правило с соответствующим номером из указанной цепочки:
Чтобы сохранить изменения, выполненные с помощью команд, необходимо использовать:
Если вы редактировали конфигурационный файл, iptables нужно перезапустить:
или, если используется systemd:
3. Примеры записи параметров в файл конфигурации.
Не забывайте про параметр A и последнюю строку в цепочках.
Разрешить входящие соединения удаленного рабочего стола xrdp:
в конфигурации iptables это выглядит так:
Разрешить или запретить ICMP Ping запросы.
Разрешить с определенной сети:
Разрешить сервер SSH на 22 порту.
Разрешить с определенной сети:
Если ставите другой порт для SSH и SELinux не отключен, то необходимы дополнительные действия, описанные в этом блоке статьи, ниже по тексту.
Разрешить сервер ProFTPd:
Синхронизация времени NTPd:
Разрешить почтовый сервер SMTP, POP3, IMAP:
Разрешить DNS сервер:
Разрешить Samba сервер для локальной сети:
Разрешить CUPS сервер печати:
Разрешить Proxy сервер для локальной сети:
Разрешить MYSQL сервер для локальной сети:
Разрешить Transmission торрент-сервер:
Разрешить Minidlna медиа-сервер для локальной сети:
4. Если ставите другой порт для SSH и SELinux не отключен.
Обычно при настройке SSH сервера советуют менять стандартный 22 порт на любой другой. Однако, если у Вас не отключен SELinux, то могут возникнуть проблемы.
На самом деле ничего сложного нет, ведь даже комментарий в конфигурационном файле /etc/ssh/sshd_config , там где мы меняем порт, говорит нам английским языком:
Но вот запустив команду,
И вот тут у новичков могут возникнуть трудности. Ошибка происходит из-за того, что в стандартной установке пакет с утилитой semanage не установлен. И пакет этот называется не так же как утилита.
В этой статье мы покажем, как управлять файерволом 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 [цепочка] [параметры]
Примечание: если не указать название таблицы при вызове команды, по умолчанию используется таблица 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
Разберем по порядку:
Фильтр iptables по порту, протоколу или IP адресу
Теперь добавим разрешающее правило для подключения к нашему Linux серверу по SSH на порт 22.
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Допустимо указывать диапазон портов через двоеточие, например
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 пакета из возможных:
Задание политики 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: "
Разберем вывод:
Сохранение и восстановление правил фильтрации iptables
В заключении, настроим автозагрузку правил, после перезагрузки сервера. Для этого должен быть установлен пакет iptables-services и активирован сервис. Установим пакет через yum:
yum install iptables-services
systemctl enable iptables
Проверим статус службы iptables:
systemctl status iptables
Параметр автозагрузки установлен в enabled (включена), параметр active указывает, что служба запущена.
При загрузке сервис будет читать содержимое файла /etc/sysconfig/iptables, и восстанавливать сохраненные правила. Чтобы сохранить в него наши правила, воспользуемся командой:
Можно восстановить правила из файла командой:
Теперь можно перезагрузить сервер, и убедиться, что правила файервола восстановились при загрузке.
В следующей статье мы покажем, как использовать iptables для создания NAT правил перенаправления трафика для шлюза-доступа на базе CentOS из / во внутренюю сеть организации.
Процесс настройки шлюза (NAT) на системах UNIX, обычно, выполняется в несколько команд: включением перенаправления на уровне системы и настройкой firewall.
Настройка системы
Все что нужно настроить — включить перенаправления на уровне ядра. Для этого открываем следующий файл:
И добавляем в него следующую строку:
После применяем настройку:
sysctl -p /etc/sysctl.conf
В случае с единым сетевым интерфейсом больше ничего делать не потребуется — CentOS начнет работать как Интернет-шлюз.
В случае с несколькими сетевыми адаптерами, настраиваем сетевой экран.
Настройка брандмауэра
Рассмотрим настройку фаервола при помощи двух различных популярных утилит — firewalld и iptables.
Firewalld
Настройка выполняется для двух сетевых интерфейсов — ens32 (внутренний) и ens34 (внешний):
firewall-cmd --direct --permanent --add-rule ipv4 nat POSTROUTING 0 -o ens34 -j MASQUERADE
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens32 -o ens34 -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter FORWARD 0 -i ens34 -o ens32 -m state --state RELATED,ESTABLISHED -j ACCEPT
systemctl restart firewalld
Iptables
Настройка выполняется из расчета, что Интернет настроен через интерфейс ens160, а внутренняя сетя через ens32:
iptables -t nat -A POSTROUTING -o ens160 -j MASQUERADE
Если на сервере для доступа в локальную и глобальную сети используются разные сетевые интерфейсы, нам может понадобиться создать еще два правила:
iptables -A FORWARD -i ens32 -o ens160 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i ens32 -o ens160 -j ACCEPT
yum install iptables-services
service iptables save
Проброс портов (Port Forwarding)
Необходим для перенаправление сетевых запросов на сервер, стоящий за NAT и не имеющий прямого выхода во внешнюю сеть. Настройки отличаются в зависимости от способа управления брандмауэром netfilter.
Firewalld
firewall-cmd --zone=external --permanent --add-forward-port=port=25:proto=tcp:toport=8025:toaddr=192.168.0.15
Разрешаем сам порт:
firewall-cmd --permanent --zone=external --add-port=25/tcp
Чтобы правило вступило в силу:
Iptables
Настройка выполняется двумя командами и двумя спомобами.
iptables -t nat -I PREROUTING -p tcp -m tcp -d 10.8.232.111 --dport 25 -j DNAT --to-destination 192.168.0.15:8025
iptables -t nat -I POSTROUTING -p tcp -m tcp -s 192.168.0.15 --sport 8025 -j SNAT --to-source 10.8.232.111:25
iptables -t nat -I PREROUTING -p tcp -i eth0 --dport 25 -j DNAT --to-destination 192.168.0.15:8025
iptables -I FORWARD -p tcp -d 192.168.0.15 --dport 8025 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
* где eth0 — внешний сетевой интерфейс.
iptables -I INPUT 1 -p tcp --dport 8025 -j ACCEPT
* обратите внимание, что мы разрешаем порт, на который переводим запрос, так как цепочки POSTROUTING и PREROUTING работают до цепочки FILTER, а потому открывать нужно не входящий порт (25), а тот, на который назначается пакет (8025).
Читайте также: