Установка Tinc и настройка базовой VPN в Ubuntu 18.04

Tinc – это открытый демон VPN (Virtual Private Network), который предоставляет такие полезные функции, как шифрование, дополнительное сжатие и автоматическая маршрутизация mesh-сети, что позволяет произвольно направлять VPN трафик непосредстенно между серверами. Благодаря этому Tinc выгодно отличается от других средств VPN и является хорошим решением для создания VPN из множества небольших географически распределенных сетей.

Данный мануал поможет установить Tinc и использовать его для создания виртуальной частной сети, по которой серверы смогут взаимодействовать так, будто они работают в локальной сети. Также в этом мануале показано, как при помощи Tinc создать в частной сети безопасный туннель. Мануал протестирован на сервере Ubuntu 18.04, но его достаточно легко адаптировать под другие операционные системы.

Цели

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

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

  • server-01: сервер, к которому будут подключаться все ноды VPN; это соединение должно поддерживаться для надлежащей функциональности VPN. Чтобы обеспечить избыточность в случае необходимости, вы можете настроить дополнительные серверы так же, как этот.
  • client-01: нода, которая подключается к server-01 с помощью частный сетевой сети.
  • client-02: нода, которая подключается к server-01 через публичный сетевой интерфейс

Примечание: Tinc сам по себе не различает серверы (машины, на которых размещаются и обслуживаются сервисы VPN) и клиенты (машины, которые подключаются к защищенной частной сети и используют ее). Здесь мы используем эти термины, чтобы было проще понять и визуализировать работу tinc.

Наша настройка будет выглядеть так:

+-------------------------------------+
|            +----------------------+ |
| client-02 →| server-01 ← client-01| |
|            +----------------------+ |
+-------------------------------------+

Синим выделена VPN, а красным внутренняя частная сеть. Все три сервера смогут взаимодействовать по VPN, хотя частная сеть недоступна для ноды client-02.

Требования

Для работы вам понадобится три сервера Ubuntu 18.04, настроенные по этому мануалу:

  • Два сервера (server-01 и client-01) в одном центре обработки данных, с поддержкой частной сети каждый.
  • Один сервер (client-02) в другом ЦОД.

Кроме того, позже нам нужно будет передать между машинами несколько файлов с помощью scp. Потому необходимо сгенерировать ключи SSH на каждом из серверов: добавьте SSH-ключи client-01 и client-02 в файл author_keys на server-01, а затем добавьте SSH-ключ server-01 в файлы author_keys на машины client-01 и client-02.

Читайте также: Установка SSH-ключей в Ubuntu 18.04

1: Установка Tinc

Примечание: Выполните раздел на всех серверах.

Пакет Tinc можно загрузить из стандартного репозитория Ubuntu.

Обновите индекс пакетов сервера, если еще не сделали этого:

sudo apt update

А теперь установите Tinc с помощью команды:

sudo apt install tinc

Итак, пакет Tinc установлен на всех ваших машинах. Теперь нужно внести некоторые изменения в конфигурацию Tinc на каждой машине, чтобы запустить VPN. Начнем с server -01.

2: Настройка сервера Tinc

Tinc требует, чтобы каждая машина, которая будет частью VPN, имела следующие компоненты конфигурации:

  • Конфигурационные файлы Tinc: три отдельных файла, которые настраивают демон Tinc:
    • tinc.conf определяет сетевое имя (netname), сетевое устройство, через которое будет работать VPN, и другие параметры VPN;
    • tinc-up – скрипт, который активирует сетевое устройство, определенное в tinc.conf, после запуска tinc;
    • tinc-down – скрипт, который отключает сетевое устройство вместе с tinc.
  • Пары открытых и закрытых ключей. Tinc использует их для защиты (чтобы обеспечить доступ к VPN только пользователям с действительными ключами).
  • Конфигурационные файлы хоста: каждая машина (или хост) в VPN имеет свой собственный конфигурационный файл, который содержит фактический IP-адрес хоста и подсеть, в которой его будет обслуживать Tinc.

Tinc использует сетевое имя (netname), чтобы отличать одну сеть Tinc VPN от другой. Это очень полезно, если вы хотите настроить несколько VPN. Но даже если вы планируете настроить только одну сеть VPN, рекомендуется все же использовать сетевое имя. Вы можете присвоить своей VPN любое сетевое имя, какое захотите (для простоты мы назовем нашу тестовую сеть netname).

На машине server-01 создайте структуру каталогов конфигурации для VPN:

sudo mkdir -p /etc/tinc/netname/hosts

В текстовом редакторе создайте конфигурационный файл:

sudo nano /etc/tinc/netname/tinc.conf

Вставьте следующие строки в пустой файл. Они настраивают ноду server_01 с сетевым интерфейсом tun0, который будет использовать IPv4:

Name = server_01
AddressFamily = ipv4
Interface = tun0

Важно! Обратите внимание, что значение директивы Name включает подчеркивание (_), а не дефис (-). Tinc требует, чтобы значение Name содержало только буквы, цифры или символы подчеркивания. Если здесь вы используете дефис, при попытке запустить VPN вы увидите ошибку.

Сохраните и закройте файл. Если вы использовали nano, нажмите для этого CTRL+X, Y и Enter.

Затем создайте конфигурационный файл хоста server_01 в подкаталоге hosts. Клиентские ноды будут использовать этот файл для связи с server-01:

sudo nano /etc/tinc/netname/hosts/server_01

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

Добавьте в файл следующие строки, указав публичный IP-адрес server-01:

Address = server-01_public_IP_address
Subnet = 10.0.0.1/32

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

Затем сгенерируйте пару открытых и закрытых ключей RSA для этого хоста с помощью следующей команды:

sudo tincd -n netname -K4096

После выполнения команды вам будет предложено ввести имена файлов, где Tinc сохранит открытый и закрытый ключи RSA:

. . .
Please enter a file to save private RSA key to [/etc/tinc/netname/rsa_key.priv]:
Please enter a file to save public RSA key to [/etc/tinc/netname/hosts/server_01]:

Нажмите Enter, чтобы принять расположение файлов по умолчанию; в этом случае tinc сохранит закрытый ключ в файле rsa_key.priv, а открытый ключ – в файле конфигурации хоста server_01.

Затем создайте tinc-up, скрипт, который будет запускаться вместе с VPN netname:

sudo nano /etc/tinc/netname/tinc-up

Добавьте в файл следующие строки:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.1/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Вот что делает каждая из этих строк:

  • ip link…: устанавливает статус up для интерфейса виртуальной сети tinc
  • ip addr…: добавляет IP-адрес 10.0.0.1 с маской сети 32 к виртуальному сетевому интерфейсу Tinc, благодаря чему другие машины в VPN будут видеть IP-адрес server-01 как 10.0.0.1.
  • ip route…: добавляет маршрут (10.0.0.0/24), который можно найти через виртуальный сетевой интерфейс Tinc.

Сохраните и закройте файл после добавления этих строк.

Затем создайте скрипт для удаления интерфейса виртуальной сети при остановке VPN:

sudo nano /etc/tinc/netname/tinc-down

Вставьте в файл следующие строки:

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.1/32 dev $INTERFACE
ip link set $INTERFACE down

Эти строки  выполняют противоположные скрипту tinc-up действия:

  • ip route…: удаляет маршрут 10.0.0.0/24
  • ip addr…: удаляет IP-адрес 10.0.0.1 из интерфейса виртуальной сети Tinc.
  • ip link…: устанавливает статус down для виртуального сетевого интерфейса Tinc.

Сохраните и закройте файл, а затем сделайте оба этих новых сценария исполняемыми:

sudo chmod 755 /etc/tinc/netname/tinc-*

В качестве последнего этапа настройки server-01 добавьте правило брандмауэра, которое пропустит трафик через порт 655, порт Tinc по умолчанию:

sudo ufw allow 655

Сервер server-01 полностью настроен, и вы можете приступать к настройке клиентских нод.

3: Настройка клиентских нод

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

Чтобы получить нужную в этом мануале инфраструктуру, мы настроим client-01 и client-02 практически одинаково, с небольшими отличиями между ними. Следовательно, многие команды, приведенные в этом разделе, должны выполняться на обеих машинах (если не сказано другое).

На client-01 и client-02 скопируйте структуру каталогов, созданную на server-01:
sudo mkdir -p /etc/tinc/netname/hosts

Создайте файл tinc.conf:

sudo nano /etc/tinc/netname/tinc.conf

В этот файл вставьте такие строки:

Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01

Вместо node_name укажите имя текущей ноды (client-01 или client-02). Напоминаем, что в именах нельзя использовать дефисы.

Обратите внимание, что этот файл содержит директиву ConnectTo, указывающую на server_01, а файл tinc.conf на server_01 не включает эту директиву. Если оператора ConnectTo на server_01 нет, это означает, что server_01 будет прослушивать только входящие соединения. Это подходит для нашей установки, так как сервер не будет подключаться ни к каким другим машинам.

Сохраните и закройте файл.

Затем создайте файл конфигурации хоста на каждой клиентской ноде.

sudo nano /etc/tinc/netname/hosts/node_name

На client-01 поместите в файл эту строку:

Subnet = 10.0.0.2/32

На client-02 – вот эту:

Subnet = 10.0.0.3/32

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

Затем сгенерируйте пары ключей на каждом клиенте:

sudo tincd -n netname -K4096

Как и в случае с сервером server-01, при появлении запроса на выбор файлов для хранения ключей RSA нажмите клавишу Enter, чтобы принять файлы по умолчанию.

После этого создайте скрипт запуска сетевого интерфейса на каждом клиенте:

sudo nano /etc/tinc/netname/tinc-up

Для client-01 добавьте в файл эти строки:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.2/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Для client-02 добавьте следующее:

#!/bin/sh
ip link set $INTERFACE up
ip addr add 10.0.0.3/32 dev $INTERFACE
ip route add 10.0.0.0/24 dev $INTERFACE

Сохраните и закройте файл.

Создайте скрипт для остановки сетевого интерфейса на каждом клиенте:

sudo nano /etc/tinc/netname/tinc-down

В файл client-01 вставьте эти строки:

#!/bin/sh
ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.2/32 dev $INTERFACE
ip link set $INTERFACE down

В файл client-02 вставьте это:

#!/bin/sh

ip route del 10.0.0.0/24 dev $INTERFACE
ip addr del 10.0.0.3/32 dev $INTERFACE
ip link set $INTERFACE down

Сохраните и закройте эти файлы.

Сделайте скрипты исполняемыми на каждой клиентской ноде:

sudo chmod 755 /etc/tinc/netname/tinc-*

В заключение настройки откройте порт 655 в брандмауэре на каждом клиенте.

sudo ufw allow 655

На этом этапе клиентские ноды почти настроены. Для проверки подлинности соединения с VPN им нужен открытый ключ, который мы создали на сервере server-01.

4: Обмен ключами

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

Обмен ключами между server-01 и client-01

Перейдите на ноду client-01и скопируйте файл конфигурации ее хоста на server-01. Поскольку машины server-01 и client-01 находятся в одном и том же центре обработки данных и у них включена частная сеть, вы можете использовать внутренний IP-адрес server-01:

scp /etc/tinc/netname/hosts/client_01 8host@server-01_private_IP:/tmp

Затем перейдите на server-01 и скопируйте файл конфигурации хоста client-01 в каталог /etc/tinc/netname/hosts/:

sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

Затем, оставаясь на server-01, скопируйте файл конфигурации хоста на ноду client-01:

scp /etc/tinc/netname/hosts/server_01 user@client-01_private_IP:/tmp

На client-01 скопируйте файл server-01 в соответствующее место:

sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

На машине client-01 отредактируйте файл конфигурации хоста server-01: в поле Address нужно указать внутренний IP-адрес server-01. Таким образом client-01 будет подключаться к VPN через частную сеть:

sudo nano /etc/tinc/netname/hosts/server_01

Измените директиву Address, указав внутренний IP-адрес server-01:

Address = server-01_private_IP
Subnet = 10.0.0.1/32

Сохраните и закройте файл. Теперь давайте перейдем к настройке оставшейся ноды client-02.

Обмен ключами между server-01 и client-02

Войдите на client-02. Скопируйте конфигурационный файл client-02 на server-01:

scp /etc/tinc/netname/hosts/client_02 8host@server-01_public_IP:/tmp

Перейдите на server-01 и скопируйте файл хоста client-02 в соответствующий каталог:

sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

Оставайтесь на server-01 и скопируйте конфигурационный файл хоста на client-02:

scp /etc/tinc/netname/hosts/server_01 user@client-02_public_IP:/tmp

Перейдите на client-02 и скопируйте файл хоста server-01 в соответствующий каталог

sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

Если вы, как и мы, настраиваете два клиента узла, это все, что нужно сделать. Однако если в вашей VPN больше клиентов, все они должны обменяться ключами. Помните, если вы хотите, чтобы две ноды напрямую взаимодействовали друг с другом (без переадресации между серверами), они должны обменяться своими файлами ключей/хостов и иметь возможность доступа к реальным сетевым интерфейсам друг друга. Также можно просто скопировать все конфигурационные файлы хостов на все ноды в VPN.

5: Тестирование конфигурации

На каждой ноде, начиная с server-01, запустите tinc с помощью следующей команды:

sudo tincd -n netname -D -d3

Эта команда включает флаг -n, который указывает на сетевое имя VPN, netname. Это полезно, если у вас есть несколько VPN и вам нужно указать, какую из них вы хотите запустить. Также в команде есть флаг -D, который предотвращает разветвление и отсоединение tinc, а также отключает механизм автоматического перезапуска tinc. Флаг –d в команде позволяет tinc работать в режиме отладки с уровнем 3.

Примечание: В контексте Tinc уровень отладки 3 будет отображать каждый запрос, которым обмениваются любые два сервера, включая запросы на аутентификацию, обмен ключами и обновления списка соединений. Более высокие уровни отладки показывают больше информации, включая данные о сетевом трафике, но сейчас нас интересует только то, могут ли ноды взаимодействовать друг с другом, поэтому уровня 3 будет достаточно. Но в производственном сценарии лучше использовать более низкий уровень отладки, чтобы не заполнять диски логами. Узнать больше об уровнях отладки Tinc можно в официальной документации.

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

Перейдите на client-02. В новом окне терминала запустите команду ping с VPN IP-адресом client-01.

ping 10.0.0.2

Пинг должен работать правильно, и вы должны увидеть отладочную информацию о соединении по VPN в других окнах. Это указывает на то, что client-02 может обмениваться данными через VPN через server-01 с client-01. Нажмите Ctrl+C, чтобы остановить команду ping.

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

В каждом окне демона Tinc остановите его, нажав Ctrl + \.

6: Автозагрузка Tinc

Серверы Ubuntu по умолчанию используют систему инициализации systemd для управления процессами. Включить автоматический запуск VPN netname при загрузке системы можно с помощью одной команды systemctl.

Выполните следующую команду на каждой ноде, чтобы сеть VPN tinc включалась при загрузке компьютеров:

sudo systemctl enable tinc@netname

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

sudo systemctl start tinc@netname

Примечание: Если у вас несколько сетей VPN, вы можете одновременно включить их с помощью команды:

sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

Теперь tinc VPN полностью настроена и работает на каждой ноде.

Заключение

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

Tags: , , ,