Ten sam proces openvpn nie może nasłuchiwać jednocześnie na gniazdach UDP i TCP.
Masz dwie dobre opcje:
użyj dwóch interfejsów tap dla openvpn. Mają dwa procesy serwera openvpn, po jednym dla każdego interfejsu tap; jeden powinien słuchać na UDP, drugi na TCP. Połącz te dwa interfejsy dotykowe na serwerze.
użyj dwóch interfejsów tun. Nie można ich zmostkować, więc jeśli chcesz dzielić przestrzeń IP między klientami TCP i UDP, musisz użyć learn-address
skryptu takiego jak ten pod adresem http://thomas.gouverneur.name/2014/02/openvpn- listen-on-tcp-and-udp-with-tun / (jednak ten konkretny skrypt jest podatny na atak dowiązania symbolicznego / tmp, więc usuń logowanie do / tmp, jeśli go używasz).
Trzecią opcją jest po prostu uruchomienie dwóch instancji openvpn i przypisanie do nich oddzielnej przestrzeni IP klienta (na przykład, jedna / 25 z tej samej / 24 podsieci każda). Pozwala to uniknąć mostkowania i konieczności użycia skryptu uczenia się adresu.
EDYCJA: ponieważ sam potrzebowałem takiego skryptu uczenia się, napisałem go. Umieszczam to w domenie publicznej.
#!/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
Ten skrypt loguje się do stderr, który powinien skończyć się w logu openvpn.
tun
interfejsy nie mają warstwy MAC, a zatem nie mogą być członkami mostu. Jeśli chcesz mostkować, musisz użyćtap
interfejsów.