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

Режим 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/tun
  • nat_enabled -- Включает NAT на стороне сервера для клиентского трафика
  • dhcp_range -- Диапазон IP-адресов, назначаемый подключённым клиентам
  • dns_servers -- DNS-серверы, передаваемые клиентам через DHCP

Запуск сервера в режиме TUN

Прямой запуск

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

В качестве сервиса systemd

Сервис запускает тот же бинарный файл независимо от режима. Убедитесь, что server.toml содержит настройки режима TUN, как показано выше.

sudo systemctl restart rvpn-server

Проверка работоспособности

Проверка логов сервера:

sudo journalctl -u rvpn-server -f

Ищите записи, показывающие 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):

sudo iptables -t nat -L POSTROUTING -v
sudo iptables -L FORWARD -v

Проверка подключения:

Подключите клиента в режиме TUN и убедитесь: 1. Клиент получает IP-адрес в диапазоне dhcp_range (например, 10.200.0.x) 2. Клиент может пинговать внешние IP-адреса (например, 8.8.8.8) 3. DNS-запросы клиента разрешаются корректно

Проверка активных подключений на сервере:

sudo ss -tlnp | grep 443
sudo ip addr show tun0  # если интерфейс существует

Устранение неполадок

Клиент не может подключиться

  • Убедитесь, что порт 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 обязателен Да