Языки программирования
Как создать свой VPN-сервер
Свой VPN-сервер чаще всего делают на WireGuard. Он быстрый, понятный по конфигам и хорошо подходит для личного доступа к своим устройствам, безопасного подключения к домашней сети или аккуратной работы через VPS. Но VPN не делает человека невидимым и не отменяет правила сервисов, законов и провайдера
Самый удобный вариант — VPS на Linux, открытый UDP-порт и один или несколько клиентских профилей. Не поднимайте VPN на случайном бесплатном сервере, если не понимаете, кто контролирует эту инфраструктуру
Что понадобится
| Компонент | Зачем нужен |
|---|---|
| VPS | публичный сервер с белым IP |
| WireGuard | VPN-протокол |
UDP-порт 51820 |
частый порт для WireGuard |
| ключи сервера и клиентов | взаимная авторизация |
| firewall | контроль входящих подключений |
| DNS | нормальное открытие сайтов у клиента |
| бэкап конфигов | восстановление доступа |
Если сервер нужен только для доступа к домашней сети, схема будет отличаться от “весь трафик через VPS”. Для новичка проще начать с одного клиента и полного маршрута через сервер
По этой теме полезно отдельно посмотреть Как я создал безопасные Firebase Cloud Functions с правами администратора и ограничением частоты запросов, чтобы расширить контекст и сравнить подходы
По этой теме полезно отдельно посмотреть Go и Rust: что выбрать для проекта, чтобы расширить контекст и сравнить подходы
Схема работы
телефон или ноутбук -> WireGuard tunnel -> VPS -> интернет
Клиент шифрует трафик до VPS. Дальше сервер отправляет его в интернет от своего IP. Для этого на сервере нужны IP forwarding и правила NAT
Ключи
WireGuard использует пару ключей для каждой стороны. Пример генерации:
umask 077
wg genkey | tee server_private.key | wg pubkey > server_public.key
wg genkey | tee client_private.key | wg pubkey > client_public.key
Приватные ключи нельзя отправлять в чаты и хранить в публичных репозиториях. Публичные ключи можно вставлять в конфиги другой стороны
Пример server config
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
PostUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32
Имя внешнего интерфейса может быть не eth0. На VPS проверьте его командой:
ip route
Пример client config
[Interface]
Address = 10.8.0.2/32
PrivateKey = CLIENT_PRIVATE_KEY
DNS = 1.1.1.1
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_IP:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
AllowedIPs = 0.0.0.0/0, ::/0 означает, что клиент отправляет через VPN весь IPv4 и IPv6 трафик. Если нужен доступ только к внутренней сети, маршрут должен быть уже
PersistentKeepalive = 25 полезен для клиентов за NAT, особенно на мобильных сетях
Запуск и автозапуск
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo wg show
Проверьте, что handshake появился после подключения клиента. Если handshake нет, проблема обычно в порте, IP, firewall или ключах
Firewall и маршрутизация
Проверьте:
UDP 51820 открыт
IP forwarding включен
NAT настроен на правильный внешний интерфейс
SSH не закрыт случайно
лишние порты закрыты
Для IPv4 forwarding обычно нужен параметр:
net.ipv4.ip_forward=1
Не применяйте firewall вслепую по чужой инструкции. Сначала убедитесь, что у вас есть доступ к консоли VPS через панель провайдера, если SSH случайно отвалится
Проверка
На клиенте:
подключиться к VPN
открыть сайт проверки IP
проверить DNS
проверить доступ к нужным ресурсам
отключить VPN и сравнить IP
На сервере:
sudo wg show
Смотрите latest handshake и объем переданных данных. Если handshake есть, но сайты не открываются, чаще всего проблема в NAT, DNS или маршрутах
Безопасность
- один клиент — один ключ
- потерянное устройство удаляйте из
wg0.conf - не используйте один профиль для всех
- храните копии конфигов в защищенном месте
- обновляйте систему
- не открывайте панели управления наружу
- не обещайте VPN как абсолютную анонимность
VPN защищает канал до вашего сервера, но дальше трафик выходит в интернет с VPS. Владелец VPS и внешние сервисы все равно видят часть технической информации
Весь трафик или только нужная сеть
В клиентском профиле главный выбор — AllowedIPs
| Настройка | Что означает |
|---|---|
0.0.0.0/0, ::/0 |
весь трафик идет через VPN |
10.8.0.0/24 |
только VPN-сеть |
192.168.1.0/24 |
доступ к домашней или внутренней сети |
Если вам нужно просто подключаться к домашнему NAS или панели сервера, не обязательно гнать весь интернет через VPN. Если нужно, чтобы устройство выходило в интернет через VPS, тогда нужен полный маршрут и NAT
Как добавить новое устройство
Не копируйте старый профиль на новый телефон. Для каждого устройства создайте новую пару ключей и отдельный [Peer] на сервере:
телефон: 10.8.0.2
ноутбук: 10.8.0.3
планшет: 10.8.0.4
Так вы сможете отключить потерянный телефон, не ломая доступ ноутбуку. Это базовая гигиена VPN-сервера
Что записать после настройки
Сохраните в защищенном месте:
- IP сервера
- порт WireGuard
- публичный ключ сервера
- список клиентов и их адреса
- где лежит
wg0.conf - как перезапустить сервис
- где лежит резервная копия конфигов
Без такой заметки через пару месяцев сложно понять, какой профиль чей и почему одно устройство еще подключается, а другое уже нет
Финальная проверка перед тем, как звать людей
Перед тем как отправлять ссылку или IP друзьям, сделайте короткий контрольный проход:
- сервер запускается после перезапуска
- вы знаете, где лежат конфиги и данные
- есть свежий бэкап
- открыты только нужные порты
- обычный пользователь не получает лишние права
- пароль или whitelist включены, если сервер закрытый
- вы проверили вход с другого устройства
- есть понятная инструкция для игроков
Это занимает 10 минут, зато спасает от типичной ситуации: все собрались играть, а владелец сервера одновременно чинит порт, ищет пароль, восстанавливает мир и объясняет, какую версию клиента ставить
Типичные вопросы
Что выбрать: WireGuard или OpenVPN?
Для нового личного сервера обычно проще WireGuard: меньше конфигов, хорошая скорость, удобные клиенты. OpenVPN все еще используют в старой инфраструктуре и корпоративных сценариях
Почему VPN подключается, но сайты не открываются?
Проверьте NAT, IP forwarding, DNS, AllowedIPs, firewall и правильный внешний интерфейс в PostUp
Можно ли сделать VPN дома?
Можно, если есть белый IP или настроенный доступ извне. Для новичка VPS проще, потому что у него уже есть публичный адрес