Jak sprawić, aby OpenVPN nasłuchiwał zarówno portów TCP, jak i UDP

13

Szukałem i jedyną rzeczą, jaką znalazłem, jest to, że „tak, OpenVPN obsługuje połączenia przez TCP” , ale nie znalazłem żadnego sposobu, aby zmusić serwer openvpn do nasłuchiwania tego samego portu dla obu protokołów w tym samym czasie . Znalazłem kilka bardzo starych przewodników na temat tworzenia interfejsów dotykowych lub zalecania, aby w tym samym czasie działała inna instancja serwera z tą samą konfiguracją. Pierwszy z nich wydaje się zbyt skomplikowany, by zrobić coś prostego, a drugi wydaje się przestarzały.

Braiam
źródło

Odpowiedzi:

11

Ten sam proces openvpn nie może nasłuchiwać jednocześnie na gniazdach UDP i TCP.

Masz dwie dobre opcje:

  1. 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.

  2. 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-addressskryptu 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.

András Korn
źródło
4

Jeśli chcesz, aby serwer OpenVPN nasłuchiwał na porcie TCP zamiast portu UDP, użyj proto tcpzamiast niego proto udp(Jeśli chcesz, aby OpenVPN nasłuchiwał zarówno na porcie UDP, jak i TCP, musisz uruchomić dwie osobne instancje OpenVPN).

Czy masz na myśli, że ta strona jest przestarzała?

Myślę, że możesz uruchomić dwa serwery OpenVPN (jeden dla TCP, jeden dla UDP), zmostkuj każdy z nich za pomocą TUN, a następnie podłącz TUN.

nodakai
źródło
1
tuninterfejsy nie mają warstwy MAC, a zatem nie mogą być członkami mostu. Jeśli chcesz mostkować, musisz użyć tapinterfejsów.
András Korn