Как использовать Ansible и Tinc VPN для защиты вашей серверной инфраструктуры

Вступление

В этом руководстве мы продемонстрируем, как использоватьAnsible, инструмент управления конфигурацией, для настройки ячеистой сети VPN сTinc для защиты сетевой связи между вашими серверами Ubuntu и CentOS.

Ячеистая VPN особенно полезна, если ваши серверы используют общую сеть, потому что она позволяет вашим серверам обмениваться данными, как если бы они были изолированы в действительно частной сети. Дополнительный уровень безопасности, обеспечиваемый функциями аутентификации и шифрования VPN, защитит сетевую связь ваших частных служб - баз данных, кластеров Elasticsearch и т. Д. - от несанкционированного доступа или атак. Если вы используетеprivate networking feature от DigitalOcean, то эта функция безопасности уже будет включена для серверов в одной команде или учетной записи в том же регионе.
Mesh VPN Diagram

Ручная настройка и поддержка VPN на нескольких серверах сложна и подвержена ошибкам, поскольку необходимо распределить несколько файлов конфигурации и ключей среди всех участников VPN. По этой причине инструмент управления конфигурацией следует использовать для любой практической настройки ячеистой VPN, члены которой могут измениться в какой-то момент. Можно использовать любой инструмент управления конфигурацией, но в этом руководстве используется Ansible, потому что он популярен и прост в использовании. Используемый в этом руководстве AnsiblePlaybook,ansible-tinc, был протестирован на серверах Ubuntu 14.04 и CentOS 7.

Фоновое чтение

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

This Tinc VPN tutorial описывает, как установить и настроить Tinc VPN вручную. Использование Ansible для автоматизации процесса значительно облегчает управление.

How to Install and Configure Ansible дает очень общее представление о том, как работает Ansible. Если вы хотите начать писать Ansible Playbooks для автоматизации задач системного администратора, ознакомьтесь сthis tutorial.

Предпосылки

Локальная машина

Локальный компьютер - это то место, с которого вы будете запускать Ansible Playbook. Это может быть ваша локальная машина (например, ноутбук) или другой сервер, который вы используете для управления своими серверами. Как упоминалось ранее, он должен иметь возможность подключаться к каждому удаленному серверу какroot.

На вашем локальном компьютере должна быть установлена ​​Ansible 2.0+. Обратитесь кofficial Ansible installation documentation, если вам нужно его установить, поскольку процесс установки зависит от вашей операционной системы или дистрибутива.

На вашем локальном компьютере также должен быть установлен Git, поэтому вы можете легко загрузить копиюansible-tinc Playbook. Опять же, поскольку инструкции по установке зависят от вашего локального компьютера, обратитесь кofficial Git installation guide.

Удаленные серверы

Удаленные серверы - это хосты, которые вы хотите настроить для использования Tinc VPN. Вы должны начать как минимум с двух. Для работы с Ansible Playbook они должны быть:

  • Запуск Ubuntu 14.04 или CentOS 7

  • Доступен для локального компьютера (на котором установлен Ansible) через пользователяroot,with public key authentication

[.note] #Note: В настоящее время невозможно использовать другого удаленного пользователя из-заbug with the Ansible Synchronize module, который использует Playbook.
#

Если вы еще не отключили аутентификацию по паролю дляroot, вы можете сделать это, добавивPermitRootLogin without-password в файл/etc/ssh/sshd_config, а затем перезапустив SSH.

Если вы используете капли DigitalOcean, которые находятся в одном центре обработки данных, вы должны использоватьenable Private Networking для всех из них. Это позволит вам использовать частный сетевой интерфейсeth1 для зашифрованной связи VPN. Предоставленная Playbook предполагает, что каждый узел VPN будет использовать одно и то же имя сетевого устройства.

Скачать Ansible-Tinc Playbook

Когда вы будете готовы начать, используйтеgit clone, чтобы загрузить копию Пособия. Мы клонируем его в наш домашний каталог:

cd ~
git clone https://github.com/thisismitch/ansible-tinc

Теперь перейдите в только что загруженный каталогansible-tinc:

cd ansible-tinc

[.note] #Note: В оставшейся части этого руководства предполагается, что вы находитесь в каталогеansible-tinc на вашем локальном компьютере. Все команды Ansible должны выполняться из этого каталога. Кроме того, все указанные файлы, за исключением/etc/hosts, относятся к этому пути, например. hosts относится к~/ansible-tinc/hosts.
#

Далее мы покажем вам, как использовать Playbook для создания вашей сетки VPN. Если вы знакомы с Ansible, вы можете потратить некоторое время на просмотр содержимого Playbook. По сути, он устанавливает и настраивает ячеистую VPN с помощью Tinc, а также добавляет удобные записи в/etc/hosts каждого сервера.

Создать файл инвентаризации хоста

Перед запуском Playbook вы должны создать файлhosts, содержащий информацию о серверах, которые вы хотите включить в свой Tinc VPN. Сейчас мы рассмотрим содержимое файла hosts.

~/ansible-tinc/hosts example

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

[removevpn]

Первая строка,[vpn], указывает, что записи хоста непосредственно под ней являются частью группы «vpn». Члены этой группы будут иметь настроенную VPN-сеть Tinc.

  • В первом столбце указывается имя инвентаризации хоста, «node01» в первой строке примера, как Ansible будет ссылаться на хост. Это значение используется для настройки соединений Tinc и для создания записей/etc/hosts. Не используйте дефисы здесь, так как Tinc не поддерживает их в именах хостов

  • vpn_ip - это IP-адрес, который узел будет использовать для VPN. Назначьте это IP-адресу, который вы хотите, чтобы сервер использовал для своих VPN-подключений.

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

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

Example Mesh VPN Diagram

Как только ваш файлhosts будет содержать все серверы, которые вы хотите включить в свою VPN, сохраните изменения. Убедитесь, что он не содержит повторяющихся записей (имена хостов, адресаvpn_ip или значенияansible_host).

На этом этапе вы должны проверить, что Ansible может подключиться ко всем хостам в вашем файле инвентаризации:

ansible all -m ping

Все они должны ответить зеленым сообщением «УСПЕХ». Если какое-либо из соединений не удается, проверьте свой файл hosts на наличие ошибок и убедитесь, что все рассматриваемые серверы соответствуют требованиям, перечисленным вprerequisites section, прежде чем продолжить.

Пересмотр групповых переменных

Перед запуском Playbook вы можете просмотреть содержимое файла/group_vars/all:

/group_vars/all

---

netname: nyc3
physical_ip: "{{ ansible_eth1.ipv4.address }}"

vpn_interface: tun0

vpn_netmask: 255.255.255.0
vpn_subnet_cidr_netmask: 32

Двумя наиболее важными переменными являютсяphysical_ip иvpn_netmask:

  • physical_ip указывает, к какому IP-адресу вы хотите привязать tinc. Здесь мы используемAnsible Fact, чтобы установить его на IP-адрес сетевого устройстваeth1. В DigitalOceaneth1 является интерфейсом частной сети, поэтомуPrivate Networking должен быть включен, если вы не предпочитаете использовать общедоступный сетевой интерфейсeth0, изменив его значение на{{ ansible_eth0.ipv4.address }}.

  • vpn_netmask указывает сетевую маску, которая будет применяться к интерфейсу VPN. По умолчанию он установлен на255.255.255.0, что означает, что каждыйvpn_ip является адресом класса C, который может связываться только с другими хостами в той же подсети. Например,10.0.0.x не сможет связываться с хостом10.0.1.x, если подсеть не будет увеличена путем измененияvpn_netmask на что-то вроде255.255.0.0.

[.note] #Note: Преимущества безопасности VPN можно распространить на ваши серверы через общедоступный Интернет, но имейте в виду, что связь по-прежнему будет иметь те же ограничения по задержке и полосе пропускания, что и соединение без VPN.
#

Вот объяснение других настроек:

  • netname указывает сетевое имя tinc. По умолчанию установлено значениеnyc3.

  • vpn_interface - это имя виртуального сетевого интерфейса, который будет использовать tinc. По умолчанию этоtun0.

  • vpn_subnet_cidr_netmask установлено в 32, что указывает на подсеть с одним хостом (точка-точка), поскольку мы настраиваем ячеистую VPN. Не меняйте это значение.

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

Развернуть Tinc VPN

Теперь, когда вы создали файл инвентаризации и рассмотрели переменные группы, вы готовы развернуть Tinc и настроить VPN на своих серверах, запустив Playbook.

Из каталогаansible-tinc выполните эту команду, чтобы запустить Playbook:

ansible-playbook site.yml

Во время работы Playbook он должен обеспечивать вывод каждой выполняемой задачи. Если все настроено правильно, вы должны увидеть несколько статусовok иchanged и ноль статусовfailed:

PLAY RECAP *********************************************************************node01                     : ok=18   changed=15   unreachable=0    failed=0
node02                     : ok=18   changed=15   unreachable=0    failed=0
node03                     : ok=21   changed=19   unreachable=0    failed=0
node04                     : ok=21   changed=19   unreachable=0    failed=0

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

Протестируйте VPN

Войдите на свой первый хост и пропингуйте второй хост:

ping 10.0.0.2

Поскольку Playbook автоматически создает записи/etc/hosts, которые указывают имя хоста инвентаризации на IP-адрес VPN каждого участника, вы также можете сделать что-то подобное (при условии, что один из ваших хостов названnode02 в Ansiblehosts файл):

ping node02

В любом случае вы должны увидеть действительные ответы на пинг:

[secondary_label Output:
PING node02 (10.0.0.2) 56(84) bytes of data.
64 bytes from node02 (10.0.0.2): icmp_seq=1 ttl=64 time=1.42 ms
64 bytes from node02 (10.0.0.2): icmp_seq=2 ttl=64 time=1.03 ms
...

Не стесняйтесь проверять VPN-соединения между другими узлами.

[.note] #Note: Tinc использует порт655. Если ваш ping-тест не работает, убедитесь, что брандмауэр каждого узла разрешает соответствующий трафик через реальное сетевое устройство, которое использует VPN.
#

Как только вы закончите тестирование, ваш mesh VPN готов к использованию!

Настройка служб и приложений

Теперь, когда ваш mesh VPN настроен, вы должны быть уверены, что сконфигурировали свои серверные службы и приложения для его использования (где это уместно). Это означает, что любые службы, которые должны взаимодействовать через VPN, должны использовать соответствующие IP-адреса VPN (vpn_ip) вместо обычного частного IP-адреса.

Например, предположим, что вы используете стек LEMP с Nginx наnode01 и базой данных MySQL наnode02. MySQL должен быть настроен для привязки к IP-адресу VPN10.0.0.2, приложение PHP должно подключаться к базе данных на10.0.0.2, а Nginx должен прослушивать192.0.2.55 (общедоступный IP-адрес node01).

В качестве другого примера, еслиnode01,node02 иnode03 являются узлами в кластере Elasticsearch, Elasticsearch следует настроить на использование10.0.0.1,10.0.0.2 и10.0.0.3 как IP-адреса узла. Аналогично, любые клиенты, которые подключаются к кластеру, должны также использовать адреса VPN.

Особенности межсетевого экрана

Возможно, вам придется обновить правила брандмауэра, чтобы разрешить трафик на сетевом устройстве VPN, «tun0» или IP-адресах VPN.

Как добавить или удалить сервер

Добавить новые серверы

Все серверы, перечисленные в группе[vpn] в файлеhosts, будут частью VPN. Чтобы добавить новых участников VPN, просто добавьте новые серверы в группу[vpn], а затем повторно запустите Playbook:

ansible-playbook site.yml

Удалить серверы

Чтобы удалить участников VPN, переместите записиhosts серверов, которые вы хотите удалить, из группы[removevpn] в конец файла.

Например, если бы мы хотели удалитьnode04, файлhosts выглядел бы так:

hosts - удалить node04 из VPN

[vpn]
node01 vpn_ip=10.0.0.1 ansible_host=192.0.2.55
node02 vpn_ip=10.0.0.2 ansible_host=192.0.2.240
node03 vpn_ip=10.0.0.3 ansible_host=198.51.100.4

[removevpn]
node04 vpn_ip=10.0.0.4 ansible_host=198.51.100.36

Сохраните файл hosts. Обратите внимание, чтоvpn_ip является необязательным и не используется для членов группы[removevpn].

Затем перезапустите Playbook:

ansible-playbook site.yml

Это остановит Tinc и удалит конфигурацию Tinc и файлы ключей хоста у членов группы[removevpn], удалив их из VPN.

Обратите внимание, что удаление хостов из VPN приведет к появлению потерянных файлов tinc hosts и записей / etc / hosts на оставшихся участниках VPN. Это не должно влиять ни на что, если вы позже не добавите новые серверы в VPN, а повторно используете списанные имена. Удалите соответствующие записи/etc/hosts на каждом сервере, если это для вас проблема.

Заключение

Теперь ваша серверная инфраструктура должна быть защищена сеткой VPN с использованием Tinc и Ansible! Если вам нужно изменить playbook для удовлетворения ваших конкретных потребностей, не стесняйтесьfork it on GitHub.

Удачи!

Related