====== OpenVPN ====== [[wpde>OpenVPN]] ist eine Software zur Herstellung eines Virtuellen Privaten Netzwerkes (VPN) über eine verschlüsselte [[wpde>Transport Layer Security|TLS]]-Verbindung. Zur Verschlüsselung werden die Bibliotheken des Programmes OpenSSL benutzt. OpenVPN verwendet wahlweise UDP oder TCP zum Transport. Die Vorteile von OpenVPN gegenüber anderen Lösungen liegen in der (relativ) einfachen Konfiguration und der Verfügbarkeit für alle wichtigen Plattformen (u.a. Android, iOS, Linux, Solaris, versch. BSDs, Mac OS X und Microsoft Windows) bei gleichzeitig sehr guter Sicherheit. * Openvpn unterstützt seit Version 2.3 voll [[netzwerke:ipv6]]. * Seit Version 2.4 ist unter Windows eine Benutzung ohne Admin-Rechte möglich (openvpn gui und Dienst "OpenVPNServiceInteractive"; Config in das Verzeichnis "C:\Program Files\OpenVPN\config" kopieren) ===== Links ===== * [[http://wiki.ubuntuusers.de/OpenVPN|ausführliche OpenVPN Anleitung]] (Quelle und Grundlage dieses Artikels) * [[http://www.tecchannel.de/netzwerk/lan/2027226/workshop_kostenlose_vpn_loesung_openvpn_auf_einem_linux_server/|Workshop: Sichere Einwahlverbindungen mit OpenVPN auf einem Linux-Server]] * [[http://www.linuxforen.de/forums/showthread.php?t=169354|Deutsches OpenVPN howto]] * [[http://silmor.de/ipv6.openvpn.php|IPv6 via OpenVPN]] * [[http://www.indato.ch/openvpn/openvpn.html|Virtual Private Network (VPN) mit OpenVPN]] * [[http://www.linux.com/article.pl?sid=06/11/07/213217|How to bridge networks with OpenVPN]] * [[http://www.freesoftwaremagazine.com/articles/book_review_openvpn_building_virtual_private_networks|Book review: OpenVPN: Building and Integrating Virtual Private Networks by Markus Feilner]] * [[http://www.henningdippel.de/vpn/openvpn-client/|OpenVPN-Client (Windows)]] ==== Wizards und Hilfen ==== * [[http://freshmeat.net/projects/stonevpn|Stonevpn]] ===== Installation ===== * **Android**: [[https://play.google.com/store/apps/details?id=net.openvpn.openvpn|openvpn connect]] * **Linux**: Folgendes Paket wird benötigt: openvpn (bei [[ubuntu:Ubuntu]] im "universe"). * **ios** (ipad, iphone): [[https://itunes.apple.com/de/app/openvpn-connect/id590379981?mt=8|openvpn connect]] * **MacOS X**: [[http://www.heise.de/download/tunnelblick-1138070.html|Tunnelblick GUI incl. openvpn]] Alternativ [[https://www.sparklabs.com/viscosity/|Viscosity]] (kostenpflichtig) * **Windows** Desktop: [[http://build.openvpn.net/downloads/releases/latest/openvpn-install-latest-stable.exe|openvpn Direktlink]] oder https://openvpn.net/index.php/open-source/downloads.html; Alternativ [[http://sourceforge.net/projects/securepoint/|securepoint]] (opensource) [[https://www.sparklabs.com/viscosity/|Viscosity]] (kostenpflichtig) * Windows mobile: kein Client verfügbar, [[https://technet.microsoft.com/en-us/windows/dn673608|Alternativen]] ===== Server ===== Man muss sich entscheiden zwischen tun und tap-Konfiguration. - ein **tun-Gerät** liegt auf **Layer 3** (des [[netzwerke:iso:osi-modell|ISO/OSI-Modells]]) und bietet [[netzwerke:TCP/IP]]-Zugang, was auch für die meisten Anwendungen ausreichen sollte - braucht man andere Protokolle als [[netzwerke:TCP/IP]] bzw. Kontrolle über **Layer 2** muss man ein **tap-Gerät** konfigurieren. Im folgenden wird eine tun-Konfiguration beschrieben. ==== Schlüssel und Zertifikate generieren ==== :!: Der folgene Teil gilt für die [[https://github.com/OpenVPN/easy-rsa|easy-rsa 3.x]]: **Einrichtung**: * neuer dh-key: "openssl dhparam -out dh2048.pem 2048" * Neuer ta.key: "openvpn --genkey --secret ta.key" * vars anpassen * PKI Initialisieren: ./easyrsa init-pki * Neue CA bauen: ./easyrsa build-ca (CA-PAsswort wird festgelegt!) ** Server-cert anlegen**: * ./easyrsa gen-req server openvpn-server-2017 nopass * ./easyrsa gen-req openVPNserver nopass * ./easyrsa sign-req server openVPNserver **Clients hinzufügen**: * MIT Passphrase: ./easyrsa gen-req client1 * oder OHNE Passphrase: ./easyrsa gen-req client1 nopass * signieren: ./easyrsa sign-req client client1 === easy-rsa v2 (veraltet) === :!: Der folgende Abschnitt ist für neue Server nicht mehr empfohlen Als erstes sollte man die Beispielkonfiguration und das Verzeichnis zur Schlüsselerzeugung an einen geeigneten Ort entpacken: sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/ sudo gunzip /etc/openvpn/server.conf.gz sudo cp -r /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa2 Die gegenseitige Authentifizierung zwischen Server und Client findet bei OpenVPN über kryptografische Schlüssel und Zertifikate statt, die als erstes erstellt werden müssen. Dazu wechselt man zuerst in das Verzeichnis ''/etc/openvpn/easy-rsa2/'' und editiert dort die Datei ''vars'' mit Root-Rechten. In der ''vars'' findet man am Ende folgende Einträge: export KEY_COUNTRY=DE export KEY_PROVINCE=NRW export KEY_CITY=Düsseldorf export KEY_ORG=”Vpntest” export KEY_EMAIL=”onlyspam@myhomepage.net” Diese Einträge sollten auf die eigenen Einstellungen angepasst werden. Aufgrund eines Fehlers wird manchmal das Unterverzeichnis für die Keys nicht erstellt. Man sollte dies darum von Hand nachholen: sudo mkdir keys Danach muss die oben angepasste Datei vars "gesourct" (d.h. in die Umgebungsvariablen aufgenommen) werden: source ./vars Es erscheint eine Warnmeldung, worauf mit den folgenden Skriptaufrufen das Master-Zertifikat und der Master-Schlüssel erstellt werden: sudo -E ./clean-all sudo -E ./build-ca Jetzt muss noch das Zertifikat und der Schlüssel für den Server erstellt werden: sudo ./build-key-server server Wichtig dabei ist, dass bei //Common Name// der Name eingegeben werden sollte, mit dem auf den Server später zugegriffen wird. Das kann z.B. auch der DynDNS-Name sein. Das //Challenge Password// kann leer gelassen werden. Um die Datenbank zu aktualisieren, muss danach zweimal mit Y bestätigt werden. Anschließend müssen nun die Schlüssel für die Benutzer angelegt werden: sudo ./build-key ersterclient sudo ./build-key zweiterclient sudo ./build-key dritterclient Das geschieht nach dem gleichen Prinzip wie gerade eben beim Server, jedoch muss nun bei //Common Name// jeweils der Name des Clients eingetragen werden. Benötigt man zu einem späteren Zeitpunkt **weitere Zertifikate**, muss zuerst die vars als root (sudo -s) erneut gesourcet werden. Danach können wie gewohnt neue Zertifikate mittels ./build-key erstellt werden. Jetzt müssen noch die Diffie-Hellman-Parameter generiert werden. Diese sind von Nöten, um kryptografische Schlüssel sicher über unsichere Kanäle auszuhandeln. Das geschieht mit sudo ./build-dh Die Erstellung kann je nach System einige Zeit dauern. Wenn die Erstellung erfolgreich gewesen ist, liegen nun alle benötigten Dateien im Verzeichnis ''/etc/openvpn/easy-rsa2/keys/''. Die Dateien mit der Endung ''.key'' sind die geheimen Schlüssel, die nur auf dem entsprechenden Rechner, zu dem sie gehören, gespeichert werden sollten. Die ''.crt''-Dateien sind die Zertifikate, die nicht geheim gehalten werden müssen. Die Client-Schlüssel und -Zertifikate müssen nun auf die Clients transferiert werden, ''server.key'' und ''ca.key'' bleiben wo sie sind. Außerdem muss jeder Client noch die Datei ''ca.crt'' erhalten, damit er den Server einwandfrei identifizieren kann. Zusätzlich muss noch darauf geachtet werden, dass die Dateien nie im ASCII-Modus übertragen werden. Dies kann dazu führen das die Datei nicht mehr entschlüsselt werden kann und somit ein Verbinden mit dem openVPN-Server nicht möglich ist. Fehlermeldung: "Error: private key password verification failed". Am besten umgeht man das Problem indem man alle zu übertragenden Dateien in ein .tar- oder .rar-Archiv packt. ==== Konfiguration ==== Nun muss noch die Server-Konfigurationsdatei ''/etc/openvpn/server.conf'' angepasst werden. Wichtig ist, dass die Pfade zu den Schlüsseln angepasst werden. Alle anderen Einstellungen sind schon ganz brauchbar. ca ./easy-rsa/keys/ca.crt cert ./easy-rsa/keys/server.crt key ./easy-rsa/keys/server.key # Diese Datei geheim halten. dh ./easy-rsa/keys/dh2048.pem # Diffie-Hellman-Parameter Zur Verbesserung der Sicherheit sollte man den Daemon unter einer unprivilegierten Benutzerkennung laufen lassen, indem man folgende Zeilen aktiviert: # Downgrade privileges after initialization (non-Windows only) user nobody group nogroup Noch besser ist es, hier nicht auf die Kennung //nobody/nogroup// zurückzugreifen, sondern eine eigene spezialisierte //openvpn/openvpn//-Identität zu schaffen, wobei man die Shell auf **/bin/false** setzen kann. sudo adduser --system --disabled-login --no-create-home openvpn sudo addgroup --system --disabled-login --no-create-home openvpn Wer den Server in einem privaten LAN stehen hat, muss noch Port-Forwarding auf seinem Router aktivieren. OpenVPN nutzt standardmäßig den Port 1194 (UDP), der auf die interne IP-Adresse des VPN-Servers weitergeleitet werden muss. Wer einen Linux-[[http://wiki.ubuntuusers.de/Router|Router]] betreibt, kann dafür das [[http://wiki.ubuntuusers.de/Skripte/nathelper|nathelper-Skript]] verwenden. Besitzer eines Hardware-Routers sollten bei Bedarf dessen Betriebsanleitung oder die Webseiten des Router-Herstellers zu Rate ziehen. Jetzt kann der Server folgendermaßen gestartet werden: sudo /etc/init.d/openvpn restart hilft eventuell der Abschnitt [[#Fehlerbehebung]] weiter. ==== LAN einbeziehen ==== Um dem Client nicht nur den Server selber, sondern auch das LAN über das VPN zugänglich zu machen, muss nochmal die ''server.conf'' bearbeitet werden. Dort wird im betreffenden Bereich folgendes eingetragen: push "route 192.168.2.0 255.255.255.0" - Der hier genannte IP-Bereich muss natürlich durch das korrekte serverseitige LANs ersetzt werden. - Außerdem muss noch das IP-Forwarding am Server aktiviert werden:sudo sysctl -w net/ipv4/ip_forward=1 Um diese Änderung permanent zu machen, kann man sie in die Datei **/etc/sysctl.conf** eintragen: net.ipv4.ip_forward=1 - Wenn der OpenVPN-Daemon nicht auf dem Default-Gateway des lokalen Netzes läuft, so muss auf diesem Default-Gateway/Router noch eine Route erstellt werden, die den OpenVPN-Server als Gateway für das VPN festlegt. Handelt es sich dabei um einen Linux-Rechner, so lautet der Befehl wie folgt und kann bei Bedarf (ohne sudo) in die Datei ''/etc/rc.local'' eingetragen werden: sudo route add -net 10.8.0.0 netmask 255.255.255.0 gw VPN.SERVER.I.P - Weiterhin müssen bei einer evtl. vorhandenen Firewall Regeln (bei Iptables in der Forward-chain) eingerichtet werden, die die Kommunikation erlauben. ==== mehrere Instanzen betreiben ==== Wenn Openvpn auf mehreren Ports lauschen soll, muss für jeden Port eine eigene Instanz konfiguriert werden. , eine Doppelbelegung funktioniert nicht. Vorteilhaft ist dabei dann man jedes Interface mit speziellen Firewall-regeln versehen kann. Damit jedoch nicht die unterschiedlichen Instanzen ihre Log- und Statusdateien überschreiben muss mindestens diese Einstellungen anders lauten: - server - port und ggf. proto - ifconfig-pool-persist - status - log bzw. "log-append" falls nicht syslog verwendet wird Zusätzlich muss jede dieser Instanzen ein eigenes tun-devices benutzen, deshalb ist dieser Eintrag in der zweiten server-B.conf notwendig: dev tun1 Das Initscript sollte dann für jede der Konfigurationsdateien einmal openvpn starten. Hier das Script aus [[debian:Debian]] Lenny: #!/bin/sh -e ### BEGIN INIT INFO # Provides: vpn # Required-Start: $network $local_fs # Required-Stop: $network $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Openvpn VPN service ### END INIT INFO # Original version by Robert Leslie # , edited by iwj and cs # Modified for openvpn by Alberto Gonzalez Iniesta # Modified for restarting / starting / stopping single tunnels by Richard Mueller . /lib/lsb/init-functions test $DEBIAN_SCRIPT_DEBUG && set -v -x DAEMON=/usr/sbin/openvpn DESC="virtual private network daemon" CONFIG_DIR=/etc/openvpn test -x $DAEMON || exit 0 test -d $CONFIG_DIR || exit 0 # Source defaults file; edit that file to configure this script. AUTOSTART="all" STATUSREFRESH=10 if test -e /etc/default/openvpn ; then . /etc/default/openvpn fi start_vpn () { if grep -q '^[ ]*daemon' $CONFIG_DIR/$NAME.conf ; then # daemon already given in config file DAEMONARG= else # need to daemonize DAEMONARG="--daemon ovpn-$NAME" fi if grep -q '^[ ]*status ' $CONFIG_DIR/$NAME.conf ; then # status file already given in config file STATUSARG="" elif test $STATUSREFRESH -eq 0 ; then # default status file disabled in /etc/default/openvpn STATUSARG="" else # prepare default status file STATUSARG="--status /var/run/openvpn.$NAME.status $STATUSREFRESH" fi log_progress_msg "$NAME" STATUS=0 # Check to see if it's already started... if test -e /var/run/openvpn.$NAME.pid ; then log_failure_msg "Already running (PID file exists)" STATUS=0 else $DAEMON $OPTARGS --writepid /var/run/openvpn.$NAME.pid \ $DAEMONARG $STATUSARG --cd $CONFIG_DIR \ --config $CONFIG_DIR/$NAME.conf || STATUS=1 fi } stop_vpn () { kill `cat $PIDFILE` || true rm -f $PIDFILE rm -f /var/run/openvpn.$NAME.status 2> /dev/null } case "$1" in start) log_daemon_msg "Starting $DESC" # autostart VPNs if test -z "$2" ; then # check if automatic startup is disabled by AUTOSTART=none if test "x$AUTOSTART" = "xnone" -o -z "$AUTOSTART" ; then log_warning_msg " Autostart disabled." exit 0 fi if test -z "$AUTOSTART" -o "x$AUTOSTART" = "xall" ; then # all VPNs shall be started automatically for CONFIG in `cd $CONFIG_DIR; ls *.conf 2> /dev/null`; do NAME=${CONFIG%%.conf} start_vpn done else # start only specified VPNs for NAME in $AUTOSTART ; do if test -e $CONFIG_DIR/$NAME.conf ; then start_vpn else log_failure_msg "No such VPN: $NAME" STATUS=1 fi done fi #start VPNs from command line else while shift ; do [ -z "$1" ] && break if test -e $CONFIG_DIR/$1.conf ; then NAME=$1 start_vpn else log_failure_msg " No such VPN: $1" STATUS=1 fi done fi log_end_msg ${STATUS:-0} ;; stop) log_daemon_msg "Stopping $DESC" if test -z "$2" ; then for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do NAME=`echo $PIDFILE | cut -c18-` NAME=${NAME%%.pid} stop_vpn log_progress_msg "$NAME" done else while shift ; do [ -z "$1" ] && break if test -e /var/run/openvpn.$1.pid ; then PIDFILE=`ls /var/run/openvpn.$1.pid 2> /dev/null` NAME=`echo $PIDFILE | cut -c18-` NAME=${NAME%%.pid} stop_vpn log_progress_msg "$NAME" else log_failure_msg " (failure: No such VPN is running: $1)" fi done fi log_end_msg 0 ;; # Only 'reload' running VPNs. New ones will only start with 'start' or 'restart'. reload|force-reload) log_daemon_msg "Reloading $DESC" for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do NAME=`echo $PIDFILE | cut -c18-` NAME=${NAME%%.pid} # If openvpn if running under a different user than root we'll need to restart if egrep '^[[:blank:]]*user[[:blank:]]' $CONFIG_DIR/$NAME.conf > /dev/null 2>&1 ; then stop_vpn sleep 1 start_vpn log_progress_msg "(restarted)" else kill -HUP `cat $PIDFILE` || true log_progress_msg "$NAME" fi done log_end_msg 0 ;; # Only 'soft-restart' running VPNs. New ones will only start with 'start' or 'restart'. soft-restart) log_daemon_msg "$DESC sending SIGUSR1" for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do NAME=`echo $PIDFILE | cut -c18-` NAME=${NAME%%.pid} kill -USR1 `cat $PIDFILE` || true log_progress_msg "$NAME" done log_end_msg 0 ;; restart) shift $0 stop ${@} sleep 1 $0 start ${@} ;; cond-restart) log_daemon_msg "Restarting $DESC." for PIDFILE in `ls /var/run/openvpn.*.pid 2> /dev/null`; do NAME=`echo $PIDFILE | cut -c18-` NAME=${NAME%%.pid} stop_vpn sleep 1 start_vpn done log_end_msg 0 ;; *) echo "Usage: $0 {start|stop|reload|restart|force-reload|cond-restart}" >&2 exit 1 ;; esac exit 0 # vim:set ai sts=2 sw=2 tw=0: ==== MTU Config ==== Folgende Einstellungen sind möglich, müssen aber sowohl auf Server als auch auf Client-Ebene hinterlegt werden. # UDP-Pakete fragmentieren nach: fragment 1400 # TCP-Verbindung den Wert signalisieren mssfix 1350 weitere Einstellungen: # MTU auf tun-Ebene tun-mtu n # MTU auf Netzwerk-Ebene link-mtu n * [[https://community.bahn.de/questions/1197692-nutzung-wifionice-ssl-vpn|die Bahn kann nur eine MTU von 1440]] * [[https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage|openvpn 2.4 man page]] Auf [[windows:Windows]]-Ebene: :!: Achtung permante Einstellungen LAN: netsh interface ipv4 set subinterface "Local Area Connection" mtu=1440 store=persistent Wlan: netsh interface ipv4 set subinterface "Wireless Network Connection" mtu=1440 store=persistent ===== Authentifizierung ===== - per Zertifikat - Passwort - LDAP - Kerberos - ADS - IMAP - PAM-Module Damit der OpenVPN-Client den Benutzer überhaupt nach einem Benutzernamen und Passwort fragt, muss er mit "--enable-password-save" kompiliert worden sein, also ./configure --enable-password-save * [[debian:Debian]]: in squeeze aktiviert * Gentoo: USE-Flag: "passwordsave" * Ubuntu: nicht Standard * Windows? Siehe auch: [[http://nodomain.cc/2007/06/30/howto-rootserver-als-openvpn-gateway-nutzen.html|Howto: Rootserver als OpenVPN-Gateway nutzen]]. ==== pam_imap ==== Falls Authentifizierung an IMAP erwünscht ist, muss [[http://sourceforge.net/projects/pam-imap/|pam_imap]] kompiliert werden (als Paket für [[debian:Debian]] nicht verfügbar): * nötige Pakete installieren: aptitude install make libssl-dev libpam0g libpam0g-dev libpam-runtime libpam-modules * pam_imap herunterladen (Beispiel an Version 0.38 ggf. anpassen!): wget http://sourceforge.net/projects/pam-imap/files/pam-imap/pam_imap-0.3.8/pam_imap-0.3.8.tar.bz2/download * entpacken: tar xvjf pam_imap-0.3.8.tar.bz2 * in Verzeichnis wechseln:cd pam_imap-0.3.8 * kompilieren ("make install" kopiert pam_imap.so gleich nach ''/lib/security/''): ./configure && make && make install :!: [[http://sourceforge.net/projects/pam-imap/forums/forum/326678/topic/3156481|für Debian 64Bit ist noch eine Anpassung fällig]] ==== Authentifizierung individuell einstellen ==== - Zuerst PAM-per-User mit Konfigurationsdatei ''/etc/pam.d/openvpn'' konfigurieren: auth required pam_per_user.so.1 account required pam_permit.so - danach in /etc/pam_per_user.map benutzer1: openvpn-ldap benutzer2: openvpn-krb5 benutzer3: openvpn-imap - benutzer1 meldet sich gegen LDAP an (Datei ''/etc/pam.d/openvpn-ldap''):auth required pam_env.so auth required pam_ldap.so account required pam_ldap.so - benutzer2 meldet sich gegen Kerberos an (Datei ''/etc/krb5.conf''):auth requisite pam_krb5.so no_ ccache account required pam_kermit.so - benutzer3 kommt per IMAP-Account (Datei ''/etc/pam.d/openvpn-imap''):PAM_PasswordString = Password for Mail-Server: CertificateFile /usr/share/ssl/certs/imapd.pem PAM_Server0 = imap.domain.tld:143 PAM_Blocklist = root, admin, Administrator, apache PAM_HashEnable = no PAM_HashFile = /etc/pam_imap.gdbm PAM_HashDelta = 20 - in der server.conf muss nun das PAM-Plugin angegeben werden (damit wird ''/etc/pam.d/openvpn'' benutzt): plugin /usr/lib/openvpn/openvpn-auth-pam.so openvpn - :!: in der ''client.conf'' muss "''auth-user-pass''" angegeben sein. ==== Konfiguration für einzelne Benutzer ==== Für individuellen Clients kann eine spezielle Konfiguration angelegt werden. Dazu muss folgende Zeile ("ccd" ist änderbar) in der server.conf hinzugefügt werden:client-config-dir ccd Individuelle Konfigurationen gehen anhand des Common-Names (CN) des Benutzerzertifikats in ''/etc/openvpn/ccd/CN'' also z.B. ''/etc/openvpn/ccd/benutzer1'': ifconfig-push 10.0.8.21 10.0.8.22 push "redirect-gateway" push "route 10.0.8.0 255.255.255.0" :!: Der push-Buffer hat nur 1024 Byte, man bekommt sonst Fehler der Art "Maximum length of push-Buffer (1024) has been exceeded". Bei ifconfig-push gibt die erste IP-Adresse die Adresse des virtuellen Clients an, die 2. des virtuellen Server endpoints. Laut openvpn.org-HOWTO müssen Sie aus /30 subnets geholt werden, damit die Windows Clients/TAP-Win32 Treiber mitspielen. Zitat von http://openvpn.net/howto.html (siehe auch: [[http://www.online-tutorials.net/security/openvpn-tutorial/tutorials-t-69-209.html|OpenVPN Tutorial]]): Specifically, the last octet in the IP address of each endpoint pair must be taken from this set: [ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18] [ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38] [ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58] [ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78] [ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98] [101,102] [105,106] [109,110] [113,114] [117,118] [121,122] [125,126] [129,130] [133,134] [137,138] [141,142] [145,146] [149,150] [153,154] [157,158] [161,162] [165,166] [169,170] [173,174] [177,178] [181,182] [185,186] [189,190] [193,194] [197,198] [201,202] [205,206] [209,210] [213,214] [217,218] [221,222] [225,226] [229,230] [233,234] [237,238] [241,242] [245,246] [249,250] [253,254] Um zu verhindern, dass jemand ein fremdes Zertifikat benutzt (indem er das Zertifikat von einem anderen Benutzer präsentiert, zur Authentifizierung aber seine eigenen Daten verwendet) muss überprüft werden das der CN mit den Zugangsdaten zusammen passt. Dazu das Script ucn.pl (s. u.) erstellen und in der ''server.conf'' folgende Zeile dazu geben: auth-user-pass-verify /usr/local/scripts/ucl.pl via-env Dann übergibt OpenVPN über Umgebungsvariablen username und CN. !/usr/bin/perl ‑t # # OpenVPN ‑‑auth‑user‑pass‑verify script. # Only authenticate if username equals Ucommon_name. # In OpenVPN config file: auth‑user‑pass‑verify ./ucn.pl via‑env $username = $ENV{'username'}; $common_name = $ENV{'common_name'}; @common_name_array = split(/\./, $common_Uname); exit !(length($username) > 0 && Ulength($common_name) > 0 && $username eq U$common_name_array[0]); ==== individuelle Firewallregeln ==== learn-address /usr/local/scripts/openvpn-fw-conf FIXME # Eine eigene Tabelle für den User anlegen iptables ‑N chain‑$IP # In der Forward‑Table ist diese das Sprungziel für die Source‑IP des Users: iptables ‑I FORWARD ‑s $IP ‑j chain‑$IP # ESTABLISHED‑Connections einfach ohne weiteres Matching durchlassen: iptables ‑A chain‑$IP ‑s $IP ‑m state ‑‑state RELATED,ESTABLISHED ‑j ACCEPT # Nun folgen individuelle Regeln für den Benutzer, beispielsweise den Zugriff auf den Zielrechner $destHost, Port $destPort und das Protokoll $destProto: iptables ‑A chain‑$IP ‑p $destProto ‑s $IP ‑d $destHost ‑‑dport $destPort ‑j ACCEPT # Oder dasselbe mit mehreren Ports mit --dports: iptables ‑A chain‑$IP ‑m multiport ‑p $destProto ‑s $IP ‑d $destHost ‑‑dports $destPort ‑j ACCEPT # Vollzugriff auf einen Host: iptables ‑A chain‑$IP ‑s $IP ‑d $destHost ‑j ACCEPT # Abschließend den ICMP‑Traffic erlauben: iptables ‑A chain‑$IP ‑p icmp ‑s $IP ‑j ACCEPT # und alles weitere verbieten: iptables ‑A chain‑$IP ‑s $IP ‑j DROP ===== Client-Konfiguration ===== Zuerst muss auch auf den Clients das **openvpn**-Paket installiert werden, wie weiter oben beschrieben. Statt der Datei ''server.conf'' wird hier aber logischerweise die ''client.conf'' editiert. Dort ändert man die IP-Adresse unter der der Server erreichbar ist. Wer keine statische IP zur Verfügung hat, kann dort auch seine dyndns-Adresse angeben remote ich.dyndns.org Die Pfade der einzelnen ca, cert, usw. müssen hier nicht unbedingt angepasst werden, wenn die einzelnen Dateien auf dem Client im gleichen Ordner liegen wie die ''client.conf'' und die voreingestellten Dateinamen besitzen. Natürlich müssen sie erstmal vom Server herüberkopiert worden sein. Die **Authentifizierung des OpenVPN-Servers** ist für einen ersten Test nicht notwendig, für die spätere Benutzung aus Sicherheitsgründen aber empfohlen. Dazu wählen wir eine der Methoden die auf der Seite [[http://openvpn.net/howto.html#mitm]] beschrieben ist. Bei einem aktuellen Ubuntu (ab hardy) mit OpenVPN-Version ab 2.1 funktioniert: remote-cert-tls server Andernfalls bekommen wir bei jeder Verbindung eine Warnung ("WARNING: No server certificate verification method has been enabled. See [[http://openvpn.net/howto.html#mitm]] for more info.") ==== Openvpn 2.4 (Windows) ==== Mit dem neuen openvpn 2.4 ist es möglich unter Windows eine Openvpn-Einwahl auch ohne Admin-Rechte machen zu können. - Download - Installation folgen (Lizenz annehmen, Filtertreiber installieren usw.) - die passende config nehmen (s.o.) und diese Config in das Verzeichnis "C:\Program Files\OpenVPN\config" kopieren (Admin-Rechte einmalig erforderlich) - openvpn gui starten - rechte Maustaste aufs Symbol {{:security:openvpn.png|openvpn manager symbol}} -> Einstellungen - Launch on Windows startup + OK Falls es nicht gehen sollte: * der Dienst " OpenVPNServiceInteractive" muss laufen * Configs die mit der Gui importiert werden, landen im Benutzerverzeichnis C:\Users\USER\OpenVPN\config. Die findet der Dienst nicht und somit müsste die gui wieder mit Adminrechten gestarten werden. Also in den o.g. Systemordner verschieben. ==== Linux ==== OpenVPN-Paket installieren: Debian, Ubuntu: aptitude install openvpn Vorraussetzung: openvpn über den Paketmanager installieren, (falls nötig aktuelleres Repo einbinden) Bei internen DNS-Servern (nicht öffentlich auflösbare interne Zonen) wird vom VPN-Server der DNS-Server via push-option übermittelt. Leider setzt dies openvpn nicht selbstständig um. === bei systemd-resolved === [[https://raw.githubusercontent.com/jonathanio/update-systemd-resolved/master/update-systemd-resolved|Direktdownload]], ablegen in /etc/openvpn/scripts : # LINUX only script-security 2 up /etc/openvpn/scripts/update-systemd-resolved down /etc/openvpn/scripts/update-systemd-resolved down-pre Quelle: * https://serverfault.com/questions/732317/openvpn-and-systemd-resolved/835556 * https://github.com/jonathanio/update-systemd-resolved === Methode resolvconf === **ohne networkmanager**: Paket resolvconf muss installiert sein. Damit die Namensauflösung funktioniert muss in der ovpn-Config-Datei diese Zeilen anhängt werden: # LINUX only! (needs resolvconf installed!) up /etc/openvpn/update-resolv-conf down /etc/openvpn/update-resolv-conf # for resolvconf and openvpn >= 2.1: script-security 2 === Network-Manager/VPN Plugins === Die Network-Manager VPN Plugins bieten eine Oberfläche für die VPN-Einwahl an: ''sudo apt install network-manager-openvpn network-manager-openvpn-gnome'' === Openvpn-Dienst als Client === Wenn die Verbindung bei jedem Systemstart automatisch aufbauen lassen will, muss folgende Zeile in der Datei **/etc/default/openvpn** aktivieren: AUTOSTART="$Profilname" # oder "all" ==== Android ==== Android enthält seit Version 4.1 standardmäßig einen Open-VPN-Client (ältere Versionen muss man ggf. "rooten") aber auch die offizielle App [[https://play.google.com/store/apps/details?id=net.openvpn.openvpn&hl=de|OpenVPN Connect]] ist empfehlenswert. ==== iPhone / iPad ==== Den "OpenVPN Connect Client" aus dem Store installieren. ==== OpenVPN über HTTP-Proxy ==== Sitzt man nicht direkt an einem Internetzugang (z.b. im Büro oder beim Kunden), so hat man oft keine Möglichkeit über Port 1194 ins Internet zu kommen. Üblicherweise ist aber der Port 443 (HTTPS) in jedem Netz freigeschaltet. Um vom Client über den HTTPS-Proxy ins Internet und zum heimischen OpenVPN-Server zu gelangen, müssen folgende Konfigurationen gemacht werden: === server.conf === # Which TCP/UDP port should OpenVPN listen on? # If you want to run multiple OpenVPN instances # on the same machine, use a different port # number for each one. You will need to # open up this port on your firewall. port 443 ;port 1194 # TCP or UDP server? proto tcp ;proto udp Auf dem Server wird in der **server.conf** auf den Port 443 umgeschaltet. Zudem wird hier auf das Protokoll TCP umgeschaltet, was nicht zwingend ist, aber weniger Probleme verursacht bei der Benutzung eines HTTP-Proxys. === client.conf === # If you are connecting through an # HTTP proxy to reach the actual OpenVPN # server, put the proxy server/IP and # port number here. See the man page # if your proxy server requires # authentication. http-proxy 192.168.4.1 1080 ;http-proxy-retry # retry on connection failures ;http-proxy [proxy server] [proxy port #] Auf dem Client wird in der ''client.conf'' die Zeile //http-proxy 192.168.4.1 1080// hinzugefügt. Wobei die Addresse des Proxy //192.168.4.1// und der Port //1080// mit den effektiven Angaben ersetzt werden müssen. Weitere Informationen zur Konfiguration von HTTP-Proxys sind unter [[http://openvpn.net/howto.html#http]] verfügbar. ===== Fehlerbehebung ===== Falls der Start von OpenVPN nicht klappt, finden sich im Protokoll (Logdatei) Hinweise zur Fehlerbehebung. Die Meldungen sollten je nach Distribution in ''/var/log/daemon.log'', ''/var/log/syslog'' oder ''/var/log/messages'' stehen. ==== Cannot allocate TUN/TAP dev dynamically (virtualisierte Systeme) ==== Folgender Fehler im Protokoll (häufig bei virtualisierten Systemen der Fall): openvpn[...]: Note: Cannot open TUN/TAP dev /dev/net/tun: Permission denied (errno=13) openvpn[...]: Note: Attempting fallback to kernel 2.2 TUN/TAP interface openvpn[...]: Cannot allocate TUN/TAP dev dynamically Viele Provider bieten mittlerweile günstige virtualisierte Server an (auch VPS oder VServer). Bestimmte Funktionen lassen sich auf solchen Servern nur nutzen, wenn die entsprechenden Fähigkeiten auch in den Kernel des Host-Systems kompiliert wurden, auf dem die VPS läuft. Das gilt insbesondere für TUN/TAP und iptables. Bei vielen Providern genügt es, wenn man in einem Support-Ticket kurz erklärt, dass man TUN/TAP oder iptables nutzen möchte und sie wechseln den Kernel aus. Funktioniert TUN/TAP dann immer noch nicht muss man das Gerät noch selbst erstellen: sudo mkdir -p /dev/net sudo mknod /dev/net/tun c 10 200 sudo chmod 600 /dev/net/tun Falls dies die Lösung bringt, ist die Anpassung des OpenVPN-Init-skripts (das die Befehle beim Start des Rechners ausführt) sinnvoll, da bei Neustarts ''/dev/net/tun'' wieder verschwunden ist. In die Datei ''/etc/init.d/openvpn'' schreiben wir also an den Anfang: # Create /dev/net (not created in Xen-environment) if [ ! -d /dev/net ] then mkdir -p /dev/net fi if [ ! -c /dev/net/tun ] then mknod /dev/net/tun c 10 200 fi chmod 600 /dev/net/tun # End of modifications ==== Replay-window backtrack occurred ==== Fehlermeldung: Replay-window backtrack occurred [63] Bei der Konfiguration mit UDP kann es sein, dass manche Pakete nicht in der Reihenfolge eintreffen in der sie abgeschickt wurden, sondern später. Manchmal auch zu spät, wie diese Meldung dokumentiert. Eine Lösung ist die Anhebung des "replay-window calibration", bei [[debian:Debian]] werrtet Als Startparameter: --replay-window 72 Als Option in der Konfigurationsdatei: replay-window 72 Links: * [[http://openvpn.net/archive/openvpn-users/2004-09/msg00068.html|[Openvpn-users] replay-window calibration]]