Один и тот же процесс openvpn не может одновременно прослушивать UDP и TCP сокеты.
У вас есть два хороших варианта:
использовать два интерфейса tap для openvpn. Иметь два серверных процесса openvpn, по одному для каждого интерфейса tap; один должен прослушивать UDP, другой - TCP. Установите мост между этими двумя интерфейсами tap на сервере.
используйте два 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). Это позволяет избежать мостов и необходимости в скрипте обучения адресов.
EDIT: поскольку мне самому нужен такой скрипт для изучения адресов, я написал его. Я размещаю его в открытом доступе.
#!/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.