Как создать двухточечную VPN с помощью WireGuard в Ubuntu 16.04

Вступление

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

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

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

Предпосылки

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

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

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

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

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

sudo add-apt-repository ppa:wireguard/wireguard

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

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

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

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

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

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

(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 WireGuard и записывает его непосредственно в наш ограниченный файл конфигурации. Мы также передаем ключ обратно в командуwg pubkey, чтобы получить связанный открытый ключ, который мы записываем в файл с именем/etc/wireguard/publickey для удобства. Нам нужно будет обменяться ключом в этом файле со вторым сервером при определении нашей конфигурации.

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

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

sudo nano /etc/wireguard/wg0.conf

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

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

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

/etc/wireguard/wg0.conf

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

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

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

[.note] #Note: Когда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 notation.

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

/etc/wireguard/wg0.conf on first server

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

В нашемsecond server мы определим адрес как 10.0.0.2, что даст нам представление CIDR 10.0.0.2/24:

/etc/wireguard/wg0.conf on second server

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

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

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

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

Определение одноранговой секции

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

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

/etc/wireguard/wg0.conf on second server

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

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

/etc/wireguard/wg0.conf on second server

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

Добавление информации о пропавшем узле в командной строке

Наfirst server (тот, который не отображает информацию о пиринге) введите информацию о пиринге вручную, используя следующий формат. Открытый ключ второго сервера можно найти в выводе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 и настроили каждый хост как сервер с двухточечным подключением к его одноранговому узлу. Эта топология идеальна для установления межсерверной связи с одноранговыми узлами, где каждая сторона является равноправным участником или где узлам может потребоваться установить временные соединения с другими серверами.

Related