Поиск по сайту:

Как создать VPN типа «точка-точка» с помощью WireGuard в Ubuntu 16.04


Введение

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

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

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

Предпосылки

Чтобы следовать этому руководству, вам потребуется доступ к двум серверам Ubuntu 16.04. На каждом сервере вам нужно будет создать пользователя без полномочий root с привилегиями sudo для выполнения административных действий. Вам также понадобится базовый брандмауэр, настроенный в каждой системе. Вы можете выполнить эти требования, выполнив следующее руководство:

  • Первоначальная настройка сервера с Ubuntu 16.04

Когда вы будете готовы продолжить, войдите на каждый сервер под своим пользователем sudo.

Установка программного обеспечения

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

Во-первых, добавьте WireGuard PPA в систему, чтобы настроить доступ к пакетам проекта:

  1. sudo add-apt-repository ppa:wireguard/wireguard

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

  1. sudo apt-get update
  2. sudo apt-get install wireguard-dkms wireguard-tools

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

Создание закрытого ключа

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

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

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

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

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

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

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

  1. sudo nano /etc/wireguard/wg0.conf

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

Настройка раздела интерфейса

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

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

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

Мы также устанавливаем для 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. Мы будем использовать подсеть 10.0.0.0/24 в качестве адресного пространства для нашей VPN. Для каждого компьютера вам нужно будет выбрать уникальный адрес в этом диапазоне (от 10.0.0.1 до 10.0.0.254) и указать адрес и подсеть, используя нотацию CIDR.

Мы дадим нашему первому серверу адрес 10.0.0.1, который представлен как 10.0.0.1/24 в нотации CIDR:

[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

Это конец раздела [Interface].

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

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

Определение равноправного раздела

В файле конфигурации, который все еще открыт, создайте раздел с именем [Peer] под записями в разделе [Interface].

Начните с установки PublicKey в значение открытого ключа первого сервера. Вы можете найти это значение, набрав cat /etc/wireguard/publickey на противоположном сервере. Мы также установим AllowedIPs для IP-адресов, допустимых внутри туннеля. Поскольку мы знаем конкретный IP-адрес, который использует первый сервер, мы можем ввести его напрямую, заканчивая /32, чтобы указать диапазон, содержащий одно значение IP:

[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

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

Запуск VPN и подключение к пирам

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

Открытие брандмауэра и запуск VPN

Сначала откройте порт WireGuard в брандмауэре на каждом сервере:

  1. sudo ufw allow 5555

Теперь запустите службу wg-quick, используя определенный нами файл интерфейса wg0:

  1. sudo systemctl start wg-quick@wg0

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

  1. ip addr show wg0
Output on first server
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:

  1. sudo wg

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

Output on first server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555

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

Output on second server
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 со второго сервера:

  1. 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 на первом сервере:

  1. sudo wg
Output on first server
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-адрес второго сервера с первого:

  1. ping -c 3 10.0.0.2
Output on first server
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, перезапустив службу:

  1. sudo systemctl restart wg-quick@wg0

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

  1. sudo systemctl enable wg-quick@wg0

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

Заключение

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