Tutorial

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

UbuntuSecurityNetworkingVPNUbuntu 18.04

Введение

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

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

Цели

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

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

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

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

Так выглядит схема сети VPN, которую мы хотим настроить:

Настройка VPN в Tinc

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

Предварительные требования

Если вы хотите выполнить это обучающее руководство в точном соответствии с указаниями, разместите два сервера Ubuntu 18.04 (server-01 и client-01) в одном вычислительном центре и активируйте на каждом из них частные сети. Затем создайте еще один сервер Ubuntu 18.04 (client-02) в отдельном вычислительном центре. На каждом сервере должен быть пользователь с правами администратора и брандмауэр, настроенный с помощью ufw. Для подготовки следуйте указаниям руководства по начальной настройке сервера Ubuntu 18.04.

На последующих шагах данного обучающего руководства нам нужно будет переместить несколько файлов между компьютерами с помощью scp. Для этого вам нужно будет сгенерировать ключи SSH на каждом из ваших серверов, добавить ключи SSH компьютеров client-01 и client-02 на сервер server-01 в файл authorized_keys, а затем добавить ключ SSH server-01 на компьютеры client-01 и client-02 в файлы authorized_keys. Дополнительную информацию по настройке можно найти в обучающем руководстве Настройка ключей SSH в Ubuntu 18.04.

Шаг 1 — Установка Tinc

Tinc устанавливается из репозиториев по умолчанию Ubuntu APT, то есть для установки требуется всего несколько команд.

Если вы еще не делали этого, запустите следующую команду на каждом сервере для обновления соответствующих индексов пакетов:

All servers
  • sudo apt update

Затем установите tinc на каждом сервере с помощью следующей команды:

All servers
  • sudo apt install tinc

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

Шаг 2 — Настройка сервера Tinc

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

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

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

Создайте на сервере server-01 структуру директорий для сети VPN:

server-01
  • sudo mkdir -p /etc/tinc/netname/hosts

Используйте предпочитаемый текстовый редактор для создания файла tinc.conf. Мы будем использовать nano:

server-01
  • sudo nano /etc/tinc/netname/tinc.conf

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

server-01:/etc/tinc/netname/tinc.conf
Name = server_01
AddressFamily = ipv4
Interface = tun0

Предупреждение. Следует отметить, что значение после директивы Name содержит символ подчеркивания (_), а не дефис (-). Это важно, поскольку tinc требует, чтобы значение Name содержало только буквенно-числовые символы и символы подчеркивания. Если вы используете дефис, вы получите сообщение об ошибке при попытке запуска сети VPN на последующих шагах.

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

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

server-01
  • sudo nano /etc/tinc/netname/hosts/server_01

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

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

server-01:/etc/tinc/netname/hosts/server_01
Address = server-01_public_IP_address
Subnet = 10.0.0.1/32

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

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

server-01
  • sudo tincd -n netname -K4096

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

Output
. . . 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:

server-01
  • sudo nano /etc/tinc/netname/tinc-up

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

server-01:/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 …: задает для интерфейса виртуальной сети tinc статус up
  • ip addr …: добавляет IP-адрес 10.0.0.1 с маской сети 32 в интерфейс виртуальной сети tinc, в результате чего другие компьютеры в сети VPN будут видеть у сервера server-01 IP-адрес 10.0.0.1
  • ip route …: добавляет маршрут (10.0.0.0/24), доступный через интерфейс виртуальной сети tinc

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

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

server-01
  • sudo nano /etc/tinc/netname/tinc-down

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

server-01:/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 …: задает для интерфейса виртуальной сети tinc статус down

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

server-01
  • sudo chmod 755 /etc/tinc/netname/tinc-*

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

server-01
  • sudo ufw allow 655

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

Шаг 3 — Настройка клиентских узлов

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

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

Проведите на компьютерах client-01 и client-02 репликацию структуры директорий, созданную на сервере server-01:

client-01 & client-02
  • sudo mkdir -p /etc/tinc/netname/hosts

Затем создайте файл tinc.conf:

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc.conf

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

client-01 & client-02 /etc/tinc/netname/tinc.conf
Name = node_name
AddressFamily = ipv4
Interface = tun0
ConnectTo = server_01

Обязательно замените node_name именем соответствующего клиентского узла. В этом имене должен использоваться символ подчеркивания (_), а не дефис.

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

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

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

client-01 & client-02
  • sudo nano /etc/tinc/netname/hosts/node_name

Для компьютера client-01 добавьте следующую строку:

client-01:/etc/tinc/netname/hosts/client_01
Subnet = 10.0.0.2/32

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

client-02:/etc/tinc/netname/hosts/client_02
Subnet = 10.0.0.3/32

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

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

client-01 & client-02
  • sudo tincd -n netname -K4096

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

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

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-up

Для client-01 добавьте следующие строки:

client-01:/etc/tinc/netname/tinc-up
#!/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 добавьте следующие строки:

client-02:/etc/tinc/netname/tinc-up
#!/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

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

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

client-01 & client-02
  • sudo nano /etc/tinc/netname/tinc-down

Для client-01 добавьте в пустой файл следующее:

client-01:/etc/tinc/netname/tinc-down
#!/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 добавьте следующее:

client-02:/etc/tinc/netname/tinc-down
#!/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

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

Сделайте сетевые скрипты исполняемыми, запустив следующую команду на каждом клиентском компьютере:

client-01 & client-02
  • sudo chmod 755 /etc/tinc/netname/tinc-*

В завершение откройте порт 655 на каждом клиенте:

client-01 & client-02
  • sudo ufw allow 655

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

Шаг 4 — Распределение ключей

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

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

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

client-01
  • scp /etc/tinc/netname/hosts/client_01 sammy@server-01_private_IP:/tmp

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

server-01
  • sudo cp /tmp/client_01 /etc/tinc/netname/hosts/

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

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

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

client-01
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

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

client-01
  • sudo nano /etc/tinc/netname/hosts/server_01

Измените директиву Address так, чтобы она указывала на** server-01** через частный IP-адрес:

client-01:/etc/tinc/netname/hosts/server_01
Address = server-01_private_IP
Subnet = 10.0.0.1/32

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

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

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

client-02
  • scp /etc/tinc/netname/hosts/client_02 sammy@server-01_public_IP:/tmp

Оставаясь на server-01, скопируйте файл конфигурации хоста client_02 в соответствующую директорию:

server-01
  • sudo cp /tmp/client_02 /etc/tinc/netname/hosts/

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

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

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

client-02
  • sudo cp /tmp/server_01 /etc/tinc/netname/hosts/

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

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

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

All servers
  • 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 эхо-запрос IP-адреса VPN client-01. Ранее мы назначили адрес 10.0.0.2:

client-02
  • ping 10.0.0.2

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

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

В каждом окне отладки демона tinc выполните выход из демона, нажав CTRL+\.

Шаг 6 — Настройка Tinc для запуска при загрузке

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

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

All servers
  • sudo systemctl enable tinc@netname

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

All servers
  • sudo systemctl start tinc@netname

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

All servers
  • sudo systemctl start tinc@natename_01 tinc@netname_02 … tinc@netname_n

Теперь ваша сеть tinc VPN полностью настроена и работает на каждом из ваших узлов.

Заключение

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

Creative Commons License