WireGuard
Wire Guard - это современное и эффективное решение для VPN (virtual private network - виртуальная частная сеть), известное своей простотой и производительностью. Оно обеспечивает безопасную связь между системами через Интернет, что делает его отличным выбором для защиты ваших сетевых подключений. В этом руководстве поговорим о процессе установки и настройки WireGuard VPN на базе Debian 12.
Что будет необходимо:
- Debian 12 с доступом sudo или root.
- Базовые знания командной строки Linux.
- Статический публичный 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 не закрываем)

Внесём небольшие изменения в наш кофиг, приведём его к виду:
[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

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

Регистрация клиента на сервере
Для того что-бы сервер узнал клиента, необходимо на сервере запустить команду:
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

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