Как настроить WireGuard VPN в Ubuntu 22.04
Это руководство существует для этих версий ОС
- Ubuntu 22.04 (Jammy Jellyfish)
- Ubuntu 20.04 (Focal Fossa)
На этой странице
- Предпосылки
- Шаг 1. Установка Wireguard и создание пары ключей
- Шаг 2. Выбор адресов IPv4 и IPv6
- Выбор диапазона IPv4
- Выбор диапазона IPv6
- Создание пары ключей Wireguard Peers
- Создайте файл конфигурации однорангового узла
- Настройте одноранговый узел для маршрутизации всего трафика через туннель.
- Настройка DNS-преобразователей одноранговых узлов
Wireguard — это кроссплатформенная реализация виртуальной частной сети (VPN) с открытым исходным кодом, в которой используется современная криптография. Он поддерживает соединения IPv4 и IPv6. Он быстрее, проще и функциональнее протоколов IPSec и OpenVPN. Он разработан как VPN общего назначения для работы на встроенных интерфейсах и суперкомпьютерах и работает на Linux, Windows, macOS, iOS, Android и различных других платформах.
Шифрование Wireguard работает с использованием закрытых и открытых ключей для одноранговых узлов, чтобы установить зашифрованный туннель между собой.
В этом руководстве рассказывается, как установить Wireguard VPN на сервер Ubuntu 22.04 и подключиться к нему с помощью клиента Ubuntu.
Предпосылки
-
A server running Ubuntu 22.04 supports both IPv4 and IPv6 connections.
-
A client running Ubuntu 22.04 to connect to the Wireguard server. For our tutorial, we will be using our local machine as our client but you can use a remote server for it.
-
A non-root user with sudo privileges.
-
The uncomplicated Firewall(UFW) is enabled and running.
-
Everything is updated.
$ sudo apt update && sudo apt upgrade
Шаг 1 — Установите Wireguard и сгенерируйте пару ключей
Ubuntu 22.04 поставляется с последней версией Wireguard. Установите WireGuard.
$ sudo apt install wireguard
Следующим шагом является создание пары закрытого и открытого ключей для сервера. Создайте закрытый ключ для сервера с помощью команды
wg genkey
.$ wg genkey | sudo tee /etc/wireguard/private.key
Измените разрешения для защиты закрытого ключа. Команда
chmod go=
блокирует доступ других пользователей и групп к файлу. Вы получите зашифрованный ключ на свой терминал. Обратите внимание на ключ, потому что он потребуется позже.$ sudo chmod go= /etc/wireguard/private.key
Затем сгенерируйте соответствующий открытый ключ, полученный из закрытого ключа. Используйте
wg pubkey
для создания открытого ключа. Следующая команда состоит из трех частей, где первая часть выводит закрытый ключ, который используется командойwg pubkey
для создания открытого ключа, который затем сохраняется в соответствующем файле.$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Вы снова получите открытый ключ на терминале. Запишите это.
Шаг 2. Выбор адресов IPv4 и IPv6.
Нам нужно определить частные адреса IPv4 и IPv6 для использования с вашим сервером Wireguard и пирами.
Выбор диапазона IPv4
Чтобы использовать Wireguard с одноранговыми узлами IPv4, серверу необходим диапазон частных IPv4-адресов для его туннельного интерфейса. Вы можете выбрать любой диапазон IP-адресов из следующих зарезервированных блоков адресов:
- От
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-адресов, предоставленный вашей хостинговой компанией.
Выбор диапазона IPv6
В соответствии с алгоритмом RFC рекомендуемый способ получения уникального префикса IPv6 — объединить время суток с уникальным значением, таким как идентификатор машины. Затем эти значения хэшируются и усекаются для использования в качестве уникального адреса в зарезервированном частном блоке IP-адресов
fd00::/8
.Первый шаг — собрать 64-битную метку времени с помощью утилиты
date
.$ date +%s%N
Он будет генерировать вывод, аналогичный следующему, который представляет собой количество секунд, прошедших с момента эпохи Unix (00:00 UTC 1 января 1970 г.).
1659342559092041940
Запишите значение для последующего использования. Затем скопируйте значение
machine-id
вашего сервера. Это значение уникально для каждой системы.$ cat /var/lib/dbus/machine-id
Вы получите аналогичный результат.
d97e195db6584d63aeedfdc35dc83c7f
Затем объедините отметку времени с
идентификатором_машины
и хешируйте строку с помощью алгоритма SHA-1.printf <timestamp><machine-id> | sha1sum
Замените значения
и
в приведенной выше команде. Вы получите другое значение хеш-функции.$ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sum d789c02d9d8faef806d40ec15b307d4d9c8ec4bc -
Выполните следующую команду, чтобы обрезать вывод
printf
в соответствии с алгоритмом RFC.$ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-
Вы должны получить следующий вывод.
4d9c8ec4bc
В приведенном выше выводе набор байтов равен
4d 9c 8e c4 bc
. Создайте адрес IPv6, добавив к 5 байтам выше префиксfd
следующим образом.Используя байты, ранее сгенерированные с размером подсети
/64
, результирующий префикс будет следующим.Unique Local IPv6 Address Prefix fd4d:9c8e:c4bc::/64
Чтобы выделить IP для сервера, добавьте 1 после последних символов
::
. Результирующий адрес будетfd4d:9c8e:c4bc::1/64
. Одноранговые узлы используют IP-адрес, добавляя еще одно приращение, такое какfd4d:9c8e:c4bc::2/64
.Шаг 3 — Настройте Wireguard
Сгенерируйте конфигурационный файл и откройте его для редактирования.
$ sudo nano /etc/wireguard/wg0.conf
Вставьте в него следующий код. Замените
server_private_key
закрытым ключом, сгенерированным на шаге 1. Вы можете изменить порт прослушивания на любой другой.[Interface] PrivateKey = server_private_key Address = 10.8.0.1/24, fd4d:9c8e:c4bc::/64 ListenPort = 51820 SaveConfig = true
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Шаг 4 — Настройте сеть Wireguard
Чтобы направить трафик пиров через сервер Wireguard, вам необходимо настроить IP-переадресацию. Откройте файл
/etc/sysctl.conf
для редактирования.$ sudo nano /etc/sysctl.conf
Раскомментируйте следующие строки, удалив перед ними знак решетки.
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1 # Uncomment the next line to enable packet forwarding for IPv6 # Enabling this option disables Stateless Address Autoconfiguration # based on Router Advertisements for this host net.ipv6.conf.all.forwarding=1
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса. Проверьте новые значения с помощью следующей команды.
$ sudo sysctl -p net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 vm.swappiness = 0
Теперь ваш сервер Wireguard будет перенаправлять весь входящий трафик с Ethernet-устройства VPN на другие устройства на сервере, а оттуда — в общедоступный Интернет. Это позволяет серверу направлять весь веб-трафик от однорангового узла через IP-адрес сервера и скрывать IP-адрес клиента.
Следующим шагом является настройка правил брандмауэра для правильной работы переадресации.
Шаг 5. Настройте брандмауэр Wireguard Servers.
Чтобы разрешить трафик VPN через брандмауэр серверов, вам необходимо включить маскировку, которая обеспечивает динамическую трансляцию сетевых адресов (NAT) на лету для маршрутизации клиентских подключений.
Найдите общедоступный сетевой интерфейс вашего сервера Wireguard.
$ ip route list default default via 209.23.8.1 dev eth0 proto static
В соответствии с приведенной выше командой
eth0
является общедоступным интерфейсом.Откройте файл конфигурации Wireguard, чтобы добавить правила брандмауэра на ваш сервер Wireguard.
$ sudo nano /etc/wireguard/wg0.conf
Вставьте следующие строки в конец файла после строки
SaveConfig=true
.. . . 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
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Строки
PostUp
запускаются, когда сервер Wireguard запускает VPN-туннель. Первое правило разрешает пересылать трафик IPv4 и IPv6. Второе и третье правило настраивают маскировку трафика IPv4 и IPv6. СтрокиPreDown
запускаются, когда сервер Wireguard останавливает VPN-туннель.Последним шагом в настройке брандмауэра является разрешение входящего и исходящего трафика через UDP-порт Wireguard. Используйте простой брандмауэр (UFW), чтобы открыть порт Wireguard.
Проверьте состояние брандмауэра.
$ sudo ufw status
Вы должны увидеть что-то вроде следующего.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6)
Откройте порт 51820, настроенный на шаге 1. Если вы используете другой порт для Wireguard, откройте этот порт.
$ sudo ufw allow 51820/udp
Отключите и снова включите брандмауэр UFW, чтобы загрузить изменения из всех файлов, измененных на этом шаге.
$ sudo ufw disable $ sudo ufw enable
Проверьте статус еще раз для подтверждения.
Status: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 51820/udp ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 51820/udp (v6) ALLOW Anywhere (v6)
Ваш сервер Wireguard настроен на обработку трафика VPN, включая пересылку и маскировку для одноранговых узлов.
Шаг 6 — Запустите сервер WireGuard
Wireguard можно настроить для работы в качестве службы с помощью скрипта
wg-quick
. Включите службу Wireguard.$ sudo systemctl enable
Часть имени службы
wg0
соответствует файлу/etc/wireguard/wg0.conf
. Это означает, что вы можете создать столько туннелей VPN, сколько захотите, используя другой файл конфигурации и службу.Запустите службу Wireguard.
$ sudo systemctl start
Проверить статус услуги.
$ sudo systemctl status
Вы получите аналогичный результат.
? - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-08-01 11:35:59 UTC; 6s 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: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 3935 (code=exited, status=0/SUCCESS) CPU: 216ms Aug 01 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/63 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg0 Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth0 Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added (v6) Aug 01 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE Aug 01 11:35:59 wireguard systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
Шаг 7 — Установка и настройка узла Wireguard
Установите клиент Wireguard на узле на базе Ubuntu 22.04.
$ sudo apt update $ sudo apt install wireguard
Если вы устанавливаете на локальный рабочий стол Ubuntu, скорее всего, Wireguard предустановлен.
Создайте пару ключей Wireguard Peers
Создайте пару ключей на узле таким же образом, как вы делали это на шаге 1. Кроме того, предоставьте разрешения закрытому ключу.
$ wg genkey | sudo tee /etc/wireguard/private.key $ sudo chmod go= /etc/wireguard/private.key
Создайте открытый ключ.
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Создайте файл конфигурации однорангового узла
Чтобы создать файл конфигурации однорангового узла, вам понадобятся следующие вещи:
- Закодированный
base64
закрытый ключ, сгенерированный на узле. - Диапазоны адресов IPv4 и IPv6, определенные на сервере Wireguard.
- Открытый ключ в кодировке
base64
с сервера Wireguard. - Общедоступный IP-адрес и номер порта сервера Wireguard. Если ваш сервер и клиент имеют соединение IPv6, вам необходимо использовать адрес IPv6.
Создайте и откройте файл конфигурации Peer для редактирования.
$ sudo nano /etc/wireguard/wg0.conf
Вставьте в него следующий код.
[Interface] PrivateKey = peer_private_key Address = 10.8.0.2/24 Address = fd4d:9c8e:c4bc::2/64 [Peer] PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64 Endpoint = 209.23.10.202:51820 PersistentKeepalive = 15
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Первый ключ — это закрытый ключ, сгенерированный на узле. В первой адресной строке используется адрес IPv4 из выбранной ранее подсети. Во второй адресной строке используется адрес IPv6 из выбранной ранее подсети.
Второй ключ — это открытый ключ, сгенерированный на сервере.
AllowedIPs
использует диапазоны IPv4 и IPv6, выбранные до этого, указывая одноранговому узлу отправлять трафик через VPN только в том случае, если целевая система имеет IP-адрес в любом из диапазонов. Вы можете опустить адреса IPv6, если используете только соединение IPv4.Настройте Peer для маршрутизации всего трафика через туннель
Найдите IP-адрес, который система использует в качестве шлюза по умолчанию. Выполните следующую команду
ip route
.$ ip route list table main default
Вы получите аналогичный результат.
default via 69.28.84.1 dev eth0 proto static
Обратите внимание на IP-адрес шлюза и имя устройства. Найдите общедоступный IP-адрес узла.
$ ip -brief address show eth0
Вы получите аналогичный результат.
eth0 UP 69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64
Откройте файл конфигурации однорангового узла для редактирования.
$ sudo nano /etc/wireguard/wg0.conf
Вставьте следующие строки перед разделом
[Peer]
.PostUp = ip rule add table 200 from 69.28.84.160 PostUp = ip route add table 200 default via 69.28.84.1 PreDown = ip rule delete table 200 from 69.28.84.160 PreDown = ip route delete table 200 default via 69.28.84.1 [Peer] . . .
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Команда
PostUp
создает правило для проверки любых записей маршрутизации в таблице 200, когда IP-адрес совпадает с общедоступным IP-адресом системы. КомандаPreDown
гарантирует, что трафик, обрабатываемый таблицей 200, использует для маршрутизации шлюз203.0.113.1
вместо интерфейса Wireguard.Настройка DNS-преобразователей одноранговых узлов
Выполните следующую команду на сервере, заменив
eth0
именем вашего устройства Ethernet, если оно отличается.$ resolvectl dns eth0
Вы получите аналогичный результат.
Link 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844
Откройте файл конфигурации пиров.
$ sudo nano /etc/wireguard/wg0.conf
Добавьте следующий код перед строкой
[Peer]
.DNS = 209.208.127.65 2001:4860:4860::8888 [Peer] . . .
Сохраните файл, нажав Ctrl + X и введя Y при появлении запроса.
Шаг 8. Добавление открытого ключа узла к серверу Wireguard
Проверьте открытый ключ на узле Wireguard.
$ sudo cat /etc/wireguard/public.key PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Выполните следующую команду на сервере Wireguard.
$ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
Чтобы обновить
разрешенные IP-адреса
для существующего однорангового узла, снова запустите приведенную выше команду, изменив IP-адрес.Проверьте состояние туннеля на сервере.
$ sudo wg interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128
Шаг 9 — Подключение узла к туннелю
Установите пакет
resolvconf
, если вы направляете весь трафик через VPN.$ sudo apt install resolvconf
Запустите туннель на узле.
$ sudo wg-quick up wg0
Вы получите аналогичный результат.
[#] 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 fd4d:9c8e:c4bc::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] ip rule add table 200 from 69.28.84.160 [#] ip route add table 200 default via 69.28.84.1
Проверьте состояние туннеля на узле.
$ sudo wg interface: wg0 public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= private key: (hidden) listening port: 45392 peer: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8= endpoint: 209.23.10.202:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 23 seconds ago transfer: 92 B received, 212 B sent persistent keepalive: every 15 seconds
Это подтверждает соединение между узлом и VPN.
Убедитесь, что партнер использует VPN.
$ ip route get 10.0.8.1 10.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache
Если вы используете IPv6, используйте вместо этого следующую команду.
$ ip -6 route get fd24:609a:6c18::1 fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium
Используйте следующую команду для отключения однорангового узла.
$ sudo wg-quick down wg0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f
Используйте следующую команду, чтобы удалить одноранговую конфигурацию на сервере.
$ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove
Заключение
На этом руководство по установке и настройке Wireguard VPN на сервере Ubuntu 22.04 и подключению его к клиенту завершено. Если у вас есть какие-либо вопросы, задайте их в комментариях ниже.