Как настроить WireGuard в Ubuntu 22.04

  Linux admin, Linux DE, Mikrotik

скопировано отсюда. Перевод гугла

Вступление

WireGuard — это облегченная виртуальная частная сеть (VPN), поддерживающая соединения IPv4 и IPv6. VPN позволяет вам проходить через ненадежные сети, как если бы вы были в частной сети. Это дает вам свободу безопасного и надежного доступа в Интернет со смартфона или ноутбука при подключении к ненадежной сети, такой как Wi-Fi в отеле или кафе.

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

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

В этом руководстве вы настроите WireGuard на сервере Ubuntu 22.04, а затем настроите другой компьютер для подключения к нему в качестве однорангового узла, используя соединения IPv4 и IPv6 (обычно называемое соединением с двойным стеком ). Вы также узнаете, как направлять интернет-трафик партнера через сервер WireGuard в конфигурации шлюза в дополнение к использованию VPN для зашифрованного однорангового туннеля.

Для целей этого руководства мы настроим другую систему Ubuntu 22.04 в качестве партнера (также называемого клиентом) для сервера WireGuard. В последующих руководствах этой серии объясняется, как установить и запустить WireGuard в системах и устройствах Windows, macOS, Android и iOS.

Шаг 1 — Установка WireGuard и создание пары ключей

Первым шагом в этом руководстве является установка WireGuard на ваш сервер. Для начала обновите индекс пакетов вашего сервера WireGuard и установите WireGuard, используя следующие команды. Вам может быть предложено ввести пароль пользователя sudo, если вы используете его впервые sudoв этом сеансе:

sudo apt update sudo apt install wireguard 

Теперь, когда у вас установлен WireGuard, следующим шагом будет создание пары закрытого и открытого ключей для сервера. Вы будете использовать встроенные команды wg genkeyи wg pubkeyдля создания ключей, а затем добавите закрытый ключ в файл конфигурации WireGuard.

Вам также потребуется изменить права доступа к ключу, который вы только что создали с помощью chmodкоманды, так как по умолчанию файл доступен для чтения любому пользователю на вашем сервере.

Создайте закрытый ключ для WireGuard и измените его разрешения с помощью следующих команд:

wg genkey | sudo tee /etc/wireguard/private.key 
sudo chmod go= /etc/wireguard/private.key 

Команда sudo chmod go=...удаляет все разрешения на файл для пользователей и групп, кроме пользователя root, чтобы гарантировать, что только он может получить доступ к закрытому ключу.

Вы должны получить одну строку base64закодированного вывода, которая является закрытым ключом. Копия выходных данных также сохраняется в /etc/wireguard/private.keyфайле для дальнейшего использования teeчастью команды. Внимательно запишите полученный закрытый ключ, так как вам нужно будет добавить его в файл конфигурации WireGuard позже в этом разделе.

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

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

Эта команда состоит из трех отдельных команд, объединенных в цепочку с помощью |оператора (pipe):

  • sudo cat /etc/wireguard/private.key: эта команда считывает файл закрытого ключа и выводит его в стандартный поток вывода.
  • wg pubkey: вторая команда принимает вывод первой команды в качестве стандартного ввода и обрабатывает его для создания открытого ключа.
  • sudo tee /etc/wireguard/public.key: последняя команда берет вывод команды генерации открытого ключа и перенаправляет его в файл с именем /etc/wireguard/public.key.

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

Шаг 2 — Выбор адресов IPv4 и IPv6

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

Если вы планируете использовать адреса IPv4 и IPv6, следуйте обоим этим разделам. В противном случае следуйте инструкциям в соответствующем разделе для нужд вашей сети VPN.

Шаг 2 (a) — Выбор диапазона IPv4

Если вы используете сервер WireGuard с одноранговыми узлами IPv4, серверу потребуется ряд частных адресов 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.8.0.0/24в качестве блока IP-адресов из первого диапазона зарезервированных IP-адресов. Этот диапазон допускает до 255 различных одноранговых подключений и, как правило, не должен иметь перекрывающихся или конфликтующих адресов с другими диапазонами частных IP-адресов. Не стесняйтесь выбирать диапазон адресов, который работает с конфигурацией вашей сети, если этот примерный диапазон не совместим с вашими сетями.

Сервер WireGuard будет использовать один IP-адрес из диапазона для своего IPv4-адреса частного туннеля. Мы будем использовать 10.8.0.1/24здесь, но можно использовать любой адрес в диапазоне от 10.8.0.1до 10.8.0.255. Запишите выбранный вами IP-адрес, если вы используете что-то отличное от 10.8.0.1/24. Вы добавите этот IPv4-адрес в файл конфигурации, который вы определили на шаге 3 — Создание конфигурации сервера WireGuard .

Шаг 2(b) — Выбор диапазона IPv6

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

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

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

date +%s%N

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

Output1650301699497770167

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

cat /var/lib/dbus/machine-id

Вы получите следующий вывод:

/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb

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

printf <timestamp><machine-id> | sha1sum

Запустите команду, подставив метку времени и значения идентификатора машины:

printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

Вы получите хэш-значение, подобное следующему:

Output442adea1488d96388dae9ab816045b24609a6c18  -

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

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

printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

Аргумент -cуказывает cutкоманде выбрать только указанный набор символов. Аргумент 31-указывает cutна печать всех символов с позиции 31 до конца строки ввода.

Вы должны получить вывод, подобный следующему:

Output24609a6c18

В этом примере выходных данных набор байтов: .24 60 9a 6c 18

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

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

Unique Local IPv6 Address Prefixfd24:609a:6c18::/64

Этот fd24:609a:6c18::/64диапазон вы будете использовать для назначения отдельных IP-адресов вашим туннельным интерфейсам WireGuard на сервере и одноранговых узлах. Чтобы выделить IP для сервера, добавьте 1после последних ::символов. Полученный адрес будет . Одноранговые узлы могут использовать любой IP-адрес в диапазоне, но обычно вы увеличиваете значение на единицу каждый раз, когда добавляете одноранговый узел, например . Запишите IP-адрес и продолжите настройку сервера WireGuard в следующем разделе этого руководства.fd24:609a:6c18::1/64fd24:609a:6c18::2/64

Шаг 3 — Создание конфигурации сервера WireGuard

Перед созданием конфигурации вашего сервера WireGuard вам потребуется следующая информация:

  1. Убедитесь, что у вас есть доступ к закрытому ключу из шага 1 — установка WireGuard и создание пары ключей .
  2. Если вы используете WireGuard с IPv4, вам потребуется IP-адрес, который вы выбрали для сервера на шаге 2 (a) — Выбор диапазона IPv4 , в данном примере это 10.8.0.1/24.
  3. Если вы используете WireGuard с IPv6, вам понадобится IP-адрес сервера, созданный на шаге 2 (b) — Выбор диапазона IPv6 . В данном примере это IP fd24:609a:6c18::1/64.

Получив необходимый закрытый ключ и IP-адрес(а), создайте новый файл конфигурации с помощью nanoили предпочитаемого вами редактора, выполнив следующую команду:

sudo nano /etc/wireguard/wg0.conf

Добавьте в файл следующие строки, подставив свой закрытый ключ вместо выделенного base64_encoded_private_key_goes_hereзначения и IP-адрес(а) в Addressстроке. Вы также можете изменить ListenPortстроку, если хотите, чтобы WireGuard был доступен на другом порту:

/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_private_key_goes_here
Address = 10.8.0.1/24, fd24:609a:6c18::1/64
ListenPort = 51820
SaveConfig = true

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

Сохраните и закройте /etc/wireguard/wg0.confфайл. Если вы используете nano, вы можете сделать это с помощью CTRL+X, затем Yи ENTERдля подтверждения. Теперь у вас есть первоначальная конфигурация сервера, которую вы можете использовать в зависимости от того, как вы планируете использовать свой VPN-сервер WireGuard.

Шаг 4 — Настройка сетевой конфигурации сервера WireGuard

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

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

sudo nano /etc/sysctl.conf

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

net.ipv4.ip_forward=1

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

net.ipv6.conf.all.forwarding=1

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

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

sudo sysctl -p
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1

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

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

Шаг 5 — Настройка брандмауэра сервера WireGuard

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

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

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

ip route list default

Публичный интерфейс — это строка в выводе этой команды, следующая за словом «dev». Например, этот результат показывает интерфейс с именем eth0, который выделен ниже:

Outputdefault via 203.0.113.1 dev eth0 proto static

Запишите имя вашего устройства, так как вы добавите его в iptablesправила на следующем шаге.

Чтобы добавить правила брандмауэра на ваш сервер WireGuard, снова откройте /etc/wireguard/wg0.confфайл с помощью nanoили в предпочитаемом вами редакторе.

sudo nano /etc/wireguard/wg0.conf

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

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

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

  • ufw route allow in on wg0 out on eth0– Это правило позволит перенаправлять трафик IPv4 и IPv6, поступающий через wg0интерфейс VPN, на eth0сетевой интерфейс на сервере. Он работает в сочетании со значениями net.ipv4.ip_forwardи net.ipv6.conf.all.forwardingsysctl, которые вы настроили в предыдущем разделе.
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE– Это правило настраивает маскировку и перезаписывает трафик IPv4, поступающий через wg0интерфейс VPN, чтобы он выглядел так, как будто он исходит непосредственно с общедоступного IPv4-адреса сервера WireGuard.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE– Это правило настраивает маскировку и перезаписывает трафик IPv6, поступающий через wg0интерфейс VPN, чтобы он выглядел так, как будто он исходит непосредственно с общедоступного IPv6-адреса сервера WireGuard.

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

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

И наоборот, если вы используете только IPv6, отредактируйте конфигурацию, чтобы включить только ip6tablesкоманды. Линии ufwдолжны существовать для любой комбинации сетей IPv4 и IPv6. Сохраните и закройте файл, когда закончите.

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

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

sudo ufw allow 51820/udp
sudo ufw allow OpenSSH

Примечание . Если вы используете другой брандмауэр или настроили конфигурацию UFW, вам может потребоваться добавить дополнительные правила брандмауэра. Например, если вы решите туннелировать весь свой сетевой трафик через VPN-подключение, вам необходимо убедиться, что 53трафик портов разрешен для запросов DNS, а такие порты, как 80и 443для трафика HTTP и HTTPS, соответственно. Если есть другие протоколы, которые вы используете через VPN, вам также нужно будет добавить правила для них.

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

sudo ufw disable
sudo ufw enable

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

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
51280/udp                  ALLOW       Anywhere                  
22/tcp                     ALLOW       Anywhere                  
51280/udp (v6)             ALLOW       Anywhere (v6)             
22/tcp (v6)                ALLOW       Anywhere (v6)

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

Шаг 6 — Запуск сервера WireGuard

WireGuard можно настроить для работы в качестве systemdслужбы с помощью встроенного wg-quickскрипта. Хотя вы можете вручную использовать wgкоманду для создания туннеля каждый раз, когда хотите использовать VPN, это ручной процесс, который становится повторяющимся и подверженным ошибкам. Вместо этого вы можете использовать systemctlдля управления туннелем с помощью wg-quickскрипта.

Использование systemdслужбы означает, что вы можете настроить WireGuard для запуска при загрузке, чтобы вы могли подключаться к VPN в любое время, пока сервер работает. Для этого включите wg-quickслужбу для определенного wg0вами туннеля, добавив ее в systemctl:

sudo systemctl enable wg-quick@wg0.service

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

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

Теперь запустите службу:

sudo systemctl start wg-quick@wg0.service

Дважды проверьте, активна ли служба WireGuard, с помощью следующей команды. Вы должны увидеть active (running)в выводе:

sudo systemctl status wg-quick@wg0.service
Output● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
     Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled)
     Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago
       Docs: man:wg-quick(8)
             man:wg(8)
             https://www.wireguard.com/
             https://www.wireguard.com/quickstart/
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
             https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
    Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
   Main PID: 98834 (code=exited, status=0/SUCCESS)
        CPU: 193ms

Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added
Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6)
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE
Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

В выходных данных показаны ipкоманды, используемые для создания виртуального wg0устройства и назначения ему адресов IPv4 и IPv6, которые вы добавили в файл конфигурации. Вы можете использовать эти правила для устранения неполадок в туннеле или с помощью самой wgкоманды, если хотите попробовать вручную настроить интерфейс VPN.

Когда сервер настроен и запущен, следующим шагом будет настройка клиентского компьютера в качестве узла WireGuard и подключение к серверу WireGuard.

Шаг 7 — Настройка узла WireGuard

Настройка узла WireGuard аналогична настройке сервера WireGuard. После установки клиентского программного обеспечения вы создадите пару открытого и закрытого ключей, определите IP-адрес или адреса для однорангового узла, определите файл конфигурации для однорангового узла, а затем запустите туннель с помощью wg-quickсценария.

Вы можете добавить в VPN столько пиров, сколько захотите, сгенерировав пару ключей и настроив их, выполнив следующие шаги. Если вы добавляете несколько одноранговых узлов в VPN, обязательно отслеживайте их частные IP-адреса, чтобы предотвратить коллизии.

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

sudo apt update
sudo apt install wireguard

Создание пары ключей узла WireGuard

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

wg genkey | sudo tee /etc/wireguard/private.key
sudo chmod go= /etc/wireguard/private.key

Вы снова получите одну строку base64закодированного вывода, которая является закрытым ключом. Копия вывода также сохраняется в файле /etc/wireguard/private.key. Внимательно запишите полученный закрытый ключ, так как вам нужно будет добавить его в файл конфигурации WireGuard позже в этом разделе.

Затем используйте следующую команду для создания файла открытого ключа:

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

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

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

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

Вам понадобится несколько фрагментов информации для файла конфигурации:

  • Закодированный base64закрытый ключ, созданный вами на узле.
  • Диапазоны адресов IPv4 и IPv6, которые вы определили на сервере WireGuard.
  • Закодированный base64открытый ключ с сервера WireGuard.
  • Общедоступный IP-адрес и номер порта сервера WireGuard. Обычно это будет адрес IPv4, но если ваш сервер имеет адрес IPv6, а ваш клиентский компьютер имеет подключение к Интернету по протоколу IPv6, вы можете использовать его вместо IPv4.

Имея всю эту информацию под рукой, откройте новый /etc/wireguard/wg0.confфайл на машине WireGuard Peer, используя nanoили предпочитаемый вами редактор:

sudo nano /etc/wireguard/wg0.conf

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

/etc/wireguard/wg0.conf[Interface]
PrivateKey = base64_encoded_peer_private_key_goes_here
Address = 10.8.0.2/24
Address = fd24:609a:6c18::2/64

[Peer]
PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64
Endpoint = 203.0.113.1:51820

Обратите внимание, что в первой Addressстроке используется адрес IPv4 из 10.8.0.0/24 выбранной ранее подсети. Этот IP-адрес может быть любым в подсети, если он отличается от IP-адреса сервера. Увеличение адресов на 1 каждый раз, когда вы добавляете одноранговый узел, обычно является самым простым способом выделения IP-адресов.

Аналогично, обратите внимание, как вторая Addressстрока использует IPv6-адрес из подсети, которую вы создали ранее, и увеличивает адрес сервера на единицу. Опять же, любой IP-адрес в диапазоне действителен, если вы решите использовать другой адрес.

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

Если вы используете только IPv4, опустите конечный fd24:609a:6c18::/64диапазон (включая ,запятую). И наоборот, если вы используете только IPv6, включите только fd24:609a:6c18::/64префикс и исключите 10.8.0.0/24 диапазон IPv4.

В обоих случаях, если вы хотите отправлять весь трафик вашего партнера через VPN и использовать сервер WireGuard в качестве шлюза для всего трафика, вы можете использовать 0.0.0.0/0, который представляет все адресное пространство IPv4 и ::/0все адресное пространство IPv6.

(Необязательно) Настройка узла для маршрутизации всего трафика через туннель

Если вы решили маршрутизировать весь трафик однорангового узла через туннель с помощью маршрутов 0.0.0.0/0или ::/0, а одноранговый узел является удаленной системой, вам необходимо выполнить шаги, описанные в этом разделе. Если ваш пир является локальной системой, то лучше пропустить этот раздел.

Для удаленных пиров, к которым вы обращаетесь через SSH или какой-либо другой протокол с использованием общедоступного IP-адреса, вам нужно будет добавить некоторые дополнительные правила в wg0.confфайл пира. Эти правила обеспечат возможность подключения к системе из-за пределов туннеля, когда он подключен. В противном случае, когда туннель установлен, весь трафик, который обычно обрабатывается на общедоступном сетевом интерфейсе, не будет правильно маршрутизироваться в обход wg0туннельного интерфейса, что приведет к недоступности удаленной системы.

Во-первых, вам нужно определить IP-адрес, который система использует в качестве шлюза по умолчанию. Выполните следующую ip routeкоманду:

ip route list table main default

Вы получите следующий вывод:

Outputdefault via 203.0.113.1 dev eth0 proto static

Обратите внимание на выделенный IP-адрес шлюза 203.0.113.1для последующего использования и устройство eth0. Имя вашего устройства может быть другим. Если это так, замените его в eth0следующих командах.

Затем найдите общедоступный IP-адрес системы, изучив устройство с помощью ip address showкоманды:

ip -brief address show eth0

Вы получите следующий вывод:

Output eth0             UP             203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64

В этом примере выделенный 203.0.113.5IP-адрес (без завершающего /20) — это общедоступный адрес, назначенный eth0устройству, которое необходимо добавить в конфигурацию WireGuard.

Теперь откройте файл узла WireGuard /etc/wireguard/wg0.confс помощью nanoредактора или в предпочитаемом вами редакторе.

sudo nano /etc/wireguard/wg0.conf

Перед [Peer]строкой добавьте следующие 4 строки:

PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1

[Peer]
. . .

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

  • PostUp = ip rule add table 200 from 203.0.113.5– Эта команда создает правило, которое проверяет наличие любых записей маршрутизации в нумерованной таблице, 200когда IP-адрес совпадает с общедоступным 203.0.113.5адресом системы.
  • PostUp = ip route add table 200 default via 203.0.113.1– Эта команда гарантирует, что любой трафик, обрабатываемый 200таблицей, будет использовать 203.0.113.1для маршрутизации шлюз, а не интерфейс WireGuard.

Строки PreDownудаляют пользовательское правило и маршрут при отключении туннеля.

Примечание. 200При построении этих правил номер таблицы является произвольным. Вы можете использовать значение от 2 до 252 или использовать собственное имя, добавив метку к /etc/iproute2/rt_tablesфайлу, а затем ссылаясь на имя вместо числового значения.

Если вы направляете весь одноранговый трафик через VPN, убедитесь, что вы правильно настроили правила sysctlи iptables правила на сервере WireGuard на шаге 4 — Настройка сетевой конфигурации сервера WireGuard и на шаге 5 — Настройка брандмауэра сервера WireGuard .

(Необязательно) Настройка DNS-преобразователей WireGuard Peer

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

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

Чтобы добавить резолверы DNS в конфигурацию вашего партнера, сначала определите, какие DNS-серверы использует ваш WireGuard Server. Выполните следующую команду на сервере WireGuard , заменив имя вашего устройства Ethernet, eth0если оно отличается от этого примера:

resolvectl dns eth0

Вы должны получить вывод, подобный следующему:

Output Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

Выводимые IP-адреса — это DNS-преобразователи, используемые сервером. Вы можете использовать любой или все из них или только IPv4 или IPv6 в зависимости от ваших потребностей. Запишите преобразователи, которые вы будете использовать.

Затем вам нужно будет добавить выбранные преобразователи в файл конфигурации узла WireGuard Peer. Вернитесь к WireGuard Peer , откройте /etc/wireguard/wg0.confфайл с помощью nanoили предпочитаемого вами редактора:

sudo nano /etc/wireguard/wg0.conf

Перед [Peer]строкой добавьте следующее:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Опять же, в зависимости от ваших предпочтений или требований к IPv4 и IPv6, вы можете редактировать список в соответствии со своими потребностями.

Подключившись к VPN на следующем шаге, вы можете проверить, отправляете ли вы DNS-запросы через VPN, используя такой сайт, как DNSутечка test.com .

Вы также можете проверить, что ваш одноранговый узел использует настроенные преобразователи с помощью resolvectl dnsкоманды, аналогичной той, которую вы запустили на сервере. Вы должны получить вывод, подобный следующему, показывающий преобразователи DNS, которые вы настроили для туннеля VPN:

OutputGlobal: 67.207.67.2 67.207.67.3
. . .

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

Шаг 8 — Добавление открытого ключа узла на сервер WireGuard

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

Убедитесь, что у вас есть копия base64закодированного открытого ключа для узла WireGuard, выполнив:

sudo cat /etc/wireguard/public.key
Output PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Теперь войдите на сервер WireGuard и выполните следующую команду:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

Обратите внимание, что allowed-ipsчасть команды принимает список адресов IPv4 и IPv6, разделенных запятыми. Вы можете указать отдельные IP-адреса, если хотите ограничить IP-адрес, который одноранговый узел может назначать себе, или диапазон, как в примере, если ваши одноранговые узлы могут использовать любой IP-адрес в диапазоне VPN. Также обратите внимание, что никакие два одноранговых узла не могут иметь одинаковые allowed-ipsнастройки.

Если вы хотите обновить allowed-ipsсуществующий одноранговый узел, вы можете снова запустить ту же команду, но изменить IP-адреса. Поддерживается несколько IP-адресов. Например, чтобы изменить только что добавленный одноранговый узел WireGuard, чтобы добавить IP -адрес 10.8.0.100к существующим 10.8.0.2и fd24:609a:6c18::2IP-адресам, вы должны выполнить следующее:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

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

sudo wg
Outputinterface: wg0
 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
 private key: (hidden)
 listening port: 51820

peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128

Обратите внимание, как в peerстроке показан открытый ключ узла WireGuard, а также IP-адреса или диапазоны адресов, которые ему разрешено использовать для присвоения себе IP-адреса.

Теперь, когда вы определили параметры соединения узла на сервере, следующим шагом будет запуск туннеля на узле.

Шаг 9 — Подключение узла WireGuard к туннелю

Теперь, когда ваш сервер и одноранговый узел настроены на поддержку вашего выбора IPv4, IPv6, переадресации пакетов и разрешения DNS, пришло время подключить одноранговый узел к VPN-туннелю.

Поскольку вы можете захотеть, чтобы VPN была включена только для определенных случаев использования, мы будем использовать wg-quickкоманду для установки соединения вручную. Если вы хотите автоматизировать запуск туннеля, как вы это делали на сервере, выполните шаги, описанные в разделе « Шаг 6 — Запуск сервера WireGuard », вместо использования wq-quick команды.

Если вы направляете весь трафик через VPN и настроили переадресацию DNS, вам необходимо установить resolvconfутилиту на узел WireGuard перед запуском туннеля. Запустите следующую команду, чтобы настроить это:

sudo apt install resolvconf

Чтобы запустить туннель, выполните на узле WireGuard следующее:

sudo wg-quick up wg0

Вы получите следующий вывод:

Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x

Обратите внимание на выделенные адреса IPv4 и IPv6, которые вы назначили узлу.

Если вы установите для AllowedIPsоднорангового узла значение 0.0.0.0/0и ::/0(или используйте диапазоны, отличные от тех, которые вы выбрали для VPN), то ваши выходные данные будут выглядеть следующим образом:

Output[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.8.0.2/24 dev wg0
[#] ip -6 address add fd24:609a:6c18::2/64 dev wg0
[#] ip link set mtu 1420 up dev wg0
[#] resolvconf -a tun.wg0 -m 0 -x
[#] wg set wg0 fwmark 51820
[#] ip -6 route add ::/0 dev wg0 table 51820
[#] ip -6 rule add not fwmark 51820 table 51820
[#] ip -6 rule add table main suppress_prefixlength 0
[#] ip6tables-restore -n
[#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820
[#] ip -4 rule add not fwmark 51820 table 51820
[#] ip -4 rule add table main suppress_prefixlength 0
[#] sysctl -q net.ipv4.conf.all.src_valid_mark=1
[#] iptables-restore -n

В этом примере обратите внимание на выделенные маршруты, добавленные командой, которые соответствуют AllowedIPs конфигурации однорангового узла.

Проверить состояние туннеля на пире можно с помощью wgкоманды:

sudo wg
Outputinterface: wg0
 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
 private key: (hidden)
 listening port: 49338
 fwmark: 0xca6c

peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
 endpoint: 203.0.113.1:51820
 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
 latest handshake: 1 second ago
 transfer: 6.50 KiB received, 15.41 KiB sent

Вы также можете снова проверить статус на сервере, и вы получите аналогичный результат.

Убедитесь, что ваш одноранговый узел использует VPN, используя команды ip routeи ip -6 route. Если вы используете VPN в качестве шлюза для всего вашего интернет-трафика, проверьте, какой интерфейс будет использоваться для трафика, предназначенного для распознавателей CloudFlare 1.1.1.1и 2606:4700:4700::1111DNS.

Если вы используете WireGuard только для доступа к ресурсам в VPN, замените действительный адрес IPv4 или IPv6, например, сам шлюз, в эти команды. Например 10.8.0.1или fd24:609a:6c18::1.

ip route get 1.1.1.1
Output 1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache

Обратите внимание, что wg0устройство используется и адрес IPv4 10.8.0.2, который вы назначили узлу. Аналогичным образом, если вы используете IPv6, выполните следующее:

ip -6 route get 2606:4700:4700::1111
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

Снова обратите внимание на wg0интерфейс и адрес IPv6 fd24:609a:6c18::2, который вы назначили узлу.

Если у вашего партнера установлен браузер, вы также можете посетить ipleak.net и ipv6-test.com , чтобы убедиться, что ваш партнер направляет свой трафик через VPN.

Когда вы будете готовы отключиться от VPN на узле, используйте wg-quickкоманду:

sudo wg-quick down wg0

Вы получите следующий вывод, указывающий, что VPN-туннель закрыт:

Output[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f

Если вы установите для AllowedIPs однорангового узла значение 0.0.0.0/0 и ::/0(или используйте диапазоны, отличные от тех, которые вы выбрали для VPN), то ваши выходные данные будут выглядеть следующим образом:

Output[#] ip rule delete table 200 from 203.0.113.5
[#] ip route delete table 200 default via 203.0.113.1
[#] ip -4 rule delete table 51820
[#] ip -4 rule delete table main suppress_prefixlength 0
[#] ip -6 rule delete table 51820
[#] ip -6 rule delete table main suppress_prefixlength 0
[#] ip link delete dev wg0
[#] resolvconf -d tun.wg0 -f
[#] iptables-restore -n
[#] ip6tables-restore -n

Чтобы повторно подключиться к VPN, снова запустите wg-quick up wg0команду на узле. Если вы хотите полностью удалить конфигурацию однорангового узла с сервера WireGuard, вы можете запустить следующую команду, обязательно заменив правильный открытый ключ для однорангового узла, который вы хотите удалить:

sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

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