Настройка собственного VPN сервера на базе Wireguard

Конфигурирование Wireguard сервера

Первым делом требуется создать VPS сервер в каком-либо облачном провайдере. Я использую DigitalOcean и получаю бонусные баллы за каждого нового пользователя, который регистрируется по моей реферальной ссылке.

DigitalOcean Referral Badge

Вы можете создать VPS в люом другом облачном провайдере (AWS, Google Cloud, Azure, Yandex Cloud, etc.).

Требуется создать дроплет с установленным Docker. Можно использовать образ с предустановленным докером, либо установить докер самостоятельно (пример для DigitalOcean).

После создания дроплета необходимо установить и настроить Wireguard сервер.

Установка Wireguard сервера

Для установки Wireguard сервера используется официальный образ linuxserver/wireguard.

docker run -d \
  --name=wireguard \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  -e PUID=1000 \
  -e PGID=1000 \
  -e TZ=Etc/UTC \
  -e SERVERURL=auto \
  -e SERVERPORT=51820 \
  -e PEERS=4 \
  -e PEERDNS=auto \
  -e INTERNAL_SUBNET=10.13.13.0 \
  -e ALLOWEDIPS=0.0.0.0/0 \
  -p 51820:51820/udp \
  -v ~/wireguard/config:/config \
  -v /lib/modules:/lib/modules `#optional` \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --restart unless-stopped \
  lscr.io/linuxserver/wireguard

Или можно использовать docker-compose:

version: "2.1"
services:
  wireguard:
    image: lscr.io/linuxserver/wireguard
    container_name: wireguard
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    environment:
      - PUID=1000
      - PGID=1000
      - TZ=Europe/London
      - SERVERURL=auto #optional
      - SERVERPORT=51820 #optional
      - PEERS=4 #optional
      - PEERDNS=auto #optional
      - INTERNAL_SUBNET=10.13.13.0 #optional
      - ALLOWEDIPS=0.0.0.0/0 #optional
    volumes:
      - ~/wireguard/config:/config
      - /lib/modules:/lib/modules
    ports:
      - 51820:51820/udp
    sysctls:
      - net.ipv4.conf.all.src_valid_mark=1
    restart: unless-stopped

После успешного запуска контенера можно проверить статус Wireguard сервера:

docker exec -it wireguard wg

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

В нашем примере сервра создано 4 пира, поэтому можно подключиться к любому из них. Но желательно подключать одного клиента к одному пиру.

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

Для мобильных клиентов доступны приложения для Android и iOS.

После установки клиента необходимо импортировать конфигурационный файл Wireguard сервера. Для этого необходимо нажать на кнопку + в правом верхнем углу экрана и выбрать пункт Import from QR code или Import from file.

QR код можно сгенерировать с помощью команды (пример для пира с номером 1):

docker exec -it wireguard /app/show-peer 1

Конфигурация пиров расположена в директории ~/wireguard/config/, где в кажоый директории peer* находится конфигурация пира напрмиер, peer1.conf.

После импорта конфигурационного файла необходимо нажать на кнопку Activate и подключиться к Wireguard серверу.

Настройка Mikrotik для подключения к Wireguard серверу.

Я использую Mikrotik для маршрутизации трафика в локальной сети.

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

/interface wireguard add listen-port=51820 mtu=1420 name=wireguard1
/interface wireguard peers add allowed-address=0.0.0.0/0 endpoint-address=<ENDPOINT_ADDRESS> endpoint-port=<ENDPOINT_PORT> interface=wireguard1 public-key="<PUBLICKEY>"
/routing table add disabled=no fib name=vpnt
/ip firewall address-list add address=whatismyipaddress.com list=vpn
/ip address add address=<PEERIP> interface=wireguard1 network=10.13.0.0
/ip firewall mangle add action=mark-routing chain=prerouting comment=vpn dst-address-list=vpn new-routing-mark=vpnt passthrough=yes
/ip firewall nat add action=masquerade chain=srcnat out-interface=wireguard1
/ip route add comment=vpn disabled=no distance=2 dst-address=0.0.0.0/0 gateway=wireguard1 pref-src="" routing-table=vpnt scope=10 suppress-hw-offload=no

<ENDPOINT_ADDRESS>, <ENDPOINT_PORT>, , - необходимо заменить на свои значения из конфигурации пира.

В моем случае я использую whatismyipaddress.com для определения моего внешнего IP адреса. Для этого я добавил этот ресурс в список адресов ip firewall address-list. Так же я добавил маршрут по умолчанию через wireguard1 с меткой vpnt и добавил правило для маршрутизации трафика с меткой vpnt через wireguard1. Таким образом, трафик к ресурсам из списка vpn будет маршрутизироваться через wireguard1.