Настройка VPN WireGuard сервера и клиентов

Разработчики позиционирует WireGuard как чрезвычайно простую, но быструю и современную реализацию технологии VPN, использующую современную криптографию. WireGuard стремится быть быстрее, проще, компактнее и полезнее, чем IPsec (трудно создать что-то хуже IPsec) и намерен быть значительно более производительным, чем OpenVPN.

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

Шифрование WireGuard основано на открытых и закрытых ключах, позволяющих одноранговым узлам устанавливать зашифрованный туннель между собой. Каждая версия WireGuard использует определенный набор криптографических шифров, чтобы обеспечить простоту, безопасность и совместимость с одноранговыми узлами. Для сравнения, другое программное обеспечение VPN, такое как OpenVPN и IPSec, использует безопасность транспортного уровня (TLS) и сертификаты для аутентификации и установления зашифрованных туннелей между системами. Различные версии TLS включают поддержку сотен различных криптографических наборов и алгоритмов, и, хотя это обеспечивает большую гибкость для поддержки различных клиентов, это также делает настройку VPN, использующей TLS, более трудоемкой, сложной и подверженной ошибкам.

Преимущества VPN от WireGuard:

  • Встроен в ядро Linux.
  • Кроссплатформенный: Windows, macOS, BSD, iOS, Android.
  • Поддержка IPv4 и IPv6
  • Не использует TLS, вместо него шифрование с открытым ключом.

Недостатки:

  • Поддержка только UDP (тот же OpenVPN поддерживает и UDP и TCP). При любом запуске Anti-DDoS процедур ваш сервер WireGuard умрет.
  • Сохранения логов. OpenVPN, и IKEv2 присваивают IP-адреса динамически. Это значит, что ваш VPN присваивает вам новый IP-адрес при каждом новом подключении. WireGuard не способен присваивать IP-адреса динамически. Вместо этого, вы получаете один и тот же статический IP-адрес при каждом подключении. Для выдачи одного и того же адреса при каждом подключении, WireGuard должен сохранять и хранить информацию о вашем настоящем IP-адресе и временных метках, что нарушает политику конфиденциальности большинства VPN-сервисов. Многие сервисы заявили, что не будут использовать WireGuard до устранения этого недостатка.
  • Может ли WireGuard обойти брандмауэры? Протокол WireGuard обычно должен обходить брандмауэры, но есть одна проблема — поскольку протокол использует только протокол передачи UDP (сложно сказать, какой именно порт, хотя это может быть порт 51820), есть вероятность, что он может быть заблокирован брандмауэрами или сетевыми администраторами, которые вообще отключают UDP и разрешают только трафик TCP.

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Ubuntu 20.04 или выше с доступом root (команды указаны без использования sudo).
  • Клиентский компьютер, который вы будете использовать для подключения к вашему серверу WireGuard.
  • Чтобы использовать WireGuard с IPv6, вам необходимо убедиться, что ваш сервер настроен на его поддержку.

Первым делом обновляем репозитории Ubuntu и устанавливаем пакет WireGuard:

apt update
apt install wireguard wireguard-tools

Используя встроенные команды wg genkey и wg pubkey создаем пару ключей. Сначала создаем закрытый ключ, затем добавьте закрытый ключ private.key в файл конфигурации WireGuard и установите на него командой chmod права с доcтупом только для пользователя root.

wg genkey | tee /etc/wireguard/private.key
chmod 600 /etc/wireguard/private.key

Вы должны получить одну строку вывода в кодировке base64, которая является закрытым ключом, и добавляем его в параметр PrivateKey.

Следующим шагом является создание соответствующего открытого ключа, который является производным от закрытого ключа. Используйте следующую команду для создания файла открытого ключа:

cat /etc/wireguard/private.key | wg pubkey | tee /etc/wireguard/public.key

После выполнения команды, вы снова получите одну строку вывода в кодировке base64, которая является открытым ключом для вашего сервера WireGuard. Скопируйте его куда-нибудь для удобства, так как вам нужно будет распространять открытый ключ любому клиенту, который подключается к серверу.

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

Серверу нужно задать частные адреса IPv4 для использования клиентами и туннельным интерфейсом. Вы можете выбрать любой диапазон IP-адресов из следующих зарезервированных блоков адресов (RFC 1918):

от 10.0.0.0 до 10.255.255.255 (префикс 10/8)
от 172.16.0.0 до 172.31.255.255 (префикс 172.16/12)
от 192.168.0.0 до 192.168.255.255 (префикс 192.168/16)

Я буду использовать 10.13.13.0/24. Этот диапазон допускает до 255 различных одноранговых подключений, вы можете выбрать другой диапазон адресов, который работает с конфигурацией вашей сети. Сервер WireGuard будет использовать один IP-адрес из диапазона для своего IPv4-адреса частного туннеля. Здесь мы будем использовать 10.13.13.1/24, но можно использовать любой адрес в диапазоне от 10.13.13.1 до 10.13.13.255.

Если вы используете WireGuard с IPv6, вам потребуется сгенерировать уникальный локальный префикс индивидуального адреса IPv6 на основе алгоритма RFC 4193. Адреса, которые вы используете с WireGuard, будут связаны с интерфейсом виртуального туннеля. Вам нужно будет выполнить несколько шагов, чтобы сгенерировать случайный уникальный префикс IPv6 в зарезервированном блоке частных IPv6-адресов fd00::/8.

Согласно RFC, рекомендуемый способ получения уникального префикса IPv6 — объединить время суток с уникальным идентификационным значением из системы, таким как серийный номер или идентификатор устройства. Затем эти значения хэшируются и усекаются, в результате чего получается набор битов, который можно использовать в качестве уникального адреса в зарезервированном частном блоке IP-адресов fd00::/8.

Чтобы начать генерировать диапазон IPv6 для вашего сервера WireGuard, соберите 64-битную метку времени с помощью утилиты даты с помощью следующей команды:

date +%s%N

Вы получите число, подобное следующему, которое представляет собой количество секунд (%s в команде даты) и наносекунд (%N) с 1970-01-01 00:00:00 UTC вместе взятых: 1655653358607803610.

Запишите значение где-нибудь для использования позже в этом разделе. Затем скопируйте значение идентификатора машины для вашего сервера из файла /var/lib/dbus/machine-id. Этот идентификатор уникален для вашей системы и не должен изменяться, пока существует сервер.

cat /var/lib/dbus/machine-id
20096c25853947c7aeee2ca1ea849d7d

Теперь вам нужно объединить метку времени с идентификатором машины и хэшировать полученное значение с помощью алгоритма SHA-1. Команда будет использовать следующий формат:

printf 162810135212759219720086c25853947c7aeee2ca1ea849d7d | sha1sum
 
4f267c51857d6dc93a0bca107bca2f0d86fac3bc  -

Обратите внимание, что выходные данные команды sha1sum представлены в шестнадцатеричном формате, поэтому в выходных данных используются два символа для представления одного байта данных. Например, 4f и 26 в выходных данных примера — это первые два байта хешированных данных.

Алгоритм в RFC требует только младших значащих (завершающих) 40 бит или 5 байтов хэшированного вывода. Используйте команду cut для печати последних 5 байтов в шестнадцатеричной кодировке из хэша:

printf 4f267c51857d6dc93a0bca107bca2f0d86fac3bc | cut -c 31-

0d86fac3bc

Получим данных набор байтов: 0d 86 fa c3 bc.

Теперь вы можете создать свой уникальный сетевой префикс IPv6, добавив к сгенерированным вами 5 байтам префикс fd, разделяя каждые 2 байта двоеточием : для удобства чтения. Поскольку каждая подсеть в вашем уникальном префиксе может содержать в общей сложности 18 446 744 073 709 551 616 возможных IPv6-адресов, для простоты вы можете ограничить подсеть стандартным размером /64.

Используя байты, ранее сгенерированные с размером подсети /64, результирующий префикс будет следующим:

Unique Local IPv6 Address Prefix
fd0d:86fa:c3bc::/64

Этот диапазон fd0d:86fa:c3bc::/64 — это то, что вы будете использовать для назначения индивидуальных IP-адресов вашим туннельным интерфейсам WireGuard на сервере и одноранговых узлах. Чтобы выделить IP для сервера, добавьте 1 после последних символов ::. Результирующий адрес будет fd0d:86fa:c3bc::1/64. Одноранговые узлы могут использовать любой IP-адрес в диапазоне, но обычно вы увеличиваете значение на единицу каждый раз, когда добавляете одноранговый узел, например. fd0d:86fa:c3bc::2/64. Запишите IP-адрес и продолжите настройку сервера WireGuard в следующем разделе этого руководства.

Как писал выше, использовать будем сеть 10.13.13.0/24.

Создадим файл конфигурации сервера WireGuard, с таким содержимым:

[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.13.13.1/24
ListenPort = 51820
SaveConfig = true

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

Сохраните и закройте файл /etc/wireguard/wg0.conf. Теперь у вас есть первоначальная конфигурация сервера, которую вы можете использовать в зависимости от того, как вы планируете использовать свой VPN-сервер WireGuard.

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

Аналогичный настройки создается для любой реализации VPN, например OpenVPN.

Чтобы настроить переадресацию, откройте файл /etc/sysctl.conf с помощью nano или другого редактора. Если вы используете IPv4 с WireGuard, добавьте следующую строку внизу файла:

net.ipv4.ip_forward=1

Если вы используете IPv6 с WireGuard, добавьте эту строку внизу файла:

net.ipv6.conf.all.forwarding=1

Если вы используете и IPv4, и IPv6, убедитесь, что вы включили обе строки. Сохраните и закройте файл, когда закончите.

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

sysctl -p

Теперь WireGuard Server умеет перенаправлять входящий трафик с виртуального VPN-устройства Ethernet на другие устройства на сервере, а оттуда — в общедоступный Интернет. Использование этой конфигурации позволит вам направлять весь веб-трафик от вашего узла WireGuard через IP-адрес вашего сервера, а общедоступный IP-адрес вашего клиента будет эффективно скрыт.

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

Чтобы разрешить трафик WireGuard VPN через брандмауэр сервера, вам необходимо включить в iptables динамическую трансляцию сетевых адресов (NAT), для правильной маршрутизации клиентских подключений.

Сначала найдите общедоступный сетевой интерфейс вашего сервера WireGuard, используя команду ip route, в моем случае это ens3:

ip route list default
default via 45.67.34.1 dev ens3 onlink 

Внизу файла после строки SaveConfig = true вставьте следующие строки:

/etc/wireguard/wg0.conf
. . .
PostUp = ufw route allow in on wg0 out on ens3
PostUp = iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
PostUp = ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
PreDown = ufw route delete allow in on wg0 out on ens3
PreDown = iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
PreDown = ip6tables -t nat -D POSTROUTING -o ens3 -j MASQUERADE

Команды в директивах PostUp будут выполняться, когда сервер WireGuard запустит виртуальный VPN-туннель. В приведенном здесь примере он добавит три правила ufw и iptables.

Правила PreDown запускаются, когда сервер WireGuard останавливает виртуальный VPN-туннель. Эти правила обратны правилам PostUp и отменяют правила пересылки и маскировки для интерфейса VPN, когда VPN останавливается.

Последней частью настройки брандмауэра на вашем сервере WireGuard является разрешение входящего и исходящего трафика через порт WireGuard UDP. Если вы не изменили порт в файле сервера /etc/wireguard/wg0.conf, вы откроете порт 51820. Если вы выбрали другой порт при редактировании конфигурации, обязательно замените его в следующей команде Настройка правил фаервола (iptables) с помощью UFW. Также не забываем открывать открыть порт SSH, как указано во второй строке.

ufw allow 51820/udp
ufw allow OpenSSH

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

ufw disable
ufw enable

Вы можете убедиться, что правила действуют, выполнив команду ufw status. Запустите его, и вы должны получить вывод, подобный следующему:

ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), deny (routed)
New profiles: skip
 
To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere                  
51820/udp                  ALLOW IN    Anywhere                  
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)             
51820/udp (v6)             ALLOW IN    Anywhere (v6)

Теперь сервер WireGuard настроен на правильную обработку трафика VPN, включая переадресацию и маскарадинг (NAT).

Для автоматического запуска сервера WireGuard нужно включите сервис wg-quick для туннеля wg0, который мы определили ранее:

systemctl enable wg-quick@wg0.service

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

Например, у вас может быть туннельное устройство и имя продукта, а его файл конфигурации будет /etc/wireguard/server2.conf. Каждая конфигурация туннеля может содержать различные настройки IPv4, IPv6 и клиентского брандмауэра. Таким образом, вы можете поддерживать несколько различных одноранговых соединений, каждое из которых имеет свои уникальные IP-адреса и правила маршрутизации.

Запускаем сервер:

systemctl start wg-quick@wg0.service

Инструкции по установке для всех поддерживаемых платформ доступны по адресу https://wireguard.com/install/.

  1. Загрузите и установите пакет для Windows с веб-сайта WireGuard.
  2. После установки откройте приложение WireGuard и нажмите «Добавить туннель» → «Добавить пустой туннель…»
  3. Будет автоматически создана пара ключей.

Задайте имя туннеля и отредактируйте конфигурацию следующим образом:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.13.13.2/24
 
 
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP_ADDRESS:51820
AllowedIPs = 0.0.0.0/0

В разделе Interface добавьте новую строку c IP адресом клиента.

В одноранговом разделе Peer добавьте следующие поля:

  • PublicKey — открытый ключ сервера Ubuntu (файл /etc/wireguard/publickey).
  • Конечная точка — IP-адрес сервера Ubuntu с двоеточием и порт WireGuard (51820).
  • Разрешенные IP-адреса — 0.0.0.0/0

После этого нажмите кнопку «Сохранить».

Последний шаг — добавить на сервер открытый ключ и IP-адрес клиента. Для этого запустите на сервере Ubuntu следующую команду:

sudo wg set wg0 peer CLIENT_PUBLIC_KEY allowed-ips 10.13.13.2 Обязательно измените CLIENT_PUBLIC_KEY на открытый ключ. Пользователи Windows могут скопировать открытый ключ из приложения WireGuard.

После этого вернитесь на клиентский компьютер и запустите подключение.

Как много разных VPN в мире. :-) В это руководстве разобрали ручную установку VPN WireGuard. По мере использования статья будет обновляться.

Zomro хостинг в Нидерландах. Timeweb Cloud — облачная платформа для вашей инфраструктуры.