Создание VPN типа точка-точка с помощью WireGuard в Ubuntu 16.04

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

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

Данный мануал поможет создать VPN-соединение точка-точка между двумя серверами Ubuntu 16.04 с помощью WireGuard. Вы научитесь устанавливать WireGuard, генерировать криптографические ключи для хостов, создавать краткую конфигурацию и работать с интерфейсом WireGuard.

Требования

Для работы нужны два сервера Ubuntu 16.04, настроенные согласно этому руководству.

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

WireGuard предоставляет свой PPA-архив, в котором можно найти новейшие версии пакетов для Ubuntu. WireGuard нужно установить на оба сервера.

Добавьте PPA в систему:

sudo add-apt-repository ppa:wireguard/wireguard

Нажмите Enter, когда будет предложено добавить новый источник в конфигурацию apt. После добавления PPA обновите локальный индекс пакетов, чтобы добавить информацию о новых доступных пакетах, а затем установите модуль ядра WireGuard и компоненты пользовательского интерфейса:

sudo apt-get update
sudo apt-get install wireguard-dkms wireguard-tools

2: Создание закрытых ключей

Примечание: Этот раздел нужно выполнить на каждом сервере.

Аутентификация всех одноуровневых участников VPN WireGuard происходит на основе шифрования по открытым ключам. Связи между новыми хостами устанавливаются путем обмена открытыми ключами и выполнения минимальной конфигурации.

Чтобы сгенерировать закрытый ключ и записать его непосредственно в конфигурационный файл WireGuard, введите следующее:

(umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

Первая команда записывает исходное содержимое конфигурационного файла в /etc/wireguard/wg0.conf. Значение umask в суб-оболочке позволяет создать файл с ограниченными разрешениями, не затрагивая обычную среду.

Вторая команда генерирует закрытый ключ с помощью команды wg и записывает ее непосредственно в конфигурационный файл с ограниченным доступом. Затем ключ передается обратно в команде wg pubkey, чтобы получить связанный с ним открытый ключ, который записывается в /etc/wireguard/publickey. После настройки серверы должны обменяться открытыми ключами.

3: Создание конфигурационного файла

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

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

sudo nano /etc/wireguard/wg0.conf

Внутри, в разделе [Interface], вы должны увидеть свой сгенерированный закрытый ключ. Этот раздел содержит конфигурацию для локальной стороны соединения.

Раздел Interface

Здесь нужно определить IP-адрес VPN, который будет использовать этот узел, и порт, который он будет прослушивать для соединений с одноранговыми узлами. Для начала добавьте строки ListenPort и SaveConfig:

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

Это определит порт, который будет прослушивать WireGuard. Это может быть любой свободный порт, но в этом руководстве на обоих серверах используется порт 5555.

SaveConfig имеет значение true, чтобы сервис wg-quick мог автоматически сохранять свою активную конфигурацию в этом файле при завершении работы.

Примечание: Когда параметр SaveConfig включен, сервис wg-quick будет переписывать содержимое /etc/wireguard/wg0.conf при каждом завершении работы. Чтобы изменить конфигурацию WireGuard, нужно либо отключить сервис wg-quick до изменения файла /etc/wireguard/wg0.conf, либо же внести поправки с помощью команды wg, не отключая сервис (они сохранятся при завершении работы сервиса). Любые изменения, внесенные в файл конфигурационный файл во время работы сервиса, будут перезаписаны wg-quick.

Затем добавьте на каждый сервер уникальное определение Address, чтобы сервис wg-quick мог установить сетевую информацию при вызове интерфейса WireGuard. В руководстве в качестве адресного пространства VPN используется подсеть 10.0.0.0/24. Для каждого компьютера нужно выбрать уникальный адрес в этом диапазоне (от 10.0.0.1 до 10.0.0.254) и указать адрес и подсеть, используя нотацию CIDR.

Читайте также: Сетевые технологии: IP-адреса, подсети и бесклассовая адресация CIDR

Первый сервер получит адрес 10.0.0.1, что в CIDR нотации выглядит как 10.0.0.1/24

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

Второй сервер получает адрес 10.0.0.2, что в CIDR нотации выглядит как 10.0.0.2/24

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24

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

Чтобы попробовать оба способа определения одноуровневых хостов, создайте раздел [Peer] в конфигурационном файле второго сервера. Конфигурационный файл первого сервера можно сохранить и закрыть.

Раздел Peer

Примечание: Этот раздел нужно выполнить на втором сервере 2 (адрес 10.0.0.2).

Создайте раздел под названием [Peer] после раздела [Interface].

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

cat /etc/wireguard/publickey

Также в AllowedIPs нужно установить IP-адреса, действительные в туннеле. Поскольку вы знаете IP-адрес, который использует первый сервер, введите его и добавьте /32 в конце, чтобы указать диапазон.

[Interface]
. . .
[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

В Endpoint введите общедоступный IP-адрес первого сервера и порт, который прослушивает WireGuard (в этом примере это порт 5555). WireGuard обновит это значение, если оно получит законный трафик от этого узла по другому адресу, что позволит VPN адаптироваться к условиям роуминга. Начальное значение нужно, чтобы сервер мог инициировать контакт.

[Interface]
. . .
[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
Endpoint = public_IP_of_first_server:5555

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

4: Запуск VPN и подключение к одноуровневым узлам

Теперь нужно запустить WireGuard на каждом сервере и настроить взаимодействие между двумя одноуровневыми узлами.

Настройка брандмауэра и запуск VPN

Откройте порт WireGuard в брандмауэре на каждом сервере.

sudo ufw allow 5555

Запустите сервис wg-quick с помощью файла интерфейса wg0.

sudo systemctl start wg-quick@wg0

Это запустит сетевой интерфейс wg0. Чтобы убедиться в этом, введите:

ip addr show wg0
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1
link/none
inet 10.0.0.1/24 scope global wg0
valid_lft forever preferred_lft forever

Мы можем использовать инструмент wg для просмотра информации об активной конфигурации VPN:

sudo wg

На сервере без определения одноуровневых узлов вывод будет выглядеть примерно так:

interface: wg0
public key: public_key_of_this_server
private key: (hidden)
listening port: 5555

На сервере, где одноуровневые узлы уже определены, вывод будет выглядеть так:

interface: wg0
public key: public_key_of_this_server
private key: (hidden)
listening port: 5555
peer: public_key_of_first_server
endpoint: public_IP_of_first_server:5555
allowed ips: 10.0.0.1/32

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

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

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

sudo wg set wg0 peer public_key_of_second_server endpoint public_IP_of_second_server:5555 allowed-ips 10.0.0.2/32

Вы можете подтвердить, что информация теперь находится в активной конфигурации, снова введя sudo wg на первом сервере:

sudo wg
interface: wg0
public key: public_key_of_this_server
private key: (hidden)
listening port: 5555
peer: public_key_of_second_server
endpoint: public_IP_of_second_server:5555
allowed ips: 10.0.0.2/32

Теперь соединение точка-точка должно быть доступно. Попробуйте выполнить проверку VPN-адреса второго сервера с первого:

ping -c 3 10.0.0.2
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data.
64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.635 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.841 ms
--- 10.0.0.2 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1998ms
rtt min/avg/max/mdev = 0.615/0.697/0.841/0.102 ms

Если все работает правильно, вы можете сохранить конфигурацию на первом сервере в файл /etc/wireguard/wg0.conf, перезапустив сервис:

sudo systemctl restart wg-quick@wg0

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

sudo systemctl enable wg-quick@wg0

Теперь туннель VPN должен автоматически запускаться всякий раз, когда загружается машина.

Заключение

Благодаря гибкости, легкой реализации и современной криптографии WireGuard отлично подходит для многих ситуаций. В этом руководстве научились устанавливать WireGuard на двух серверах Ubuntu 16.04 и настраивать одноуровневые узлы. Эта топология идеально подходит для установления связи между равноправными серверами.

Tags: , ,