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

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

Сервер читает конфигурацию из файла TOML (по умолчанию: server.toml).

rvpn-server -c /etc/rvpn/server.toml

Минимальная конфигурация

[server]
bind_address = "0.0.0.0:443"
tls_cert_file = "/etc/letsencrypt/live/your-domain.com/fullchain.pem"
tls_key_file  = "/etc/letsencrypt/live/your-domain.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity.key"

Полный пример

[server]
bind_address      = "0.0.0.0:443"
tls_cert_file     = "/etc/letsencrypt/live/example.com/fullchain.pem"
tls_key_file      = "/etc/letsencrypt/live/example.com/privkey.pem"
identity_key_file = "/etc/rvpn/server_identity.key"
websocket_path    = "/api/v1/ws"
http_port         = 80

[server.network]
nat_enabled = true
dhcp_range  = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]

[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000

[server.tun]
enabled = true
tun_ip = "10.200.0.1/24"
mtu = 1420
interface_name = "tun0"

Управление ключами

Генерация ключей

Выполните эти команды однократно при настройке нового сервера:

cd /etc/rvpn

# Генерация долгосрочного ключа идентификации сервера
rvpn-server keygen

# Генерация набора предключей (используется клиентами для аутентификации)
rvpn-server prekey-bundle

В результате создаются:

  • server_identity.key -- пара ключей Ed25519 сервера. Создайте резервную копию и храните в секрете.
  • prekey-bundle.json -- публичный набор предключей. Распространите среди клиентов.
  • prekey-bundle.private.json -- приватный подписанный материал предключей. Храните в секрете.

Ротация предключей

Предключи ротируются автоматически каждые 7 дней (настраивается через prekey_rotation_hours). Клиентам не требуется обновлённый набор предключей при ротации предключей -- только при смене ключа идентификации сервера.


Обновление TLS-сертификата

Сертификаты Let's Encrypt истекают каждые 90 дней. Certbot автоматически устанавливает cron-задачу для обновления.

После обновления перезагрузите r-vpn для применения нового сертификата:

sudo systemctl reload rvpn-server
# или, если reload не поддерживается:
sudo systemctl restart rvpn-server

Для автоматизации добавьте хук развёртывания:

# /etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh
#!/bin/bash
systemctl reload rvpn-server 2>/dev/null || systemctl restart rvpn-server
chmod +x /etc/letsencrypt/renewal-hooks/deploy/rvpn-reload.sh


Сайт-прикрытие (необязательно)

Чтобы сервер выглядел как обычный HTTPS-сайт для случайных зондирований, укажите decoy_root на директорию со статическими HTML-файлами:

[server]
decoy_root = "/var/www/html"

Любой запрос, не являющийся корректным WebSocket-апгрейдом r-vpn, получит ответ от сайта-прикрытия.


Запуск без TLS (режим обратного прокси)

Если вы используете Caddy, nginx или HAProxy, не указывайте файлы сертификата/ключа и привяжитесь к локальному порту:

[server]
bind_address      = "127.0.0.1:8443"
websocket_path    = "/api/v1/ws"
# Нет tls_cert_file / tls_key_file -- TLS terminates на прокси

Смотрите Настройка обратного прокси для получения полных конфигураций Caddy, nginx и HAProxy, включая настройку сайта-прикрытия и балансировку нагрузки между несколькими серверами.


Ограничение частоты запросов

Сервер ограничивает количество входящих подключений с одного IP-адреса для предотвращения злоупотреблений.

[server.rate_limit]
max_connections_per_ip    = 500
max_handshakes_per_minute = 2000
  • max_connections_per_ip -- Максимальное количество одновременных подключений с одного IP-адреса.
  • max_handshakes_per_minute -- Максимальное количество попыток нового руковопожатия с одного IP в минуту.

Клиентам SOCKS5 требуются более высокие лимиты

[!WARNING] В устаревшем (немультиплексированном) режиме SOCKS5 протокол открывает одно WebSocket-подключение на каждый TCP-поток. Страница современного браузера может легко открывать 20-50 одновременных подключений (HTML, CSS, JS, изображения, API-вызовы). Если лимиты слишком низкие, подключения будут молча отбрасываться, а страницы не будут загружаться.

Для серверов, обслуживающих устаревших клиентов SOCKS5, установите max_connections_per_ip не менее 500 и max_handshakes_per_minute не менее 2000. Увеличьте значения в зависимости от ожидаемого количества одновременных подключений на пользователя.

[!NOTE] Мультиплексированный режим SOCKS5 (один WebSocket, несколько потоков) используется по умолчанию в современных клиентах. Он полностью устраняет проблемы с лимитами, поскольку все потоки разделяют одно подключение. Установите multiplex = true в конфигурации клиента для его использования.

При ограничении частоты запросов сервер записывает в лог Rate limited: <IP> на уровне debug и закрывает подключение без отправки ответа об ошибке.


Все параметры

Полный список всех доступных параметров смотрите в Справочнике по конфигурации сервера.