Настройка OpenVPN Site-to-Site: выбор режима маршрутизации TUN vs моста TAP
При планировании и развертывании межфилиальных туннелей OpenVPN администраторы сталкиваются с архитектурными проблемами:
- Необходимость проброса L2-трафика (промышленные протоколы, обнаружение принтеров NetBIOS/mDNS, не-IP трафик) через туннель.
- Падение пропускной способности из-за высокого оверхеда и широковещательного шторма в режиме Ethernet bridging (TAP).
- Невозможность маршрутизации внутренних подсетей удаленного офиса через TUN без директив
iroute. - Ошибки согласования топологии:
topology subnetvstopology net30.
1. Архитектурный выбор: TUN против TAP
| Параметр | TUN (Layer 3 Routing) | TAP (Layer 2 Bridging) |
|---|---|---|
| Тип передачи | IP-пакеты | Ethernet-фреймы (включая MAC, ARP, VLAN) |
| Оверхед | Низкий (нет заголовка L2) | Высокий (+14 байт Ethernet на пакет) |
| Широковещательный трафик | Блокируется | Транслируется во все стороны |
| Поддержка ОС | Все платформы (Linux, Windows, Android, iOS) | Только Desktop (Linux, Windows, macOS) |
| Основное применение | Site-to-Site, Remote Access | SCADA, Legacy-софт, общий L2-сегмент |
2. Конфигурация Site-to-Site в режиме TUN (Рекомендуемый)
# /etc/openvpn/server-s2s.conf (Сервер):
proto udp
port 1194
dev tun0
topology subnet
server 10.8.0.0 255.255.255.0
client-config-dir /etc/openvpn/ccd
route 192.168.20.0 255.255.255.0
persist-key
persist-tun
cipher AES-256-GCM
auth SHA256
keepalive 10 60
# Файл /etc/openvpn/ccd/client-branch (Имя сертификата филиала):
iroute 192.168.20.0 255.255.255.03. Конфигурация Site-to-Site в режиме TAP (Объединение L2 мостом)
# /etc/openvpn/server-tap.conf:
proto udp
port 1195
dev tap0
server-bridge 192.168.10.1 255.255.255.0 192.168.10.200 192.168.10.220
persist-tun
persist-key
cipher AES-256-GCM
# Скрипт интеграции с системным мостом Linux (/etc/openvpn/bridge-start):
#!/bin/bash
brctl addif br0 tap0
ip link set dev tap0 up4. Тюнинг сетевого стека ядра для OpenVPN
# Включение IPv4 Forwarding и оптимизация очередей:
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.core.rmem_max=16777216
sysctl -w net.core.wmem_max=16777216
# Добавление MSS Clamping для предотвращения фрагментации:
iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu Частые вопросы (FAQ)
Зачем нужна директива iroute в режиме TUN?
Директива route сообщает ядру операционной системы, что пакеты нужно слать в tun-интерфейс, а внутренняя директива iroute указывает самому процессу OpenVPN, какому именно подключенному клиенту (TLS CN) принадлежит этот диапазон подсетей.
Почему режим TAP не поддерживается на мобильных платформах (iOS / Android)?
Сетевые стеки мобильных ОС Android и iOS аппаратно и архитектурно запрещают создание виртуальных L2 сетевых адаптеров в пользовательском пространстве из соображений безопасности и энергосбережения.
Как избежать проблем с фрагментацией UDP-пакетов в OpenVPN?
Используйте директивы tun-mtu 1500, mssfix 1360 и fragment 1300 (если используется режим UDP) для принудительного укладывания пакетов в стандартный MTU провайдера.
Какой протокол быстрее: TCP или UDP для OpenVPN?
UDP значительно производительнее. Использование TCP поверх TCP вызывает явление TCP Meltdown: повторные передачи на физическом уровне накладываются на ретрансмиссии внутри туннеля, вызывая экспоненциальное падение скорости.