2018-09-12 22:19:28 +02:00
\chapter { Vorwort}
2018-09-14 14:21:27 +02:00
Diese Dokumentation beschreibt die Installation und den Betrieb des IPv6-VPN-Dienst auf Basis von OpenVPN.
2018-09-18 11:38:12 +02:00
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}
2018-09-20 10:39:32 +02:00
\item \texttt { 141.71.38.254}
2018-09-18 11:38:12 +02:00
\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}
2018-09-20 15:02:17 +02:00
\item IP-Adressbereiche für VPN-Clients
2018-09-18 11:38:12 +02:00
\begin { itemize}
\item \texttt { 10.2.0.0/16}
\item \texttt { 2001:638:614:1750::/64}
\end { itemize}
2018-09-20 15:02:17 +02:00
\item Zu verwendender DNS-Server: \texttt { 141.71.38.1}
2018-09-18 11:38:12 +02:00
\end { itemize}
2018-09-20 15:13:59 +02:00
\chapter { Installation}
Mit den abgesprochenen Parametern kann nun die Installation des VPN-Servers erfolgen.
Eine bereits vorhandene Zertifizierungsstelle mit Webserver unter dem Hostnamen \texttt { vmvpnca.inform.hs-hannover.de} wird vorausgesetzt.
\section { Konfiguration des Grundsystems}
2018-09-18 15:11:23 +02:00
\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}
2018-09-12 22:44:16 +02:00
2018-09-18 15:11:23 +02:00
\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} .
2018-09-18 15:51:30 +02:00
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.
2018-09-18 15:11:23 +02:00
\begin { lstlisting}
# apt-get install sudo
# adduser jpt
# gpasswd -a jpt sudo
\end { lstlisting}
2018-09-18 15:51:30 +02:00
Nach erfolgreicher Übergabe des Servers an das IT-Team kann dieser Benutzer wieder entfernt werden.
2018-09-12 22:44:16 +02:00
2018-09-18 15:51:30 +02:00
\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:
2018-09-13 17:27:28 +02:00
\begin { lstlisting}
2018-09-18 15:51:30 +02:00
# 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
2018-09-20 11:05:52 +02:00
# apt-get install f4-i-srv-config-all-* f4-i-srv-config-dmz-adminscripts
2018-09-18 15:51:30 +02:00
\end { lstlisting}
2018-09-13 17:27:28 +02:00
2018-09-18 15:51:30 +02:00
\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.
2018-09-13 17:27:28 +02:00
2018-09-20 15:02:17 +02:00
Die IP-Adressen für den VPN-Dienst werden als zusätzliche IP-Adressen konfiguriert.
Durch die Verwendung von separaten Dienst-Adressen ist es möglich, einen Server im laufenden Betrieb durch einen zweiten, identisch konfigurierten Server zu ersetzen.
Dazu müssen lediglich die zusätzlichen IP-Adressen von dem einen Server entfernt werden, und anschließend auf dem zweiten Server hinzugefügt werden.
VPN-Benutzer bekommen davon nur eine kurze Unterbrechung der VPN-Sitzung mit.
2018-09-13 17:27:28 +02:00
2018-09-18 15:51:30 +02:00
Die resultierende Konfiguration für die IP-Adressen der Maschine sieht so aus:
\begin { lstlisting}
2018-09-13 17:27:28 +02:00
auto eno1
allow-hotplug eno1
#-primary network interface
iface eno1 inet static
2018-09-20 10:39:32 +02:00
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
2018-09-13 17:27:28 +02:00
iface eno1 inet6 static
2018-09-20 10:39:32 +02:00
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
2018-09-13 17:27:28 +02:00
\end { lstlisting}
2018-09-19 18:11:07 +02:00
\paragraph { DNS}
2018-09-20 15:02:17 +02:00
In der DMZ soll der DNS-Resolver mit der IP-Adresse \texttt { 141.71.38.1} verwendet werden.
2018-09-19 18:11:07 +02:00
\begin { lstlisting}
echo "nameserver 141.71.38.1" > /etc/resolv.conf
\end { lstlisting}
2018-09-20 15:02:17 +02:00
\paragraph { Paketweiterleitung einschalten}
Mit dem VPN-Server verbundene Clients befinden sich in einem eigenen IPv4- beziehungsweise IPv6-Netz.
Damit die VPN-Clients trotzdem über die Grenze ihres eigenen Netzes hinaus Kontakt zum Netz der Abteilung Informatik aufnehmen können, ist es notwendig für IPv4 und IPv6 die Paketweiterleitung einzuschalten.
2018-09-13 17:15:32 +02:00
\begin { lstlisting}
2018-09-20 15:02:17 +02:00
# echo "net.ipv4.conf.all.forwarding = 1" > /etc/sysctl.d/04-enable-ipv4-forwarding.conf
# echo "net.ipv6.conf.all.forwarding = 1" > /etc/sysctl.d/06-enable-ipv6-forwarding.conf
2018-09-13 17:15:32 +02:00
\end { lstlisting}
2018-09-18 16:03:11 +02:00
Anschließend werden die vorgenommenen Einstellungen aktiviert.
\begin { lstlisting}
2018-09-18 17:41:43 +02:00
# sysctl --system
2018-09-18 16:03:11 +02:00
\end { lstlisting}
2018-09-12 22:44:16 +02:00
2018-09-20 15:13:59 +02:00
\section { Firewallregeln}
2018-09-20 15:02:17 +02:00
Welcher Datenverkehr für VPN-Clients erlaubt oder verboten ist, wurde im Rahmen der Masterarbeit bereits festgelegt.
Diese Vorgaben werden jetzt über Filterregeln mit \texttt { iptables} und \texttt { ip6tables} umgesetzt.
2018-09-19 11:57:22 +02:00
2018-09-19 11:48:51 +02:00
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
2018-09-19 11:57:22 +02:00
iptables -A OUTPUT -o lo -j ACCEPT
2018-09-19 11:48:51 +02:00
ip6tables -A INPUT -i lo -j ACCEPT
2018-09-19 11:57:22 +02:00
ip6tables -A OUTPUT -o lo -j ACCEPT
2018-09-19 11:48:51 +02:00
\end { lstlisting}
2018-09-19 11:57:22 +02:00
Die Protokolle ICMP und ICMPv6 sind immer erlaubt.
2018-09-19 11:48:51 +02:00
\begin { lstlisting}
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT
2018-09-20 13:41:26 +02:00
ip6tables -A INPUT -p icmpv6 -j ACCEPT
ip6tables -A OUTPUT -p icmpv6 -j ACCEPT
ip6tables -A FORWARD -p icmpv6 -j ACCEPT
2018-09-19 11:48:51 +02:00
\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
2018-09-20 10:39:32 +02:00
iptables -A INPUT -p udp --dport 1194 -j ACCEPT
ip6tables -A INPUT -p udp --dport 1194 -j ACCEPT
2018-09-19 11:48:51 +02:00
\end { lstlisting}
Antwortpakete für eingehende Pakete auf SSH und OpenVPN-Dienst sind erlaubt.
\begin { lstlisting}
2018-09-20 11:39:41 +02:00
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
2018-09-20 10:39:32 +02:00
iptables -A OUTPUT -p udp --sport 1194 -j ACCEPT
ip6tables -A OUTPUT -p udp --sport 1194 -j ACCEPT
2018-09-19 11:48:51 +02:00
\end { lstlisting}
Vom VPN-Server ausgehende Pakete sind grundsätzlich erlaubt.
\begin { lstlisting}
2018-09-19 12:23:33 +02:00
iptables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
ip6tables -A OUTPUT -m state --state NEW,ESTABLISHED -j ACCEPT
2018-09-19 11:48:51 +02:00
\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}
2018-09-20 11:36:25 +02:00
Für IPv4-Verkehr aus dem VPN soll NAT auf die \texttt { 141.71.38.7} durchgeführt werden.
2018-09-19 11:48:51 +02:00
\begin { lstlisting}
2018-09-20 11:11:11 +02:00
iptables -t nat -A POSTROUTING -s 10.2.0.0/16 -j SNAT --to 141.71.38.7
2018-09-19 11:48:51 +02:00
\end { lstlisting}
2018-09-20 11:42:50 +02:00
Datenverkehr zwischen VPN-Clients ist verboten und wird verworfen.
\begin { lstlisting}
iptables -A FORWARD -s 10.2.0.0/16 -d 10.2.0.0/16 -j DROP
ip6tables -A FORWARD -s 2001:638:614:1750::/64 -d 2001:683:614:1750::/64 -j DROP
\end { lstlisting}
2018-09-20 12:12:16 +02:00
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}
2018-09-19 11:48:51 +02:00
Jeglicher weiterer Datenverkehr aus dem VPN ist erlaubt.
\begin { lstlisting}
2018-09-19 12:23:33 +02:00
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
2018-09-19 11:48:51 +02:00
\end { lstlisting}
In das VPN eingehender Verkehr ist nur als Antwort auf ausgehende Pakete erlaubt.
\begin { lstlisting}
2018-09-19 12:23:33 +02:00
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
2018-09-19 11:48:51 +02:00
\end { lstlisting}
2018-09-19 11:57:22 +02:00
\paragraph { Persistente Firewallregeln}
2018-09-20 15:02:17 +02:00
Um die mit \texttt { iptables} und \texttt { ip6tables} umgesetzten Regeln auch über Neustarts hinweg zu behalten, wird das Paket \texttt { iptables-persistent} installiert.
2018-09-19 11:06:30 +02:00
\begin { lstlisting}
apt-get install iptables-persistent
\end { lstlisting}
2018-09-20 15:02:17 +02:00
Anschließend können die aktuell aktiven Regeln in Dateien abgelegt werden, aus denen sie nach einem Neustart durch die von \texttt { iptables-persistent} installierten Skripte wieder geladen werden.
2018-09-19 11:06:30 +02:00
\begin { lstlisting}
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
\end { lstlisting}
2018-09-20 15:13:59 +02:00
\section { OpenVPN}
2018-09-18 15:51:30 +02:00
Nun wird OpenVPN installiert und konfiguriert.
2018-09-13 17:38:37 +02:00
\begin { lstlisting}
2018-09-18 15:51:30 +02:00
# apt-get install openvpn
2018-09-13 17:38:37 +02:00
\end { lstlisting}
2018-09-12 22:44:16 +02:00
2018-09-20 15:02:17 +02:00
Anhand des separaten Dokuments \enquote { Dokumentation der Zertifizierungsstelle für den IPv6-VPN-Dienst} wird ein neues Serverzertifikat für den VPN-Server beantragt und anschließend durch die Zertifizierungsstelle ausgestellt.
Zusätzlich werden auf dem lokalen Server die Diffie-Hellman-Parameter generiert.
2018-09-18 15:51:30 +02:00
2018-09-20 15:02:17 +02:00
Außerdem wird das Wurzelzertifikat der Zertifizierungsstelle, sowie eine aktuelle \textit { Certificate Revocation List} (CRL) benötigt.
In diesem Szenario wird davon ausgegangen, dass beide Dateien in aktueller Version über einen HTTP-Server von der CA angeboten werden:
2018-09-20 11:36:25 +02:00
\begin { lstlisting}
2018-09-20 15:02:17 +02:00
wget http://vmvpnca.inform.hs-hannover.de/ca.crt
wget http://vmvpnca.inform.hs-hannover.de/crl.pem
2018-09-20 11:36:25 +02:00
\end { lstlisting}
2018-09-19 13:12:41 +02:00
2018-09-20 15:02:17 +02:00
Die beschafften Dateien werden nun wie folgt auf dem VPN-Server abgelegt:
\begin { itemize}
\item Wurzelzertifikat: \texttt { /etc/openvpn/inform/ca.crt}
\item Serverzertifikat: \texttt { /etc/openvpn/inform/aither.inform.hs-hannover.de.crt}
\item Privatern Schlüssel: \texttt { /etc/openvpn/inform/aither.inform.hs-hannover.de.key}
\item Diffie-Hellman-Parameter: \texttt { /etc/openvpn/inform/dh.pem}
\item Certificate Revocation List: \texttt { /etc/openvpn/inform/crl.pem}
\end { itemize}
Dann wird die folgende Serverkonfiguration wird als Datei unter \texttt { /etc/openvpn/inform.conf} abgelegt.
2018-09-20 15:07:52 +02:00
\lstinputlisting [] { ./openvpn-config/server.conf}
2018-09-20 15:02:17 +02:00
Da die CRL durch die Zertifizierungsstelle jederzeit aktualisiert werden kann, ist es sinnvoll diese täglich mit einem Cronjob zu erneuern.
Dafür wird dieser Eintrag als \texttt { root} mittels \texttt { crontab -e} angelegt:
2018-09-19 13:12:41 +02:00
\begin { lstlisting}
2018-09-20 15:07:52 +02:00
15 2 * * * bash -c 'curl http://vmvpnca.inform.hs-hannover.de/crl.pem > /etc/openvpn/inform/crl.pem; systemctl restart openvpn@inform.service'
2018-09-19 13:12:41 +02:00
\end { lstlisting}
2018-09-20 15:02:17 +02:00
\textbf { Anmerkung} : Ein \texttt { systemctl reload} ist aufgrund der Abgabe von Berechtigungen nach dem Start nicht möglich.
2018-09-20 11:36:25 +02:00
Deshalb muss auf \texttt { systemctl restart} zurückgegriffen werden.
2018-09-19 13:12:41 +02:00
2018-09-20 15:02:17 +02:00
Nun wird der OpenVPN-Dienst aktiviert und gestartet:
2018-09-18 15:51:30 +02:00
\begin { lstlisting}
2018-09-20 15:06:15 +02:00
# systemctl enable openvpn@inform.service
# systemctl start openvpn@inform.service
2018-09-18 15:51:30 +02:00
\end { lstlisting}
2018-09-20 11:36:25 +02:00
\chapter { Administrative Aufgaben}
Die IP-Adressen des Diensts aktivieren oder deaktivieren
Den Dienst starten/stoppen/neustarten