O mesmo processo openvpn não pode escutar nos soquetes UDP e TCP ao mesmo tempo.
Você tem duas boas opções:
use duas interfaces de toque para openvpn. Tenha dois processos de servidor openvpn, um para cada interface de toque; um deve ouvir no UDP, o outro no TCP. Faça a ponte dessas duas interfaces de toque no servidor.
use duas interfaces tun. Elas não podem ser conectadas em ponte; portanto, se você quiser compartilhar o espaço IP entre clientes TCP e UDP, precisará usar um learn-address
script como o http://thomas.gouverneur.name/2014/02/openvpn- listen-on-tcp-and-udp-with-tun / (no entanto, esse script específico é vulnerável a um ataque de link simbólico / tmp, remova o log de / tmp se você o usar).
A terceira opção é apenas executar duas instâncias do openvpn e atribuir espaço IP do cliente separado para ambas (por exemplo, um / 25 da mesma sub-rede / 24 cada). Isso evita a ponte e a necessidade de um script de endereço de aprendizado.
EDIT: como eu mesmo precisava de um script de endereço de aprendizado, escrevi um. Coloco-o em domínio público.
#!/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
Este script registra no stderr, que deve terminar no log do openvpn.
tun
interfaces não têm uma camada MAC e, portanto, não podem ser membros de uma ponte. Se você deseja fazer uma ponte, precisa usartap
interfaces.