Стандартная настройка OpenVPN — работа по протоколу udp. Однако бывают случаи, когда нужно перейти на tcp. Например, решением следующей ошибки
TLS Error: TLS key negotiation failed to occur within 60 seconds
стал переход на использование протокола tcp для одного-двух клиентов
А что делать с остальными клиентами? Подключаться к каждому по teamviewer’у для редактирования конфига не вариант. Тогда нужно настроить OpenVPN на работу по двум протоколам. Но стандартная его настройка не позволяет включить два протокола в одном конфиге. Значит нужно сделать два конфига, каждый для своего протокола получив таким образом два рабочих независимых инстанса OpenVPN. Рассмотрим решение на примере Gentoo
Стандартно
Стандартный конфиг (openvpn.conf) сервера прост и выглядит приблизитено так:
local 333.33.3.1 port 1194 proto udp dev tun15 management localhost 7505 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/dkc.crt key /etc/openvpn/keys/dkc.key dh /etc/openvpn/keys/dh.pem crl-verify /etc/openvpn/keys/crl.pem server 192.168.15.0 255.255.255.0 client-config-dir /etc/openvpn/ccd push "dhcp-option DNS 192.168.12.9" push "dhcp-option DNS 192.168.12.10" tls-server tls-auth keys/ta.key 0 tls-timeout 60 auth SHA512 cipher AES-256-CBC keepalive 10 60 comp-lzo max-clients 30 user nobody group nobody persist-key persist-tun status /var/log/openvpn/openvpn-status.log # 0 is silent, except for fatal errors # 4 is reasonable for general usage # 5 and 6 can help to debug connection problems # 9 is extremely verbose log /var/log/openvpn/openvpn.log verb 3
Разделяем конфиги
Содержимое конфига выше оставляем как есть, только переименуем его. Чуть ниже будет понятно почему так нужно
mv openvpn.conf udp.conf
Теперь на его базе создаем конфиг для tcp-протокола
cp udp.conf tcp.conf
И приводим его к следующему виду
local 333.33.3.1 port 1194 proto tcp dev tun16 management localhost 7506 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/dkc.crt key /etc/openvpn/keys/dkc.key dh /etc/openvpn/keys/dh.pem crl-verify /etc/openvpn/keys/crl.pem server 192.168.16.0 255.255.255.0 client-config-dir /etc/openvpn/ccd push "dhcp-option DNS 192.168.12.9" push "dhcp-option DNS 192.168.12.10" tls-server tls-auth keys/ta.key 0 tls-timeout 60 auth SHA512 cipher AES-256-CBC keepalive 10 60 comp-lzo max-clients 30 user nobody group nobody persist-key persist-tun status /var/log/openvpn/openvpn-status.log # 0 is silent, except for fatal errors # 4 is reasonable for general usage # 5 and 6 can help to debug connection problems # 9 is extremely verbose log /var/log/openvpn/openvpn.log verb 3
Я выделил строки, которые нужно было изменить
Запуск
Запуск двух инстансов OpenVPN можно осуществить вручную, но нам нужно, чтоб они запускались сами после перегрузки сервера. В Gentoo это решается очень просто
cd /etc/init.d ln -s openvpn openvpn.udp ln -s openvpn openvpn.tcp
Забираем из автозапуска стандартный openvpn скрипт
rc-update del openvpn
И добавляем свои линки
rc-update add openvpn.udp rc-update add openvpn.tcp
После запуска
rc-service openvpn.udp start rc-service openvpn.tcp start
должны подняться интерфейсы tun15, tun16
Если так произошло, примите мои поздравления и подключайте клиентов

- Системный администратор с 2000 года
- Участник Freelancehunt, Хабр Q&A, cyberforum
- Кейсы