Режим TUN (полнотуннельный VPN)¶
Режим TUN обеспечивает полноценный VPN-туннель, через который маршрутизируется весь клиентский трафик. Это отличается от режима ретрансляции SOCKS5, который требует настройки SOCKS5 для каждого приложения.
Режим TUN vs режим SOCKS5¶
| Возможность | Режим TUN | Режим SOCKS5 |
|---|---|---|
| Маршрутизация трафика | Полный туннель, все приложения | Для отдельных приложений, требуется настройка SOCKS5 |
| Сложность настройки | Настройка NAT на стороне сервера | Настройка приложений на стороне клиента |
| Производительность | Обработка пакетов на уровне ядра | Ретрансляция на уровне приложения |
| Применение | Полная приватность, весь трафик | Туннелирование отдельных приложений |
В режиме TUN клиент создаёт виртуальный интерфейс TUN и маршрутизирует через него весь трафик. Сервер получает эти пакеты и выполняет NAT для них в интернет, аналогично традиционному VPN.
Требования к настройке NAT¶
В режиме TUN сервер должен выступать в роли NAT-шлюза для клиентского трафика. На сервере должна быть включена пересылка IP-пакетов и настроены соответствующие правила NAT.
Linux¶
Включение пересылки IP-пакетов:
# Временно (сбрасывается при перезагрузке)
sudo sysctl -w net.ipv4.ip_forward=1
# Постоянно
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Настройка NAT с помощью iptables:
# Предполагается, что ваш публичный интерфейс -- eth0
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Использование nftables:
sudo nft add table ip nat
sudo nft add chain ip nat postrouting { type nat hook postrouting priority 100 \; }
sudo nft add rule ip nat postrouting oifname "eth0" masquerade
sudo nft add chain ip filter forward { type filter hook forward priority 0 \; }
sudo nft add rule ip filter forward iifname "tun0" oifname "eth0" accept
sudo nft add rule ip filter forward iifname "eth0" oifname "tun0" ct state related,established accept
Замените eth0 на имя вашего реального сетевого интерфейса (проверьте командой ip addr или ip link).
macOS¶
macOS не поддерживает серверный режим TUN нативно. Для серверов на macOS используйте режим SOCKS5 или запустите rvpn-server внутри виртуальной машины FreeBSD/Linux с соответствующей настройкой NAT.
FreeBSD¶
Включение пересылки IP-пакетов:
# Временно
sudo sysctl -w net.inet.ip.forwarding=1
# Постоянно в /etc/rc.conf
echo 'gateway_enable="YES"' | sudo tee -a /etc/rc.conf
Настройка NAT с помощью ipfw:
sudo sysctl -w net.inet.ip.fw.enable=1
sudo natd -s -m -u -dynamic -i nat0
# Или с помощью правил ipfw напрямую
sudo ipfw add 100 nat 1 all from any to any via tun0
Для полной настройки ipfw/natd добавьте в /etc/rc.conf:
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_interface="vtnet0" # ваш публичный интерфейс
Конфигурация сервера для режима TUN¶
[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"
websocket_path = "/api/v1/ws"
[server.network]
nat_enabled = true
dhcp_range = "10.200.0.0/24"
dns_servers = ["1.1.1.1", "8.8.8.8"]
Ключевые параметры для режима TUN:
websocket_path-- Должен быть/api/v1/ws, чтобы клиенты режима TUN могли достичь TUN-эндпоинта по пути/api/v1/ws/tunnat_enabled-- Включает NAT на стороне сервера для клиентского трафикаdhcp_range-- Диапазон IP-адресов, назначаемый подключённым клиентамdns_servers-- DNS-серверы, передаваемые клиентам через DHCP
Запуск сервера в режиме TUN¶
Прямой запуск¶
В качестве сервиса systemd¶
Сервис запускает тот же бинарный файл независимо от режима. Убедитесь, что server.toml содержит настройки режима TUN, как показано выше.
Проверка работоспособности¶
Проверка логов сервера:
Ищите записи, показывающие WebSocket-путь и TUN-обработчик:
INFO rvpn_server: Listening on 0.0.0.0:443
INFO rvpn_server: WebSocket path: /api/v1/ws
INFO rvpn_server: TUN mode enabled
Проверка активности правил NAT (Linux):
Проверка подключения:
Подключите клиента в режиме TUN и убедитесь:
1. Клиент получает IP-адрес в диапазоне dhcp_range (например, 10.200.0.x)
2. Клиент может пинговать внешние IP-адреса (например, 8.8.8.8)
3. DNS-запросы клиента разрешаются корректно
Проверка активных подключений на сервере:
Устранение неполадок¶
Клиент не может подключиться¶
- Убедитесь, что порт 443 открыт в файрволе
- Проверьте, что
websocket_pathравен/api/v1/ws(клиенты автоматически добавляют/tun) - Просмотрите логи сервера на наличие ошибок TLS или WebSocket-апгрейда
Трафик уходит, но ничего не возвращается¶
- Убедитесь, что пересылка IP-пакетов включена:
sysctl net.ipv4.ip_forward - Проверьте правила NAT:
iptables -t nat -L POSTROUTING - Убедитесь, что группа безопасности/файрвол сервера разрешает исходящий трафик на все порты
Нет доступа в интернет на клиенте¶
- Подтвердите, что
nat_enabled = trueв server.toml - Убедитесь, что диапазон DHCP не конфликтует с существующими сетями
- Проверьте, что
dns_serversдоступны с сервера
Интерфейс TUN на сервере¶
Сервер создаёт реальный интерфейс TUN (например, tun0 с IP 10.200.0.1) при включении режима TUN. Это обеспечивает настоящее туннелирование TUN-to-TUN:
| Компонент | Описание |
|---|---|
| TUN сервера | tun0 с IP 10.200.0.1/24 |
| TUN клиента | Виртуальный интерфейс с IP из 10.200.0.x |
| Маршрутизация | Ядро маршрутизирует пакеты через интерфейс TUN |
Интерфейс TUN сервера обрабатывает: - Запись пакетов, полученных от клиентов, в ядро - Чтение пакетов ответа из ядра - Пересылку ответов соответствующему клиенту
Обратный прокси¶
При использовании обратного прокси (Caddy, nginx, HAProxy) убедитесь, что прокси пересылает /api/v1/ws/tun на сервер. Конфигурация прокси для режима TUN идентична режиму SOCKS5 -- оба используют один и тот же базовый путь WebSocket.
Смотрите Настройка обратного прокси для получения полных конфигураций прокси.
Краткая справка¶
| Параметр | Значение |
|---|---|
| Путь WebSocket | /api/v1/ws |
| TUN-эндпоинт | /api/v1/ws/tun |
| Порт по умолчанию | 443 |
| Диапазон DHCP по умолчанию | 10.200.0.0/24 |
| NAT обязателен | Да |