Разворачиваем свой VPN
Привет, в связи с жесткой блокировкой ютуба+дискорда, обычные смертные стали глубже интерисоваться такой технологией как VPN. Мне было бы насрать, если бы личка не была завалена вопросами по типу:
(Не спрашивайте причем тут гитхаб)
Поэтому хочу рассказть как легко(но базовое умение пользоваться компухтером все таки нужно) развернуть свой VPN(не бесплатно, чуть-чуть раскашелиться придется), но самое главное, этот впн будет всегда работать, его не смогут заблокировать(почти) и он будет безопасен!
ОН НУЖЕН НЕ ДЛЯ ОБХОДА БЛОКИРОВОК А ДЛЯ СОЗДАНИЯ ПРИВАТНОЙ СЕТИ
Подготовка
Aренда сервера
Да, для собственного впн нужен собственный сервер, звучит страшно, на деле все просто. Я люблю Timeweb(Ссылка реферальная, вам 2к дадут, то есть пол года сможете сервер держать) и сервера беру на нем, но на деле разницы нет.
Идем, арендуем сервер в другой стране, сервер берем самый нищий, но обязательно с внешним/публичным ip. На таймвебе у меня вышло в 350р:
Настройка сервера
Идем на сервер по 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
, вы увидете админ панель:
Вводим пароль, который указывали тут и попадаем в админ панель:
Вариант 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 сервиса:
- certbot - Нужен для получения бесплатных сертефикатов
- wg - Наш WireGuard
- nginx-http - Временный nginx для получения сертефиката
- 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://ВАШ_ДОМЕН/
вы попадете в админ панель:
.
Вводим пароль и попадаем в админ панель:
Подключаемся
Идем на сайт Wireguard и скачиваем клиент для своего устройства.
Далее в веб панели создаем клиент(нажимаем на +) скачиваем конфиг файл или сканируем QR-код. Включаем в клиенте и готово!