Изолирование серверов в частной сети с помощью Iptables

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

Совместно используемая частная сеть распространяется на все серверы внутри одного центра обработки данных. То есть данные, отправленные через частный интерфейс виртуального сервера, смогут покинуть ЦОД.

Примечание: Данное руководство предназначено для IPv4. В Linux безопасность IPv6 обеспечивается отдельно от IPv4. К примеру, правила брандмауэра iptables распространяются только на адреса IPv4. Если ваш сервер поддерживает IPv6, защитите его с помощью ip6tables.

Читайте также: Настройка IPv6 на сервере Linux

В примерах данного руководства используется среда, созданная с помощью статьи Оптимизация производительности WordPress с помощью репликации MySQL в Ubuntu 14.04

Пользователь

Балансировщик нагрузки haproxy-www
↓                               ↓
wordpress-1               wordpress-2
↓               ↓
mysql-1     mysql-2
↑_________↑
Репликация

В данной среде используются 5 серверов:

  • haproxy-www: сервер HAProxy с балансировкой нагрузки 4 уровня серверов приложений WordPress. Это точка входа на сайт.
  • wordpress-1: первый сервер приложений WordPress.
  • wordpress-2: второй сервер приложений WordPress.
  • mysql-1: master-сервер БД MySQL.
  • mysql-2: slave-сервер MySQL.

Если ваша инфраструктура выглядит иначе, откорректируйте некоторые команды руководства.

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

Все серверы в частной сети могут взаимодействовать только с другими серверами в этой же частной сети. Балансировщик нагрузки будет доступен в Интернете и связан с частной сетью. Эта политика будет реализована на каждом сервере с помощью iptables.

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

Методы доступа к виртуальному серверу

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

Как правило, доступ к серверу можно получить через:

  • Открытый интерфейс;
  • Закрытый (частный) интерфейс;
  • Консоль.

Открытый интерфейс

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

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

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

Закрытый интерфейс

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

Это относительно безопасный вариант, по сравнению с открытым интерфейсом. Но ещё безопаснее позволять доступ к нему только серверам из вашей инфраструктуры.

Если вы подключены к VPS, вы можете подключиться по SSH к частному интерфейсу другого VPS, если они находятся в одном и том же ЦОД. Например, вы можете подключиться по SSH к публичному интерфейсу сервера haproxy-www, а затем создать SSH-подключение к частному интерфейсу mysql-1.

В этом руководстве показано, как ограничить сетевой трафик частных интерфейсов и позволить доступ к ним только VPS из одной частной сети (и некоторый другой необходимый сетевой трафик).

Консоль

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

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

Требования: интерфейсы и порты

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

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

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

haproxy-www:

  • Интернет (открытый) / порт 80
  • Серверы WordPress (частный) / порт 80

wordpress-1: (только частный интерфейс)

  • haproxy_www / порт 80
  • wordpress-2 / различные порты glusterFS
  • Серверы MySQL / порт 3306

wordpress-2: (только частный интерфейс)

  • haproxy_www / порт 80
  • wordpress-1 / различные порты glusterFS
  • Серверы MySQL / порт 3306

mysql-1: (только частный интерфейс)

  • Серверы WordPress / порт 3306
  • mysql-2 / порт 3306

mysql-2:

  • Серверы WordPress / порт 3306
  • mysql-1 / port 3306

Также нужно разрешить поддержку SSH хотя бы на одном открытом интерфейсе. В этом примере SSH будет поддерживаться дополнительным сервером tunnel-1; на других серверах  SSH будет поддерживать только частный интерфейс. То есть, для этого нужно создать SSH- туннель между сервером tunnel-1 и другим сервером (с технической точки зрения вы можете использовать любой сервер или даже все серверы инфраструктуры).

Обзор параметров iptables

Брандмауэр iptables должен быть настроен следующим образом:

  • Политика по умолчанию – drop.
  • Поддержка SSH-соединений между интерфейсом частной сети и сервером tunnel-1
  • Поддержка сетевого трафика, инициированного с вашего сервера.
  • Поддержка определенного трафика частной сети (его можно ограничить по IP-адресу или порту).

Настройка сервера haproxy-www

Подключитесь по SSH к серверу tunnel-1:

ssh user@tunnel_1_public_IP

Затем подключитесь по SSH к частному интерфейсу сервера haproxy-www:

ssh user@haproxy_www_private_IP

На сервере haproxy-www добавьте в настройки брандмауэра следующие цепочки ACCEPT и удалите все другие существующие правила.

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F

Дайте серверу tunnel-1 право подключаться с помощью частного интерфейса по SSH к haproxy-www:

sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d tunnel_1_private_IP --sport 22 -o eth1 -m state --state ESTABLISHED -j ACCEPT

Включите поддержку loopback трафика на сервере (чтобы он мог использовать 127.0.0.1 или localhost).

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

Разрешите публичный и частный трафик, инициированный с вашего сервера. Это позволит вашему серверу получить доступ к Интернету (например, чтобы загрузить обновления или программное обеспечение):

sudo iptables -I OUTPUT -o eth0 -d 0.0.0.0/0 -j ACCEPT
sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Разрешите трафик HTTP (порт 80) на открытом интерфейсе.

sudo iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

Разрешите серверам WordPress получать доступ к порту 80, указав их IP-адреса.

sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d wordpress_1_private_IP --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d wordpress_2_private_IP --dport 80 -j ACCEPT

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

sudo iptables -P INPUT DROP
sudo iptables -P OUTPUT DROP
sudo iptables -P FORWARD DROP

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

Сохраните настройки брандмауэра. Для этого понадобится пакет iptables-persistent. Установите его:

sudo apt-get u
pdate
sudo apt-get install iptables-persistent

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

Теперь брандмауэр на сервере haproxy-www имеет такие настройки:

  • Поддержка SSH с сервера tunnel-1 к частной сети.
  • Поддержка loopback трафика.
  • Поддержка исходящего трафика haproxy-www.
  • Поддержка HTTP (в том числе и для серверов приложений WordPress).
  • Сброс всего входящего трафика, поступающего с других ресурсов.

Настройка серверов частной сети

Примечание: Данный раздел нужно выполнить на остальных серверах (wordpress-1, wordpress-2, mysql-1 и mysql-2).

Поскольку в частной сети сетевых интерфейсов и портов довольно много, вместо списка IP-адресов и портов проще будет создать белый список IP-адресов.

Подключитесь по SSH к серверу tunnel-1:

ssh user@tunnel_1_public_IP

Затем подключитесь по SSH к частному интерфейсу одного из оставшихся серверов:

ssh user@VPS_private_IP

Будучи на сервере частной сети, удалите все текущие правила и установите политику по умолчанию ACCEPT:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F

Разрешите серверу tunnel-1 подключаться по SSH к текущему VPS.

sudo iptables -A INPUT -p tcp -s tunnel_1_private_IP --dport 22 -i eth1 -j ACCEPT

Разрешите трафик loopback:

sudo iptables -A INPUT -i lo -j ACCEPT

Разрешите публичный и частный трафик, инициированный с вашего сервера. Это позволит вашему серверу получить доступ к Интернету (например, чтобы загрузить обновления или программное обеспечение):

sudo iptables -I INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

Добавьте в белый список все серверы, которым нужен только доступ к частной сети (пропустите запись для сервера, на котором работаете):

sudo iptables -A INPUT -p tcp -s wordpress_1_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s wordpress_2_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s mysql_1_private_IP -j ACCEPT
sudo iptables -A INPUT -p tcp -s mysql_2_private_IP -j ACCEPT

На серверах wordpress_1 и wordpress_2 разрешите HTTP-доступ к haproxy-www (порт 80).

sudo iptables -A INPUT -p tcp -s haproxy_www_private_IP --sport 80 -j ACCEPT
sudo iptables -A OUTPUT -p tcp -d haproxy_www_private_IP --dport 80 -j ACCEPT

Цепочки INPUT и FORWARD должны иметь политику по умолчанию Drop. Обратите внимание, что цепочка OUTPUT использует политику ACCEPT, поскольку серверам в частной сети можно доверять:

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP

Сохраните настройки брандмауэра. Для этого понадобится пакет iptables-persistent. Установите его:

sudo apt-get update
sudo apt-get install iptables-persistent

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

Теперь брандмауэр на сервере haproxy-www имеет такие настройки:

  • Поддержка SSH с сервера tunnel-1 к частной сети.
  • Поддержка loopback трафика.
  • Поддержка исходящего трафика серверов частной сети
  • Поддержка входящего трафика, поступающего от серверов из белого списка.
  • Сброс входящего трафика с других ресурсов.

Устранение неполадок

Если после настройки брандмауэра приложение перестало работать, просмотрите список политик и логи iptables.

Просмотр настроек iptables

Чтобы просмотреть настройки iptables, введите команду:

sudo iptables -vL --line-numbers

Эта команда выведет все цепочки и правила (строки будут пронумерованы). Также она покажет количество сброшенных пакетов.

Логи iptables

Создайте цепочку LOG:

iptables -N LOG

Направьте INPUT, OUTPUT и FORWARD в цепочку LOG:

iptables -A INPUT -j LOG
iptables -A OUTPUT -j LOG
iptables -A FORWARD -j LOG

Запустите команду:

iptables -A LOG -m limit --limit 60/min -j LOG --log-prefix "Iptables DROP: " --log-level 7

Теперь вы можете мониторить системные сообщения и отслеживать сброшенные пакеты.

В Ubuntu эти сообщения можно прочитать в режиме реального времени с помощью команды:

sudo tail -f /var/log/syslog

В CentOS для этого используется:

sudo tail -f /var/log/messages

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

Заключение

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

Tags: , ,

Добавить комментарий