Iptables – защита VPS на Ubuntu межсетевым экраном Linux
Вступление
Межсетевой экран Linux Iptables используется для мониторинга входящего и исходящего трафика на сервер и его фильтрации. Его работа основана на правилах, определяемых пользователями и призвана защитить систему от нежелательного доступа кого-либо. Используя Iptables, вы можете определить правила, которые будут разрешать только определённый трафик на ваш сервер. В этом руководстве по Iptables вы увидите, как защитить ваше веб-приложение используя Iptables.
Примечание: Для пользователей RHEL/ CentOS уже установлен в операционной системе сервис firewallD. Если вы хотите использовать Iptables, вам нужно вначале его отключить.
Оглавление
Что понадобится
Прежде чем приступить к выполнению руководства, проверьте наличие:
- SSH клиент, установленный на локальном компьютере (см. руководство как подключиться к вашему VPS при помощи терминала SSH)
- VPS запущенный на ОС Ubuntu 16.04
Если вы хотите узнать больше о SSH и SSH командах следуйте этому руководству.
Базовые понятия в Iptables
Все данные отправляются через интернет в форме пакетов. Ядро Linux обеспечивает интерфейс для фильтрации как входящих, так и исходящих пакетов используя таблицы для фильтра пакетов. Iptables – это приложение командной строки, межсетевой экран Linux. Вы можете использовать его для установки, обслуживания и проверки этих таблиц. Могут быть определены сложные таблицы. В каждой таблице может быть несколько цепочек. Цепочки – это ни что иное, как набор правил. Каждое правило определяет, что делать с пакетом, если он соответствует некоторому заданному шаблону. Когда пакет соответствует, задаётся TARGET (действие). Действие может быть обнаружить соответствие с другой цепочкой или одному из трёх специальный значений:
- ACCEPT (принять): Что означает, пакету будет разрешено прохождение.
- DROP (сбросить): Что означает, пакету не будет разрешено прохождение, он будет сброшен и «забыт».
- RETURN (вернут): Означает, пропустить текущую цепочку и вернуться к следующему правилу в цепочке, из которой он был вызван.
В рамках данного руководства мы собираемся работать с одной из таблиц по умолчанию под названием filter. Таблица фильтров имеет три цепочки (набора правил).
- INPUT – Эта цепочка используется для контроля входящих на сервер пакетов. Вы можете разрешить/заблокировать подключение, в зависимости от порта, протокола или IP-адреса источника.
- FORWARD – Данная цепочка используется для фильтра входящих на сервер пакетов, но перенаправляемых куда-то ещё.
- OUTPUT – Эта цепочка используется для фильтра исходящих с вашего сервера пакетов.
Шаг 1 – Установка межсетевого экрана Linux Iptables
1. Установка Iptables
Приложение Iptables идёт предустановленным в почти всех дистрибутивах Linux. Но, если вдруг в вашей системе Ubuntu/Debian оно не установлено, выполните команды:
sudo apt-get update sudo apt-get install updates
2. Проверка текущего статуса Iptables
Этой командой вы можете проверить статус конфигурации вашего Iptables. Здесь ключ -L используется для отображения списка всех правил и ключ -v — для более детального списка. Пожалуйста, обратите внимание, что эти ключи являются чувствительными к регистру (case sensitive).
sudo iptables -L -v
Пример вывода:
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Это вывод результата выполнения команды, приведенной выше. Здесь все три цепочки установлены в значение политики по умолчанию ACCEPT. На данный момент нет правил ни для одной из цепочек.
Чтобы это руководство по Iptables носило более практический характер, мы изменим цепочку INPUT для фильтрации входящего трафика.
Шаг 2 – Определение цепочки правил
Определение правила значит добавить его в список (цепочку). Вот команды Iptables, дополненные определёнными параметрами. Нам не обязательно определять их все.
sudo iptables -A -i <interface> -p <protocol (tcp/udp) > -s <source> --dport <port no.> -j <target>
Здесь -A указывает на дополнение (append). Цепочка указывает на цепочку, которую мы хотим дополнить нашими правилами. Значение interface — это сетевой интерфейс, где мы хотим производить фильтрацию трафика. Значение protocol указывает на сетевой протокол пакетов, которые вы хотите фильтровать. Также вы можете определить номер порта — port, по которому вы хотите фильтровать трафик.
Для получения более детальной информации о командах Iptables и их параметрах, вы можете посетить главную страницу Iptables(англ).
1. Разрешение трафика на localhost
Мы хотим, чтобы все взаимодействия между приложением и базой данных на сервере продолжались, как обычно.
sudo iptables -A INPUT -i lo -j ACCEPT
Пример вывода на экран:
Chain INPUT (policy ACCEPT 7 packets, 488 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo any anywhere anywhere
Здесь опция -A используется для того, чтобы добавить к цепочке INPUT правило принимать все подключения на интерфейс lo. lo означает петлевой(loopback) интерфейс. Он используется для всех коммуникаций на localhost, как взаимодействие между базой данных и веб-приложением на одной и той же машине.
2. Разрешение подключения к HTTP, SSH, и SSL портам
Мы хотим, чтобы наши постоянные подключения по HTTP (порт 80), https (порт 443), ssh (порт 22) работали как обычно. Введите следующие команды для разрешения этого. Мы определим протокол, опция -p и соответствующий порт для каждого протокола опцией –dport (порт назначения — destination port).
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
Теперь все подключения по TCP-протоколу, с определёнными портами будут приняты.
3. Фильтрация пакетов на основании содержимого
Если вы хотите принять или отклонить пакеты, основываясь на IP-адресе или диапазоне IP-адресов, вы можете определить их при помощи опции -s. Например, для принятия пакетов с адреса 192.168.1.3 –
sudo iptables -A INPUT -s 192.168.1.3 -j ACCEPT
Вы можете настроить сбрасывание пакетов с IP-адреса подобной командой с опцией DROP.
sudo iptables -A INPUT -s 192.168.1.3 -j DROP
Если вам нужно сбросить пакеты из диапазона IP-адресов, вам нужно использовать модуль Iprange с опцией -m и задать диапазон IP-адресов с ключом –src-range.
sudo iptables -A INPUT -m iprange --src-range 192.168.1.100-192.168.1.200 -j DROP
4. Отбрасывание всего остального трафика
Примечание: Очень важно сбрасывать (DROP) весь остальной трафик, после того как правила определены, это предотвращает несанкционированный доступ к серверу по других открытым портам.
sudo iptables -A INPUT -j DROP
Этой командой сбрасывается весь входящий трафик отличный от портов, указанных в команде выше. Вы можете проверить ваш набор правил командой:
sudo iptables -L -v
5. Удаление правил
Если вы хотите удалить все правила и начать с чистого листа, вы можете использовать сбрасывающую команду.
sudo iptables -F
Эта команда удаляет все текущие правила. Если вы хотите удалить определённое правило, вы можете сделать это при помощи опции -D. Вначале, выведите список правил с номерами при помощи этой команды:
sudo iptables -L --line-numbers
Теперь у вас есть список правил с номерами.
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 192.168.0.4 anywhere 2 ACCEPT tcp -- anywhere anywhere tcp dpt:https 3 ACCEPT tcp -- anywhere anywhere tcp dpt:http 4 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
Чтобы удалить задайте номер в списке и цепочку правила. В нашем случае цепочка INPUT и номер 3.
sudo iptables -D INPUT 3
Шаг 3 – Сохранение изменений
Правила Iptables, которые мы создали, сохранены в памяти. Это значит, что нам придётся их переопределять после перезагрузки. Для того, чтобы сделать эти изменения постоянными и после перезагрузки, используйте команду в системе Ubuntu/Debian:
sudo /sbin/iptables-save
Этой командой текущие правила будут сохранены в системный конфигурационный файл, который используется для перенастройки таблиц во время перезагрузки. Запускайте эту команду каждый раз после изменения правил. Чтобы отключить этот межсетевой экран просто сбросьте все правила и сделайте изменения постоянными.
sudo iptables -F sudo /sbin/iptables-save
Заключение
В нашем руководстве по Iptables мы использовали межсетевой экран Linux для разрешения трафика по определённым портам. Мы также убедились, что наши правила будут сохранены после перезагрузки. Данный межсетевой экран Linux будет сбрасывать нежелательные пакеты, но здесь есть оговорка – Iptables обрабатывает только трафик ipv4. Если на вашем VPS разрешена сетевая конфигурация ipv6, вам нужно установить другие правила для трафика с ip6tables.