Как создать 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 в систему, чтобы настроить доступ к пакетам проекта:
- sudo add-apt-repository ppa:wireguard/wireguard
Нажмите ENTER, когда будет предложено добавить новый источник пакета в конфигурацию apt
. После добавления PPA обновите локальный индекс пакетов, чтобы получить информацию о новых доступных пакетах, а затем установите модуль ядра WireGuard и пользовательские компоненты:
- sudo apt-get update
- sudo apt-get install wireguard-dkms wireguard-tools
Далее мы можем приступить к настройке WireGuard на каждом из наших серверов.
Создание закрытого ключа
Каждый участник WireGuard VPN аутентифицируется со своими одноранговыми узлами, используя криптографию с открытыми ключами. Соединения между новыми одноранговыми узлами могут быть установлены путем обмена открытыми ключами и выполнения минимальной настройки.
Чтобы сгенерировать закрытый ключ и записать его непосредственно в файл конфигурации 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
во вспомогательной оболочке, чтобы мы создавали файл с ограниченными разрешениями, не затрагивая нашу обычную среду.
Вторая команда генерирует закрытый ключ с помощью команды WireGuard wg
и записывает его непосредственно в наш ограниченный файл конфигурации. Мы также передаем ключ обратно в команду wg pubkey
, чтобы получить соответствующий открытый ключ, который мы записываем в файл с именем /etc/wireguard/publickey
для удобства. Нам нужно будет обменяться ключом в этом файле со вторым сервером, когда мы определим нашу конфигурацию.
Создание исходного файла конфигурации
Затем мы откроем файл конфигурации в редакторе, чтобы настроить некоторые другие детали:
- 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 в брандмауэре на каждом сервере:
- sudo ufw allow 5555
Теперь запустите службу wg-quick
, используя определенный нами файл интерфейса wg0
:
- sudo systemctl start wg-quick@wg0
Это запустит сетевой интерфейс wg0
на машине. Мы можем подтвердить это, набрав:
- ip addr show wg0
Output on first server6: 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
На сервере без определения пира отображение будет выглядеть примерно так:
Output on first serverinterface: wg0
public key: public_key_of_this_server
private key: (hidden)
listening port: 5555
На сервере с уже определенной конфигурацией однорангового узла выходные данные также будут содержать эту информацию:
Output on second serverinterface: 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
Output on first serverinterface: 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
Output on first serverPING 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 и настроили каждый хост как сервер с двухточечным подключением к своему узлу. Эта топология идеальна для установления связи между серверами с одноранговыми узлами, где каждая сторона является равноправным участником или когда хостам может потребоваться устанавливать одноранговые соединения с другими серверами.