DT Wiki

wireguard_logo.png WireGuard

Wire Guard - это современное и эффективное решение для VPN (virtual private network - виртуальная частная сеть), известное своей простотой и производительностью. Оно обеспечивает безопасную связь между системами через Интернет, что делает его отличным выбором для защиты ваших сетевых подключений. В этом руководстве поговорим о процессе установки и настройки WireGuard VPN на базе Debian 12.

Что будет необходимо:

  1. Debian 12 с доступом sudo или root.
  2. Базовые знания командной строки Linux.
  3. Статический публичный IP адрес для подключения из вне.

Сервер

Обновление системы

Войдите на свой сервер Debian 12, используя SSH, как пользователь root или пользователь с привилегиями sudo. Сначала обновите список пакетов и обновите установленные пакеты:

sudo apt update && sudo apt upgrade -y

Установка WireGuard

Debian 12 включает WireGuard в свои официальные репозитории, поэтому установка проста. Запустите следующую команду, чтобы установить Wire Guard:

sudo apt install wireguard-tools resolvconf iptables whiptail qrencode curl

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

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

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey

privatekey - содержит закрытый ключ
publickey - содержит открытый ключ
Названия можно присваивать любые.

Настройка WireGuard

Создайте файл конфигурации для сервера Wire Guard. Например, создайте файл /etc/wireguard/wg 0.conf

sudo nano /etc/wireguard/wg0.conf

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

[Interface]
Address = 10.2.1.1/24
SaveConfig = true
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
PostDown = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
ListenPort = 51820
PrivateKey = +LgkFog7eQOqRCNSt/H26uqFbqpaksIDxbZgUoK6OGo=

Interface - Раздел настроек сервера
Address = 10.2.1.1/24 - IP Адрес сервера внутри VPN тонеля
SaveConfig = true - Эта cтрока гарантирует, что при выключении интерфейса WireGuard любые изменения будут сохранены в файле конфигурации.
PostUp = ... - После включения интерфейса WireGuard будет разрешено перенаправление пакетов
PostDown = ... - После выключения интерфейса WireGuard будет правило будет остановлено
ListenPort = 51820 - Порт, по которому происходит соединение
PrivateKey = +LgkFog7eQOqRCNSt/H26uqFbqpaksIDxbZgUoK6OGo= - Закрытый ключ Сервера находится в созданном ранее файле privatekey

Переадресация IP-адресов

Для переадресации IP необходимо включить её в конфиге системы, таким образом наш сервер станет маршрутизатором.
Отредактируйте конфигурацию sysctl, чтобы включить переадресацию IP.

sudo nano /etc/sysctl.conf

Раскомментируйте или добавьте следующую строку:

net.ipv4.ip_forward=1

Сохраните и закройте файл, затем примените изменения:

sudo sysctl -p

Запуск и добавление WireGuard в автозагрузку

Запустите службу WireGuard и включите ее запуск при загрузке командой:

sudo systemctl enable --now wg-quick@wg0

Посмотреть конфигурацию WireGuard сервера можно командой

sudo wg show

Клиент

Конфигурационный файл для клиента можно создать как на сервере так и на клиентской машине, для каждого клиента необходимо создать свою пару ключей подобных серверным, например client1_prkey, client1_pubkey, сформировать client1.conf и отправить его клиенту.

Создание конфига для клиента

Рассмотрим создание на сервере
На сервере запускаем туже команду с новыми именами:

wg genkey | tee client1_prkey | wg pubkey | tee client1_pubkey
sudo nano client1.conf

Заполняем содержимым:

[Interface]
PrivateKey = aNU9yyEhPM2qNlK1u7cZBYMTyT3Sima2y4gyd3M6h3s=
Address = 10.2.1.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = 9krGMleH60QMoEyHFWTYCIU4QBBUD7+LVctAM+gc30M=
AllowedIPs = 0.0.0.0/0
Endpoint = <server_public_ip>:51820
persistent keepalive = 25

Interface - Раздел клиентских данных
PrivateKey = aNU9yyEhPM2qNlK1u7cZBYMTyT3Sima2y4gyd3M6h3s= - Закрытый ключ клиента, находится в созданном ранее файле client1_prkey
Address = 10.2.1.2/32 - IP адрес клиента внутри VPN
DNS = 8.8.8.8 - Адрес DNS сервера

Peer - Раздел данных о сервере
PublicKey = 9krGMleH60QMoEyHFWTYCIU4QBBUD7+LVctAM+gc30M= - Отрытый ключ сервера, находится внутри ранее созданного файла publickey
AllowedIPs = 0.0.0.0/0 - Весь трафик пойдет через сервер, но если здесть прописать подсеть VPN, в нашем случае 10.2.1.0/24, то сервер будет доступен, но при этом остальной трафик будет идти как и до подключения к VPN
Endpoint = <server_public_ip>:51820 - Публичный IP Адрес сервера
persistent keepalive = 25 - Параметр не обязательный если вы используете VPN для выхода на внешние, недоступные в Вашем регионе ресурсы, но если вам необходимо попасть на клиентский ПК, то данный параметр оставляет подключение активным

Передаём client1.conf на машину, которую будем подключать

Запуск клиента на Linux машине

Запуск клиента на клиентской Linux машине производится той же командой, что и на сервере, для Windows рассмотрим далее

sudo wg-quick up client1

Так же его можно добавить в автозагрузку

sudo systemctl enable wg-quick@client1

Запуск клиента на Windows машине

Клиентских ПО для Windows много, выбор большой, поэтому рассмотрим только один - WireSock, скачать можно отсюда либо с помощью winget-а, для этого заходим в командную строку и запускаем Powershell

powershell

Далее запускаем команду уже в powershell-е

winget install NTKERNEL.WireSockVPNClient

Ждем окончания установки (powershell не закрываем)

wiresock-winget-install.png

Внесём небольшие изменения в наш кофиг, приведём его к виду:

[Interface]
PrivateKey = aNU9yyEhPM2qNlK1u7cZBYMTyT3Sima2y4gyd3M6h3s=
Address = 10.2.1.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = 9krGMleH60QMoEyHFWTYCIU4QBBUD7+LVctAM+gc30M=
AllowedIPs = 0.0.0.0/0
AllowedApps = chrome
Endpoint = <server_public_ip>:51820
persistent keepalive = 25

Мы добавили в разделе peer строку "AllowedApps = chrome", которая говорит, что пользоваться VPN будет только Chrome, т.е если мы запустим MS Edge то скажем Facebook будет не доступен, но будут доступны Госуслуги, а если мы запустим Chrome, то будет все наоборот.

Итак, создаим папку в корне диска С: и назовем её wgconf и скопируем туда наш конфиг client1.conf
Возвращаемся в powershell и набираем команду

wiresock-client.exe install -start-type 2 -config C:\wgconf\client1.conf -log-level none

Далее правой клавишей мышы на СТАРТ , выбираем Run (Выполнить) и набираем services.msc

services.msc.png

Находим сервис WireSock WireGuard VPN Client Service правой кнопкой на него и нажимаем Start

wiresock-service.png

Регистрация клиента на сервере

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

sudo wg set wg0 peer BPNHwk1dlwmtteNAgeobu1lGNsW16WsF2A1Par67mUw= allowed-ips 10.2.1.2/32

wg set wg0 peer - команда на добавление нового клиентского раздела peer
BPNHwk1dlwmtteNAgeobu1lGNsW16WsF2A1Par67mUw= - Открытый ключ клинта, находится внутри ранее созданного файла client1_pubkey
allowed-ips 10.0.0.2/32 - IP адрес клиента внутри VPN

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

Автоматизация

Немного автоматизируем процесс создания клиентского конфига на сервере, для этого в домашней папке создадим каталог wgconfigs для хранения конфигов, скрипт makeconfig и сделаем его исполняемым.

cd ~
touch makeconfig.sh
chmod +x makeconfig.sh

Далее заполним его содержимым

#!/bin/bash

USER_HOME=$(eval echo ~${SUDO_USER})

if dpkg -s whiptail &>/dev/null; then
       echo 'Whiptail is Ok'
    else
        echo 'Whiptail is not installed'
        echo 'Installing whiptail... Please Wait...'
        apt install -y whiptail
fi

if ! dpkg -s qrencode &>/dev/null;then
	apt install -y qrencode
fi

if [[ ! -f /root/.loc ]];then
	touch /root/.loc
  echo "11" > /root/.loc
fi

username=$(whiptail --title  "Username"  --inputbox  "Enter your username" 10 60 3>&1 1>&2 2>&3)
serverip=$(curl -s https://icanhazip.com)
serverpubkey=$(cat "/etc/wireguard/publickey")

wg genkey | tee "/etc/wireguard/$username" | wg pubkey | tee "/etc/wireguard/$username""_pub"

pubkey=$(cat "/etc/wireguard/$username""_pub")
privatekey=$(cat "/etc/wireguard/$username")

ip_last=$(cat /root/.loc)
echo "$(($ip_last+1))" > /root/.loc

wg set wg0 peer $pubkey allowed-ips 10.2.1.$ip_last/32

cat <<EOF > "/etc/wireguard/${username}.conf"
[Interface]
PrivateKey = $privatekey
Address = 10.2.1.$ip_last/32
DNS = 8.8.8.8

[Peer]
PublicKey = $serverpubkey
Endpoint = $serverip:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20
EOF

cp /etc/wireguard/$username.conf $USER_HOME/wgconfigs

qrencode -t ansiutf8 < "/etc/wireguard/$username.conf"

Далее CTRL+s и CTRL+x
Делаем файл исполняемым

chmod +x makeconfig.sh

Запускаем созданный ранее скрипт и следуем инструкции

sudo ./makeconfig.sh

wg-user-conf.png

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

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