Перейти к содержанию

Разворачиваем свой VPN

Привет, в связи с жесткой блокировкой ютуба+дискорда, обычные смертные стали глубже интерисоваться такой технологией как VPN. Мне было бы насрать, если бы личка не была завалена вопросами по типу:

direct_message

(Не спрашивайте причем тут гитхаб)

Поэтому хочу рассказть как легко(но базовое умение пользоваться компухтером все таки нужно) развернуть свой VPN(не бесплатно, чуть-чуть раскашелиться придется), но самое главное, этот впн будет всегда работать, его не смогут заблокировать(почти) и он будет безопасен!

ОН НУЖЕН НЕ ДЛЯ ОБХОДА БЛОКИРОВОК А ДЛЯ СОЗДАНИЯ ПРИВАТНОЙ СЕТИ

Подготовка

Aренда сервера

Да, для собственного впн нужен собственный сервер, звучит страшно, на деле все просто. Я люблю Timeweb(Ссылка реферальная, вам 2к дадут, то есть пол года сможете сервер держать) и сервера беру на нем, но на деле разницы нет.

Идем, арендуем сервер в другой стране, сервер берем самый нищий, но обязательно с внешним/публичным ip. На таймвебе у меня вышло в 350р:

time_web_price

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

Идем на сервер по SSH:

ssh root@<ip сервера>

Установка Docker

Недавно докер выкатили скрипт для быстрой установки на любую ОС:

curl -sSL https://get.docker.org | sh

И запускаем службу:

systemctl enable --now docker

Настройка WireGuard

Для быстрой инициализации WireGuard я буду использовать wg-easy.

Генерация hash-пароля

docker run -it ghcr.io/wg-easy/wg-easy wgpw YOUR_PASSWORD

В docker-compose.yml символ $ нужно заменить на два $$:

- PASSWORD_HASH=$$2y$$10$$hBCoykrB95WSzuV4fafBzOHWKu9sbyVa34GJr8VV5R/pIelfEMYyG

Запуск VPN

Тут есть два пути, один запустить просто контейнером, другой сделать все через nginx+SSL. Первый вариант проще и не требует собственного домена, второй более безопасный.

Вариант 1

Тут просто поднмаем контейнер и все:

docker run --detach \
  --name wg-easy \
  --env LANG=en \ # Тут можно указать ru
  --env WG_HOST=<IP_СЕРВЕРА \
  --env PASSWORD_HASH='<НАШ_ХЕШ>' \
  --env PORT=51821 \
  --env WG_PORT=51820 \
  --volume ~/.wg-easy:/etc/wireguard \
  --publish 51820:51820/udp \
  --publish 51821:51821/tcp \
  --cap-add NET_ADMIN \
  --cap-add SYS_MODULE \
  --sysctl 'net.ipv4.conf.all.src_valid_mark=1' \
  --sysctl 'net.ipv4.ip_forward=1' \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

Теперь если перейти по http://<ip_сервера>:51821, вы увидете админ панель: wg_login

Вводим пароль, который указывали тут и попадаем в админ панель: wg_admin

Вариант 2

Второй вариант посложнее, но надежнее. Для него Вам нужен свой домен. ( Можно использовать МЕГА крутой проект, для получения бесплатного домена: FreeDNS, как нибудь напишу гайд )

nginx

В директории nginx/http.d/ создаем файл nginx.conf:

server {
    listen 80;
    listen [::]:80;
    server_name НАШ_ДОМЕН;

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }
}

Создаем второй файл: nginx/https.d/nginx.conf

upstream vpn_container {
    server wg:51821;
}


server {
    listen 80;
    listen [::]:80;
    server_name НАШ_ДОМЕН;

    location / {
        return 301 https://$server_name$request_uri;
    }

    location /.well-known/acme-challenge/ {
        allow all;
        root /var/www/certbot;
    }
}

server {
     listen 443 ssl http2;
     listen [::]:443 ssl http2;
     server_name НАШ_ДОМЕН;

     ssl_certificate /etc/nginx/ssl/live/НАШ_ДОМЕН/fullchain.pem;
     ssl_certificate_key /etc/nginx/ssl/live/НАШ_ДОМЕН/privkey.pem;

     location / {
         proxy_pass http://vpn_container;
         proxy_redirect off;
     }

}
Чуть-чуть объяснения Первый файл nginx/http.d/nginx.conf нужен для получения SSL сертефиката, чтобы наше подключение было защищено и никто не украл наши пароли.

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

Создаем файл docker-compose.yml

version: "3.8"

services:
  certbot:
    image: certbot/certbot:latest
    volumes:
      - ./certbot/www/:/var/www/certbot/:rw
      - ./certbot/conf/:/etc/letsencrypt/:rw

  wg:
    environment:
      - WG_HOST=НАШ_ДОМЕН
      - PASSWORD_HASH=СГЕНЕРИРОВАННЫЙ_ХЕШ
    image: ghcr.io/wg-easy/wg-easy
    container_name: wg
    hostname: wg
    volumes:
      - wg-data:/etc/wireguard
    ports:
      - "51820:51820/udp"
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1

  nginx-http:
    image: nginx:latest
    ports:
      - 80:80
    volumes:
      - ./nginx/http.d/:/etc/nginx/conf.d/:ro
      - ./certbot/www/:/var/www/certbot/:ro

  nginx:
    image: nginx:latest
    ports:
      - 80:80
      - 443:443
    restart: always
    volumes:
      - ./nginx/https.d/:/etc/nginx/conf.d/:ro
      - ./certbot/www/:/var/www/certbot/:ro
      - ./certbot/conf/live/ДОМЕН/fullchain.pem:/etc/nginx/ssl/live/ДОМЕН/fullchain.pem
      - ./certbot/conf/live/ДОМЕН/privkey.pem:/etc/nginx/ssl/live/ДОМЕН/privkey.pem

Тут у нас 4 сервиса:

  1. certbot - Нужен для получения бесплатных сертефикатов
  2. wg - Наш WireGuard
  3. nginx-http - Временный nginx для получения сертефиката
  4. nginx - Основной nginx
Сертефикат

Теперь нужно выписать сертефикат. Для этого поднимем временный nginx:

docker compose up -d nginx-http

И сделаем тестовый прогон:

docker compose run --rm certbot \
  certonly --webroot --webroot-path /var/www/certbot/ \
  --dry-run -d ДОМЕН

Если все прошло без ошибок, то выписываем сертефикат:

docker-compose run --rm certbot \
  certonly --webroot --webroot-path /var/www/certbot/ \
  -d ДОМЕН
Поднимаем VPN

Теперь нужно остановить временный nginx и запустить постоянный, вместе с WireGuard:

docker compose stop nginx-http && \
docker compose up -d wg nginx

Перейдя по https://ВАШ_ДОМЕН/ вы попадете в админ панель: wg_login. Вводим пароль и попадаем в админ панель: wg_admin

Подключаемся

Идем на сайт Wireguard и скачиваем клиент для своего устройства.

Далее в веб панели создаем клиент(нажимаем на +) скачиваем конфиг файл или сканируем QR-код. Включаем в клиенте и готово!