\chapter{Vorwort} Diese Dokumentation beschreibt die Installation und den Betrieb des IPv6-VPN-Dienst auf Basis von OpenVPN. Die Hintergründe zu der hier vorgestellten Konfiguration können in der dazugehörigen Masterarbeit \enquote{Konzeption und Umsetzung eines IPv6-VPN für die Abteilung Informatik} nachgelesen werden. \section{Konfigurationsvorgaben} Folgende Parameter wurden für die Konfiguration des Servers in Absprache mit dem IT-Team festgelegt: \begin{itemize} \item Hostname der Maschine: \texttt{aither.inform.hs-hannover.de} \item Hostname des OpenVPN-Dienstes: \texttt{vpn-test.inform.hs-hannover.de} \item IP-Adressen der Maschine \begin{itemize} \item \texttt{141.71.38.70/24} \item \texttt{2001:638:614:1780::131/64} \end{itemize} \item IP-Adressen der zu benutzenden Gateways \begin{itemize} \item \texttt{141.71.38.254} \item \texttt{2001:638:614:1780::1} \end{itemize} \item IP-Adressen des OpenVPN-Dienstes \begin{itemize} \item \texttt{141.71.38.7} \item \texttt{2001:638:614:1780::7} \end{itemize} \item IP-Adressbereich für VPN-Clients \begin{itemize} \item \texttt{10.2.0.0/16} \item \texttt{2001:638:614:1750::/64} \end{itemize} \item DNS-Server für Server in der DMZ: \texttt{141.71.38.1} \end{itemize} \chapter{Konfiguration des Grundsystems} \paragraph{Hostname} Sofern der Hostname bei der Installation von Debian nicht schon gesetzt wurde, so muss dies in den Dateien \texttt{/etc/hostname}, \texttt{/etc/mailname} und \texttt{/etc/hosts} nachgeholt werden. \begin{lstlisting} # echo "aither" > /etc/hostname # echo "aither.inform.hs-hannover.de" > /etc/mailname \end{lstlisting} In \texttt{/etc/hosts} muss der Eintrag für \texttt{127.0.1.1} angepasst werden: \begin{lstlisting} 127.0.1.1 aither.inform.hs-hannover.de aither \end{lstlisting} \paragraph{OpenSSH} In der Datei \texttt{/etc/ssh/sshd\_config} muss folgende Option auskommentiert und angepasst werden: \begin{lstlisting} PermitRootLogin yes \end{lstlisting} Anschließend wird der OpenSSH-Dienst aktiviert und gestartet. \begin{lstlisting} # systemctl enable ssh.service # systemctl start ssh.service \end{lstlisting} \paragraph{sudo} Das IT-Team arbeitet mit passwortbasierten SSH-Sitzungen unter dem Benutzer \texttt{root}. Damit in der Übergangsphase auf dem Server Anpassungen auch ohne Kenntnis des \texttt{root}-Passworts durchgeführt werden können, wird ein lokaler Benutzer eingerichtet. \begin{lstlisting} # apt-get install sudo # adduser jpt # gpasswd -a jpt sudo \end{lstlisting} Nach erfolgreicher Übergabe des Servers an das IT-Team kann dieser Benutzer wieder entfernt werden. \paragraph{apt} Um in der DMZ weiterhin Updates einspielen zu können, wird der vom IT-Team zur Verfügung gestellte Proxyserver in die Konfiguration von \texttt{apt} eingetragen. \begin{lstlisting} # echo 'Acquire::http::Proxy "http://proxy.inform.hs-hannover.de:3128";' > /etc/apt/apt.conf.d/80proxy \end{lstlisting} Das IT-Team stellt Debian-Pakete zur Verfügung, mit die Grundkonfiguration des Servers an die Vorgaben des IT-Teams angepasst werden kann. Um diese Pakete zu installieren, werden die Paketquellen des IT-Teams konfiguriert: \begin{lstlisting} # echo "deb http://http.edu.inform.hs-hannover.de/depot/debian/stretch/ Packages/" > /etc/apt/sources.list.d/inform.list \end{lstlisting} Als nächstes wird der GPG-Key importiert, mit dem die Pakete signiert sind: \begin{lstlisting} # wget -O repositoryKeyFile http://http.edu.inform.hs-hannover.de/repository/repositoryKeyFile # apt-key add repositoryKeyFile \end{lstlisting} Anschließend können die Pakete über \texttt{apt-get} installiert werden \begin{lstlisting} # apt-get update # apt-get install f4-i-srv-config-all-* f4-i-srv-config-dmz-adminscripts \end{lstlisting} \paragraph{Netzwerkkonfiguration} Als nächstes werden die IP-Adressen der Maschine und des Dienstes in \texttt{/etc/network/interfaces} konfiguriert. Die IP-Adressen der Maschine werden direkt für die Netzwerkkarte des Servers konfiguriert. Die IP-Adressen für den VPN-Dienst werden als Alias konfiguriert. Durch die Verwendung des Alias ist ein manueller Failover im Betrieb möglich, indem das Alias-Interface dem defekten Server deaktiviert wird und auf einem bereitstehenden Server aktiviert wird. Effektiv \enquote{wandert} die Dienst-IP somit vom defekten Server auf den bereitstehenden Server. Benutzer des VPN-Dienst bekommen abgesehen von einer Verbindungsunterbrechung nichts von dem defekten Server mit. Die resultierende Konfiguration für die IP-Adressen der Maschine sieht so aus: \begin{lstlisting} auto eno1 allow-hotplug eno1 #-primary network interface iface eno1 inet static address 141.71.38.70/24 gateway 141.71.38.254 post-up /sbin/ip addr add 141.71.38.7/24 dev eno1 pre-down /sbin/ip addr del 141.71.38.7/24 dev eno1 iface eno1 inet6 static address 2001:638:614:1780::0131/64 gateway 2001:638:614:1780::1 post-up /sbin/ip addr add 2001:638:614:1780::0007/64 dev eno1 pre-down /sbin/ip addr del 2001:638:614:1780::0007/64 dev eno1 \end{lstlisting} \paragraph{DNS} \texttt{141.71.38.1} ist der DNS-Resolver in der DMZ. \begin{lstlisting} echo "nameserver 141.71.38.1" > /etc/resolv.conf \end{lstlisting} \paragraph{IP-FORWARD einschalten} Da die Benutzer des VPN in der Lage sein sollen, das Netzwerk der Abteilung Informatik zu erreichen, muss IP-FORWARD auf dem VPN-Server aktiviert werden: \begin{lstlisting} # echo "net.ipv4.conf.all.FORWARD = 1" > /etc/sysctl.d/04-enable-ipv4-FORWARD.conf # echo "net.ipv6.conf.all.FORWARD = 1" > /etc/sysctl.d/06-enable-ipv6-FORWARD.conf \end{lstlisting} Anschließend werden die vorgenommenen Einstellungen aktiviert. \begin{lstlisting} # sysctl --system \end{lstlisting} \paragraph{Firewallregeln} Es wurde definiert, welcher Datenverkehr für den VPN-Server und VPN-Clients erlaubt ist. Diese werden jetzt über Filterregeln mit \texttt{iptables} beziehungsweise \texttt{ip6tables} umgesetzt. Als Standardpolicy wird \texttt{DROP} gewählt. \begin{lstlisting} iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP ip6tables -P INPUT DROP ip6tables -P OUTPUT DROP ip6tables -P FORWARD DROP \end{lstlisting} Datenverkehr über das Loopback-Interface ist immer erlaubt. \begin{lstlisting} iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT ip6tables -A INPUT -i lo -j ACCEPT ip6tables -A OUTPUT -o lo -j ACCEPT \end{lstlisting} Die Protokolle ICMP und ICMPv6 sind immer erlaubt. \begin{lstlisting} iptables -A INPUT -p icmp -j ACCEPT ip6tables -A INPUT -p icmp6 -j ACCEPT iptables -A OUTPUT -p icmp -j ACCEPT ip6tables -A OUTPUT -p icmp6 -j ACCEPT iptables -A FORWARD -p icmp -j ACCEPT ip6tables -A FORWARD -p icmp6 -j ACCEPT \end{lstlisting} Zugriffe auf den VPN-Server sind für die Dienste SSH und OpenVPN erlaubt. \begin{lstlisting} iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT ip6tables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -p udp --dport 1194 -j ACCEPT ip6tables -A INPUT -p udp --dport 1194 -j ACCEPT \end{lstlisting} Antwortpakete für eingehende Pakete auf SSH und OpenVPN-Dienst sind erlaubt. \begin{lstlisting} iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT ip6tables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT ip6tables -A OUTPUT -p udp --sport 1194 -j ACCEPT \end{lstlisting} Vom VPN-Server ausgehende Pakete sind grundsätzlich erlaubt. \begin{lstlisting} iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT ip6tables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT \end{lstlisting} Zum VPN-Server eingehende Pakete sind als Antwort auf ausgehende Pakete erlaubt. \begin{lstlisting} iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT \end{lstlisting} Für IPv4-Verkehr aus dem VPN soll NAT auf die \texttt{141.71.38.7} durchgeführt werden. \begin{lstlisting} iptables -t nat -A POSTROUTING -s 10.2.0.0/16 -j SNAT --to 141.71.38.7 \end{lstlisting} Datenverkehr aus dem VPN zu Hosts in der DMZ ist verboten und wird verworfen. \begin{lstlisting} iptables -A FORWARD -s 10.2.0.0/16 -d 141.71.38.0/24 -j DROP ip6tables -A FORWARD -s 2001:638:614:1750::/64 -d 2001:683:614:1780::/64 -j DROP \end{lstlisting} Jeglicher weiterer Datenverkehr aus dem VPN ist erlaubt. \begin{lstlisting} iptables -A FORWARD -s 10.2.0.0/16 -m state --state NEW,ESTABLISHED -j ACCEPT ip6tables -A FORWARD -s 2001:638:614:1750::/64 -m state --state NEW,ESTABLISHED -j ACCEPT \end{lstlisting} In das VPN eingehender Verkehr ist nur als Antwort auf ausgehende Pakete erlaubt. \begin{lstlisting} iptables -A FORWARD -d 10.2.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT ip6tables -A FORWARD -d 2001:638:614:1750::/64 -m state --state ESTABLISHED,RELATED -j ACCEPT \end{lstlisting} \paragraph{Persistente Firewallregeln} Um die mit \texttt{iptables} erstellten Regeln auch über Neustarts hinweg zu behalten, wird das Paket \texttt{iptables-persistent} installiert. \begin{lstlisting} apt-get install iptables-persistent \end{lstlisting} Anschließend können die aktuell aktiven Regeln abgespeichert werden, damit sie bei einem Neustart wieder geladen werden können. \begin{lstlisting} iptables-save > /etc/iptables/rules.v4 ip6tables-save > /etc/iptables/rules.v6 \end{lstlisting} \paragraph{Zertifikate} \todo{Hier gibt es noch zu tun.} Beschaffung eines Serverzertifikats und des CA-Wurzelzertifikats Erzeugung der DH-Parameter Regelmäßige Beschaffung der CRL \paragraph{OpenVPN} Nun wird OpenVPN installiert und konfiguriert. \begin{lstlisting} # apt-get install openvpn \end{lstlisting} \todo{Zertifikate beantragen und lokal ablegen} Die folgende Serverkonfiguration wird als Datei unter \texttt{/etc/openvpn/server/inform.conf} abgelegt. \lstinputlisting[]{./openvpn-config/vpnserver.conf} CRL beschaffen \begin{lstlisting} curl http://vmvpnca.inform.hs-hannover.de/crl.pem > /etc/openvpn/vpnserver/crl.pem \end{lstlisting} Cronjob via \texttt{crontab -e} erzeugen: \begin{lstlisting} 15 2 * * * bash -c 'curl http://vmvpnca.inform.hs-hannover.de/crl.pem > /etc/openvpn/vpnserver/crl.pem; systemctl restart openvpn@vpnserver.service' \end{lstlisting} Ein \texttt{systemctl reload} ist aufgrund der Abgabe von Berechtigungen nach dem Start nicht möglich. Deshalb muss auf \texttt{systemctl restart} zurückgegriffen werden. Nun wird der OpenVPN-Dienst aktiviert und gestartet. \begin{lstlisting} # systemctl enable openvpn@vpnserver.service # systemctl start openvpn@vpnserver.service \end{lstlisting} \chapter{Administrative Aufgaben} Die IP-Adressen des Diensts aktivieren oder deaktivieren Den Dienst starten/stoppen/neustarten