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

Схема

схема

  1. Серверная часть WireGuard будет стоять на виртуальном сервере, который арендуется у digitalocean
  2. На своём компьютере я ставлю также WireGuard и подключаюсь к серверу (1)
  3. Использую интернет через vpn (2)

Выбор региона для виртуалки

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

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

Для windows (cmd):

{
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-nyc1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-nyc2.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-nyc3.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-ams2.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-ams3.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-sfo1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-sfo2.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-sgp1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-lon1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-fra1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-tor1.digitalocean.com/
    curl -w "%{url_effective};%{time_connect}\n" -o /dev/null -s http://speedtest-blr1.digitalocean.com/
} | sort -t';' -k2

Для Linux:

wget -qO - https://raw.githubusercontent.com/jakejarvis/datacenter-speed-tests/master/ping.sh | bash

Или просто используя ссылку.

Теперь, когда мы определились где именно размещать виртуальный сервер выполняем deploy последней версии ubuntu и назначаем ей floating IP. Об этом я тут писать не буду, но если интересно или вы никогда этого не делали, то можно посмотреть отрезок на видео внизу.

Настройка сервера на ubuntu

1 - Устанавливаем WireGuard и генерируем ключи

Для начала ставим последние обновления и уже потом ставим сам WireGuard.

sudo apt update -y
sudo apt install wireguard -y

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

sudo wg genkey | sudo tee /etc/wireguard/private.key
KPfbJtgKfrWxihTpA2t59ETzcU/yyyyC5rereZDGsdG14=

Также для большей безопасности нелишним будет отобрать права на доступ к файлу у всех кроме владельца.

sudo chmod go= /etc/wireguard/private.key

И следующая команда уже создаст нам публичный ключ.

sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
pnoYatoBe5rrJ9d574t5ttteraxF/91t45t45t51hN5HdCTgfgY=

2 - Выбор ip адресов

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

В этом же шаге мы назначим ip адреса нашей приватной сети. Я решил выбрать подсеть 10.10.0.0/24.

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

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

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

sudo vi /etc/wireguard/wg0.conf
[Interface]
#тут наш приватный ключ /etc/wireguard/private.key
PrivateKey = KPfbJtgKfrWxihTpA2t59ETzcU/yyyyC5rereZDGsdG14=
#приватный ip для сервера
Address = 10.10.0.1/24
ListenPort = 51830
SaveConfig = true

Обратите внимание на ListenPort, это обозначает тот самый порт, к которому будет подключаться ваш клиент. Можно задать любой другой, используется по умолчанию протокол UDP.

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

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

sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1
sudo sysctl -p
net.ipv4.ip_forward = 1

5 - Настройка файрвола WireGuard

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

Для начала определим наш интерфейс, обычно eth0.

ip route list default
default via 128.199.16.1 dev eth0 proto static

Теперь добавляем правила для файрволла в файл конфигурации WireGuard сервера.

sudo vi /etc/wireguard/wg0.conf
[Interface]
#тут наш приватный ключ /etc/wireguard/private.key
PrivateKey = KPfbJtgKfrWxihTpA2t59ETzcU/yyyyC5rereZDGsdG14=
#приватный ip для сервера
Address = 10.10.0.1/24
ListenPort = 51830
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

И осталось разрешить входящие подключения на порт 51830.

sudo ufw allow 51830/udp
sudo ufw allow OpenSSH
sudo ufw disable
sudo ufw enable

6 - Запуск сервера WireGuard

И последний этап, который мы проделываем на самом сервер это запуск сервера WireGuard с тем конфигом что мы сделали.

sudo systemctl enable --now wg-quick@wg0.service
sudo systemctl status wg-quick@wg0.service
Active: active (exited)

Настройка WireGuard на стороне клиента

Так как мне нужен vpn на компьютере с windows для начала мне нужно скачать установочный файл по ссылке. Если у вас другая ОС на клиенте по той же ссылке можно найти инструкцию по установке.

1 - Генерируем ключи

Также, как и для сервера генерируем ключи для клиента.

sudo wg genkey | sudo tee /etc/wireguard/peer-private.key
sudo chmod go= /etc/wireguard/private.key
aMc+s6zWG4ULDMMIkUWcCn7GH1svNQF/FPMlH8EFUWQ=
sudo cat /etc/wireguard/peer-private.key | wg pubkey | sudo tee /etc/wireguard/peer-public.key
c7UpF4kWp6ZJIKRfjiuucjpAx1gC1scldIzxSOF/cw4=

2 - Конфигурации клиента WireGuard

Создаём текстовый файл wg0.conf и записываем в него:

[Interface]
#тут наш приватный ключ /etc/wireguard/peer-private.key
PrivateKey = aMc+s6zWG4ULDMMIkUWcCn7GH1svNQF/FPMlH8EFUWQ=
Address = 10.10.0.2/24

[Peer]
#публичный ключ сервера /etc/wireguard/public.key
PublicKey = pnoYatoBe5rrJ9d574t5ttteraxF/91t45t45t51hN5HdCTgfgY=
AllowedIPs = 10.10.0.0/24
#статический ip сервера
Endpoint = 144.144.144.141:51830

И следующим шагом импортируем настройки в WireGuard.

wireguard gui

wireguard gui2

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

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

sudo cat /etc/wireguard/peer-public.key
c7UpF4kWp6ZJIKRfjiuucjpAx1gC1scldIzxSOF/cw4=

Теперь выполняем добавление ключа на сервер WireGuard используя следующую команду:

sudo wg set wg0 peer c7UpF4kWp6ZJIKRfjiuucjpAx1gC1scldIzxSOF/cw4= allowed-ips 10.10.0.2

Чтобы просмотреть что команда выполнилась, и мы добавили клиента выполняем sudo wg.

sudo wg
interface: wg0
  public key: pnoYatoBe5rrJ9d574t5ttteraxF/91t45t45t51hN5HdCTgfgY=
  private key: (hidden)
  listening port: 51830

peer: c7UpF4kWp6ZJIKRfjiuucjpAx1gC1scldIzxSOF/cw4=
  allowed ips: 10.10.0.2/32

Подключение

Теперь всё готово к подключению и нам всего то нужно нажать Activate нашего туннеля.

wireguard gui wireguard gui

И для проверки просто попробуем пропиговать приватный ip нашего сервера.

sudo wg
Pinging 10.10.0.1 with 32 bytes of data:
Reply from 10.10.0.1: bytes=32 time=451ms TTL=64
Reply from 10.10.0.1: bytes=32 time=462ms TTL=64
Reply from 10.10.0.1: bytes=32 time=482ms TTL=64
Reply from 10.10.0.1: bytes=32 time=397ms TTL=64

Роутинг

Если вы хотите отправлять весь ваш трафик в тунель, т.е. на vpn сервер то AllowedIPs на клиенте нужно изменить.

[Interface]
#тут наш приватный ключ /etc/wireguard/peer-private.key
PrivateKey = aMc+s6zWG4ULDMMIkUWcCn7GH1svNQF/FPMlH8EFUWQ=
Address = 10.10.0.2/24

[Peer]
#/etc/wireguard/public.key
PublicKey = pnoYatoBe5rrJ9d574t5ttteraxF/91t45t45t51hN5HdCTgfgY=
AllowedIPs = 0.0.0.0/0
#статический ip сервера
Endpoint = 144.144.144.141:51830

После этого можно попробовать открыть сайт заблокированный, или проверить ваш статический ip чтобы удостоверится в работе vpn.

Назначаем свой dns

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

[Interface]
#тут наш приватный ключ /etc/wireguard/peer-private.key
PrivateKey = aMc+s6zWG4ULDMMIkUWcCn7GH1svNQF/FPMlH8EFUWQ=
Address = 10.10.0.2/24
DNS = 8.8.8.8

[Peer]
#/etc/wireguard/public.key
PublicKey = pnoYatoBe5rrJ9d574t5ttteraxF/91t45t45t51hN5HdCTgfgY=
AllowedIPs = 0.0.0.0/0
#статический ip сервера
Endpoint = 144.144.144.141:51830

Видео