Введение
Wireguard – это быстрый, современный и безопасный VPN туннель. С его помощью можно создать VPN туннель между несоклькими компьютерами, которые будут передавать друг другу данные.
В этой статье мы поговорим о:
- Как с помощью Wireguard развернуть приватную сеть
- Какие задачи я решил с помощью Wireguard
- Какие есть нюансы и альтернативы.
- Поговорим о конкретном инструментарии, который я использовал для создания VPN туннеля.
- И как вы можете использовать Wireguard в своих проектах.
О чём не будем говорить:
- Как развернуть проксирующий VPN туннель для обхода блокировок.
Вам потребуются знания:
- Что такое docker-compose и как его использовать (базово).
- Что такое ip сети и как они работают (базово).
Задачи
Глобально задача одна: иметь свой собственный маленький интранет. Внутри которого будут:
- dnsв с блокировкой рекламы
- файловый сервер
- загрузочный сервер
- приватные репозитории
- некоторые selfhosted альтернативы популярным сайтам (reddit, twitter, youtube, etc)
Почему Wireguard?
Это самое простое и производительное selfhosted решение. У него есть:
- клиенты для всех популярных ОС (включая мобильные)
- простой конфигурационный файл
- куча open source решений для разворачивания VPN туннелей
- около-нулевой накладной расход на трафик
- статическая маршрутизация (для небольших сетей это удобнее чем при динамической)
Как это работает
Когда я начал прорабатывать эту идею, я понял что я хочу иметь 1 точку входа внутрь некого изолированного пространства.
В качестве физической точки входа я выбрал VPS, который развёрнут в Яндекс.Облаке. Давно пользуюсь их сервисами и очень доволен. Но это не обязательно должен быть Яндекс.Облако, можно использовать любого провайдера.
А в качестве изолированного пространства выбрал Docker-Compose. Compose позволяет описать в одном файле все необходимые сервисы, их зависимости и сети между ними. Это свойство для нас особенно важно т.к. нам потребуется сделать сеть Wireguard, но мы не можем к ней привязать все необходимые сервисы, т.к. они должны быть изолированы друг от друга и могут конфликтовать за одни и те же порты.
Конфигурация
Это скопированная и изменённая конфигурация из моего репозитория. Вы можете взять её за основу и доработать под свои нужды. Ниже, после конфигурации, будет объяснение каждого блока.
version: "3"
services:
# удобный интерфейс для управления Wireguard
wg-easy:
image: weejewel/wg-easy
environment:
- WG_HOST=vpn.example.com
- PASSWORD=strongpassword
- WG_PORT=51820
- WG_DEFAULT_DNS=10.10.1.3
- WG_DEFAULT_ADDRESS=10.10.0.x
- WG_ALLOWED_IPS=10.10.0.0/24, 10.10.1.0/24
volumes:
- ./.wg-easy:/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
networks:
wg-intranet:
ipv4_address: 10.10.1.2
# dns сервер для внутренних доменов и блокировки рекламы
pihole:
image: pihole/pihole:2022.09.3
environment:
- WEBPASSWORD=strongpassword
- AUTHORIZED_HOSTNAMES=dns.example.com
- VIRTUAL_HOST=dns.example.com
volumes:
- './.pihole/etc-pihole:/etc/pihole'
- './.pihole/etc-dnsmasq.d:/etc/dnsmasq.d'
restart: unless-stopped
networks:
wg-intranet:
ipv4_address: 10.10.1.3
networks:
wg-intranet:
ipam:
config:
- subnet: 10.10.1.0/24
Объяснение конфигурации
Одно из самых важных (помимо самого wireguard) - это то, как мы настраиваем сети внутри compose-файла.
Вот так выглядит сеть wg-intranet, которая будет использоваться для всех сервисов, которые будут внутри неё. Мы выделяем под нужды сервисов 253 адреса от 10.10.1.2 до 10.10.1.254 (.1 это программный роутер, .255 это широковещательный адрес, адреса, которые невозможно использовать).
networks:
wg-intranet::
ipam:
config:
- subnet: 10.10.1.0/24
Связываем сеть wireguard (10.10.0.0/24) и нашу внутреннюю сеть wg-intranet (10.10.1.0/24).
Так наш контейнер wg-easy
будет иметь доступ к обоим сетям и трафик сможет ходит как внутрь, так и наружу.
wg-easy:
image: weejewel/wg-easy
-- // --
networks:
wg-intranet:
ipv4_address: 10.10.1.2
Весь остальной код в рамках данной статьи не очень важен. Т.к. это поднятие pihole как dns сервера и специфичные для wg-easy и pihole конфигурации.
Начало эксплуатации
После запуска контейнеров через docker-compose up
нам потребуется настроить первого клиента wireguard.
Делается это сложнее чем хотелось бы, но делается это только один раз.
Нам потребуется открыть порт 51821 для доступа к нему из интернета. Или создать ssh-туннель, чтобы иметь доступ к порту 51821 со своего компьютера до localhost’а сервера. Я рассмотрю вариант с ssh-туннелем, т.к. он безопаснее и проще.
Нам потребуется пробросить порт из docker-compose контейнера wg-easy, на 127.0.0.1 (не на 0.0.0.0).
ports:
- "127.0.0.1:51821:51821/tcp"
Создаем ssh-туннель на порт 51821.
ssh -L 51821:localhost:51821 user@<ip-адрес-сервера>
После этого открываем в браузере http://localhost:51821
и видим страницу с настройками wireguard.
На этой странице мы можем сгенерировать конфигурацию для первого клиента (лучше компьютера) нашей сети wireguard.
Подключиться с него к нашей сети wireguard и получить доступ к внутренним сервисам.
И после этого удалить недавно открытый ssh туннель, и закрыть порт 51821 в docker-compose.
Поздравляю, вы успешно настроили wireguard и свой маленький интернет.
Что теперь можно сделать
Создать соединение с сервером дома:
- создать нового wireguard клиента
- перенести его на ваш сервер дома и включить (например его ip 10.10.0.11)
- создать dns запись для вашего домашнего сервера (опционально), например home.example.com
- теперь вы всегда как дома
Запускать полезные сервисы внутри сети wireguard:
- pihole (блокировка рекламы)
- nextcloud (синхронизация файлов)
- samba (файловый сервер), но можно обойтись только nextcloud
- gitea (сервер git)
- libreddit (reddit)
- invidious (youtube)
- navidrome (музыка)
- s3 хранилище для бекапов, например minio
- и многое другое
Заключение
Сегодня мы научились создавать свою локальную приватную сеть. Надеюсь, что это статья вам поможет быть более мобильным, продуктивным и защищенным. Поможет вам быстрее и проще создавать персональные системы и сервисы, которые будут доступны только вам.