notby.NET Logo

Настройка VPN сервера WireGuard в Linux (Debian/Ubuntu)

Когда необходимо защитить личные данные при подключении через публичную Wi-Fi сеть, небезопасного интернет провайдера или повысить свою “анонимность” и безопасность в интернете, необходимо использовать VPN для шифрования трафика. VPN также очень удобно использовать, чтобы избавится от частой капчи и всегда заходить с одного IP-адреса из любого места. В качестве VPN сервера и клиента в статье будет рассмотрен WireGuard. Это очень легкий, быстрый, открытый и безопасный VPN протокол.

Сервер для VPN может быть куплен у провайдера VDS или можно использовать домашний сервер с внешним IP адресом. В статье будет показана установка и настройка в дистрибутивах Debian / Ubuntu. В других операционных системах Linux настройка происходит аналогично, за исключением непосредственной установки самого WireGuard.

Все действия выполняются от root пользователя или с его привилегиями через sudo.

su -

1. Установка WireGuard в Debian / Ubuntu

Для раздачи интернета через VPN сервер WireGuard необходимо установить утилиту iptables, через нее происходит настройка файрвола и маршрутизации в Linux.

Устанавливаем WireGuard и iptables

apt install wireguard iptables
Установка VPN WireGuard и утилиты iptables через консольную команду “apt install wireguard iptables” в операционной системе Debian

Дожидаемся окончания установки.

2. Настройка системы Linux

Чтобы была возможность раздавать интернет внутри VPN сети, необходимо разрешить перенаправление пакетов внутри ядра Linux. Без этих параметров не получится настроить маршрутизацию.

Открываем файл /etc/sysctl.conf

nano /etc/sysctl.conf

Добавляем следующие строки в конец файла (или их можно раскомментировать внутри файла, если они там есть)

net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1

Если сервер не располагает подключением IPv6 или VPN будет использовать только IPv4, строку net.ipv6.conf.all.forwarding=1 можно не добавлять.

Выполняем команду применения изменений в файле sysctl.conf

sysctl -p
Выполнена команду “sysctl -p” в операционной системе Debian, выведены параметры net.ipv4.ip_forward=1, net.ipv6.conf.all.forwarding=1

3. Генерация ключей для сервера и клиента WireGuard

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

3.1. Генерация ключей сервера

Я накидал консольную команду которая выведет пару ключей на экран терминала и их можно будет скопировать в блокнот или использовать другое окно терминала. Для генерации приватного ключа используется команда wg genkey, для генерации публичного ключа используется команда wg pubkey и в качестве параметра для нее передается приватный ключ через временную переменную WGKEY.

Генерируем приватный и публичный ключ сервера:

WGKEY=$(wg genkey); echo "Server Private Key: $WGKEY"; echo $WGKEY | echo "Server Public Key: $(wg pubkey)"

Значение Server Private Key необходимо будет вставить в файл конфигурации сервера, а значение Server Public Key в файл конфигурации клиента.

Выполнена консольная команда для генерации пары ключей WireGuard сервера в терминале Debian, выведены ключи Server Private Key и Server Public Key

Генерировать ключи можно на любом компьютере где уставлен WireGuard, необязательно на сервере, где будет работать VPN сервер.

3.2. Генерация ключей клиента

Консольная команда генерации ключей аналогичен предыдущей, но с добавлением генерации Pre-Shared Key через команду wg genpsk и заменой слова Server на Client

Ключ Pre-Shared Key используется для дополнительного шифрования внутри основного. Оно необходимо для защиты от расшифровки трафика инопланетными цивилизациями при помощи квантовых компьютеров или в будущем квантовым компьютером созданным человечеством.

Генерируем приватный и публичный ключ клиента:

WGKEY=$(wg genkey); echo "Client Private Key: $WGKEY"; echo $WGKEY | echo "Client Public Key: $(wg pubkey)"; echo "Client Pre-Shared Key: $(wg genpsk)"

Значения Client Private Key и Client Pre-Shared Key необходимо будет вставить в файл конфигурации клиента, а значение Client Public Key в файл конфигурации сервера.

Выполнена консольная команда для генерации ключей WireGuard клиента в терминале Debian, выведены ключи Server Private Key, Server Public Key и Client Pre-Shared Key

Для каждого отдельного пользователя/устройства необходимо генерировать свои ключи.

4. Получение имени сетевой карты

Перед настройкой конфигурации сервера необходимо знать имя сетевой карты которая смотрит в интернет.

Выводим список всех сетевых интерфейсов и находим имя нужной сетевой карты

ip a

Или можно получить имя сетевой карты, которая использует шлюз по умолчанию командой

ip route ls | grep default | grep -Po '(?<=dev )(\S+)'
ens33

В моем случае команда вывела имя ens33 сетевого интерфейса, который получает интернет. Почти во всех случаях команда выведет имя нужной сетевой карты.

5. Настройка и конфигурация WireGuard сервера (wg0.conf)

Создаем файл конфигурации wg0.conf для VPN сервера WireGuard в каталоге /etc/wireguard/

nano /etc/wireguard/wg0.conf

Описание основных параметров конфигурационного файла wg0.conf (строки для работы в сетях IPv6 закомментированы)

# Файл конфигурации VPN сервера WireGuard 
#
# Раздел "Interface" относится к настройкам сервера
[Interface]
# Приватный ключ сервера из значения "Server Private Key"
PrivateKey = cGPZcXmwUaj0M7dVGjPg5NgCUgqhKSOzMI4TXFQlZVw=
# IP адрес сервера и маска внутренней сети VPN
Address = 192.168.10.1/24
#Address = fd20:20:20::1/64
# Порт сервера
ListenPort = 51820
# Настройка маршрутизации через iptables утилиту
# Команды PostUp будут выполнены после запуска сервера
# Разрешить входящие соединения udp на 51820 порт
PostUp = iptables -I INPUT -p udp --dport 51820 -j ACCEPT
# Разрешить маршрутизацию и трафик на интерфейс WireGuard
# Вместо "ens33" необходимо указать свою сетевую карту
PostUp = iptables -I FORWARD -i ens33 -o %i -j ACCEPT
PostUp = iptables -I FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
#PostUp = ip6tables -I FORWARD -i %i -j ACCEPT
#PostUp = ip6tables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
# Команды PostDown будут выполнены после остановки сервера и они аналогичны PostUp,
# за исключением изменений параметров команд на -D (удалить правило)
PostDown = iptables -D INPUT -p udp --dport 51820 -j ACCEPT
PostDown = iptables -D FORWARD -i ens33 -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE
#PostDown = ip6tables -D FORWARD -i %i -j ACCEPT
#PostDown = ip6tables -t nat -D POSTROUTING -o ens33 -j MASQUERADE

# Разделы "Peer" относится к настройкам клиентов
[Peer]
# Публичный ключ клиента из значения "Clinet Puplic Key"
PublicKey = gd5ftQapFAthdbASFYOlzqqx2XVtJcYln3rl8PoCRxQ=
# Ключ PSK из значения "Clinet Pre-Shared Key"
PresharedKey = CPK5G7rHbmmMbCQOckhczwiNEScEgdq+ADgeDSB1cHk=
# IP адрес клиента (указание маски 32 обязательно для IPv4)
AllowedIPs = 192.168.10.2/32
#AllowedIPs = fd20:20:20::2/128

# Настройка для второго устройства
#[Peer]
#PublicKey = "Clinet Puplic Key"
#PresharedKey = "Clinet Pre-Shared Key"
#AllowedIPs = 192.168.10.3/32

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

[Interface]
PrivateKey = cGPZcXmwUaj0M7dVGjPg5NgCUgqhKSOzMI4TXFQlZVw=
Address = 192.168.10.1/24
ListenPort = 51820
PostUp = iptables -I INPUT -p udp --dport 51820 -j ACCEPT
PostUp = iptables -I FORWARD -i ens33 -o %i -j ACCEPT
PostUp = iptables -I FORWARD -i %i -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -o ens33 -j MASQUERADE
PostDown = iptables -D INPUT -p udp --dport 51820 -j ACCEPT
PostDown = iptables -D FORWARD -i ens33 -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -o ens33 -j MASQUERADE

[Peer]
PublicKey = gd5ftQapFAthdbASFYOlzqqx2XVtJcYln3rl8PoCRxQ=
PresharedKey = CPK5G7rHbmmMbCQOckhczwiNEScEgdq+ADgeDSB1cHk=
AllowedIPs = 192.168.10.2/32

Основные изменения которые необходимо внести в файл конфигурации:

  • параметр PrivateKey необходимо изменить на свой приватный ключ сервера из “Server Private Key”;
  • вместо ens33 необходимо указать имя своей сетевой карты;
  • параметр PublicKey необходимо изменить на свой публичный ключ клиента из “Client Private Key”;
  • параметр PresharedKey необходимо изменить на свой сгенерированный PSK ключ из “Client Pre-Shared Key”.

Вносим необходимые измерения и сохраняем файл.

6. Автозагрузка и запуск VPN сервера WireGuard

Добавляем в автозагрузку, где wg0 — имя файла конфигурации без указания расширения .conf

systemctl enable wg-quick@wg0

Запускаем VPN сервера WireGuard

wg-quick up wg0
VPN сервера WireGuard добавлен в автозагрузку командой “systemctl enable wg-quick@wg0” и запущен командой “wg-quick up wg0” в операционной системе Debian, выведены сообщения процесса запуска WireGuard

Для остановки используем команду

wg-quick down wg0

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

Создаем файл конфигурации WireGuard клиента wg0-client.conf в каталоге /etc/wireguard/

nano /etc/wireguard/wg0-client.conf

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

Описание основных параметров конфигурационного файла WireGuard клиента

# Файл конфигурации VPN клиента WireGuard 
#
# Раздел "Interface" относится к настройкам клиента
[Interface]
# Приватный ключ клиента из значения "Client Private Key"
PrivateKey = gJf7YlthSBWF1khQ0T09B74NmOT25DzDlTR20vhKn1U=
# IP адрес клиента и маска внутренней сети VPN
Address = 192.168.10.2/24
# Публичные DNS сервера или если на сервера VPN запущен DNS,
# то указываем IP адрес WireGuard сервера внутри VPN сети
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001
#DNS = 192.168.10.1

# Раздел "Peer" относится к настройкам подключения к серверу
[Peer]
# Публичный ключ сервера из значения "Server Puplic Key"
PublicKey = UucDMVt6okZXdyh8iRBhq1Qx7+f8BAx6RgCKHdPsZXw=
# Ключ PSK из значения "Clinet Pre-Shared Key"
PresharedKey = CPK5G7rHbmmMbCQOckhczwiNEScEgdq+ADgeDSB1cHk=
# Публичный IP адрес сервера и порт, который был указан в файле wg0.conf
Endpoint = 80.95.110.25:51820
# До каких IP адресов пропускать трафик через VPN
# Весь трафик пускать через WireGuard
AllowedIPs = 0.0.0.0/0, ::/0

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

Компактный файл конфигурации клиента выглядит так:

[Interface]
PrivateKey = gJf7YlthSBWF1khQ0T09B74NmOT25DzDlTR20vhKn1U=
Address = 192.168.10.2/24
DNS = 1.1.1.1, 1.0.0.1, 2606:4700:4700::1111, 2606:4700:4700::1001

[Peer]
PublicKey = UucDMVt6okZXdyh8iRBhq1Qx7+f8BAx6RgCKHdPsZXw=
PresharedKey = CPK5G7rHbmmMbCQOckhczwiNEScEgdq+ADgeDSB1cHk=
Endpoint = 80.95.110.25:51820
AllowedIPs = 0.0.0.0/0, ::/0

Основные изменения которые необходимо внести в файл конфигурации:

  • параметр PrivateKey необходимо изменить на свой приватный ключ клиента из “Client Private Key”;
  • параметр PublicKey необходимо изменить на свой публичный ключ сервера из “Server Private Key”;
  • параметр PresharedKey необходимо изменить на свой сгенерированный PSK ключ из “Client Pre-Shared Key”;
  • в параметре Endpoint необходимо указать IP адрес и порт своего  WireGuard клиента.

Вносим необходимые измерения и сохраняем файл.

8. Генерация QR-кода WireGuard туннеля

С телефона очень удобно получать файл конфигурации через сканирование QR-кода, но для этого файл wg0-client.conf необходимо преобразовать в QR-код. Утилита qrencode может создавать QR-коды и выводить их в консоль.

Устанавливаем утилиту qrencode

apt install qrencode

Генерируем QR-код в консоль

qrencode -t ANSIUTF8 -r /etc/wireguard/wg0-client.conf

где /etc/wireguard/wg0-client.conf — путь до файла конфигурации клиента.

Сгенерирован QR-код конфигурации WireGuard при помощи команды “qrencode -t ANSIUTF8 -r /etc/wireguard/wg0-client.conf” в консоли Debian

9. Подключение к серверу WireGuard

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

9.1. Подключение из Windows к VPN серверу WireGuard 

Запускаем PowerShell и копируем файл wg0-client.conf с сервера через утилиту scp в любое место на компьютере, например на рабочий стол

scp root@80.95.110.25:/etc/wireguard/wg0-client.conf 'C:\Users\User\Desktop\'

Вместо root@80.95.110.25 указываем свои данные для доступа по SSH, вместо User указываем свое имя пользователя Windows.

Запущен PowerShell в Windows 10, выполнена команда “scp root@80.95.110.25:/etc/wireguard/wg0-client.conf 'C:\Users\User\Desktop\'”, файл wg0-client.conf успешно скопирован на рабочий стол

Скачиваем с официального сайта wireguard-installer.exe и запускаем установщик. Произойдет установка WireGuard и он автоматически запустится.

Нажимаем на кнопку Импорт туннелей из файла и выбираем файл, скачанный ранее.

Запущен WireGuard в Windows 10, нажата кнопка “Импорт туннелей из файла”, открыто окно с выбором файлов и выбран файл wg0-client.conf

Подключаемся к WireGuard серверу нажав кнопку Подключить и пробуем куда-нибудь зайти.

Запущен WireGuard в Windows 10, подключен wg0-client туннель, выведена статистика успешного VPN подключения, трафик принимается и передается

Как можно видеть, трафик принимается и передается, VPN WireGuard успешно работает.

Если интернет не работает, то проверяем что пакеты доходят до IP адреса сервера внутри VPN сети и до IP адреса в интернете

ping 192.168.10.1; ping 1.1.1.1

где 192.168.10.1 — IP адрес WireGuard сервера указанный в файле wg0.conf в параметре Address, а IP адрес 1.1.1.1 —  публичный DNS сервер.

9.2. Подключение из Linux к VPN серверу WireGuard 

Устанавливаем WireGuard

apt install wireguard

Копируем файл wg0-client.conf с сервера в каталог /etc/wireguard/ через scp

scp root@80.95.110.25:/etc/wireguard/wg0-client.conf /etc/wireguard/

Подключаемся к WireGuard серверу

wg-quick up wg0-client

где wg0-client — имя файла конфигурации без указания расширения .conf

Проверяем что пакеты доходят до IP адреса сервера внутри VPN сети и до IP адреса в интернете

ping 192.168.10.1 -c 3; ping 1.1.1.1 -c 3

где 192.168.10.1 — IP адрес WireGuard сервера указанный в файле wg0.conf в параметре Address, а IP адрес 1.1.1.1 —  публичный DNS сервер.

Выполнена команда “ping 192.168.10.1 -c 3; ping 1.1.1.1 -c 3” в консоли Debian, успешный пинг до 192.168.10.1 и 1.1.1.1 адресов, потерь нет

Как можно видеть, пинг до VPN сервера WireGuard и публичного DNS 1.1.1.1 успешен, можно пользоватся VPN WireGuard.

Чтобы выключить VPN, используем команду

wg-quick down wg0-client

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

systemctl enable wg-quick@wg0-client

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

systemctl disable wg-quick@wg0-client

9.3. Подключение с телефона Android к VPN серверу WireGuard 

Устанавливаем приложение WireGuard из Google Play.

Запускаем приложение, нажимаем на + в нижней правой части экрана, выбираем из списка Сканировать QR-код и сканируем QR-код из консоли. Можно загрузить файл wg0-client.conf на телефон, выбрать из списка Импорт из файла или архива и указать данный файл.

Приложение WireGuard запущено на Android телефоне, нажата кнопка добавить туннель, выведено меню как можно добавить туннель

Подключаемся к WireGuard серверу и пробуем куда-нибудь зайти.

Приложение WireGuard запущено на Android телефоне, выведена статистика успешного VPN подключения, трафик принимается и передается

Как можно видеть, в статистике трафик принимается и передается, VPN WireGuard успешно работает.