Один и тот же процесс openvpn не может прослушивать сокеты UDP и TCP одновременно.
У вас есть два хороших варианта:
использовать два интерфейса крана для openvpn. Иметь два серверных процесса openvpn, по одному для каждого интерфейса крана; один должен слушать по UDP, другой по TCP. Соедините эти два интерфейса на сервере.
использовать два интерфейса Tun. Они не могут быть соединены мостом, поэтому, если вы хотите разделить пространство IP между клиентами TCP и UDP, вам нужно использовать learn-address
скрипт, подобный тому, что на http://thomas.gouverneur.name/2014/02/openvpn- listen-on-tcp-and-udp-with-tun / (однако этот конкретный сценарий уязвим для атаки символической ссылки / tmp, поэтому удалите запись в / tmp, если вы его используете).
Третий вариант - просто запустить два экземпляра openvpn и назначить каждому клиенту отдельное IP-пространство (например, по одному / 25 из одной подсети / 24 каждого подсети). Это позволяет избежать мостов и необходимости в скрипте с адресом обучения.
РЕДАКТИРОВАТЬ: так как мне нужен такой сценарий учиться адрес, я написал один. Я размещаю это в открытом доступе.
#!/bin/sh
#
# This script allows an openvpn server with several openvpn instances that
# use tun interfaces to share client IP space by adjusting the routing table
# to create entries towards specific clients as needed
action="$1"
addr="$2"
cn="$3" # not used, but it's there; you could e.g. log it
case "$action" in
add)
echo "sudo ip ro add $addr/32 dev $dev" >&2
exec sudo ip ro add $addr/32 dev $dev
;;
delete)
echo "sudo ip ro del $addr/32 dev $dev" >&2
sudo ip ro del $addr/32
exit 0 # ignore errors
;;
update)
echo "sudo ip ro change $addr/32 dev $dev" >&2
exec sudo ip ro change $addr/32 dev $dev
;;
esac
Этот скрипт регистрирует в stderr, который должен попасть в журнал openvpn.
tun
интерфейсы не имеют уровня MAC и, следовательно, не могут быть членами моста. Если вы хотите использовать мосты, вам нужно использоватьtap
интерфейсы.