262 lines
9.9 KiB
TeX
262 lines
9.9 KiB
TeX
\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.1}
|
|
\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}
|
|
\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-*
|
|
\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.1
|
|
iface eno1 inet6 static
|
|
address 2001:638:614:1780::131/64
|
|
gateway 201:638:614:1780::1
|
|
\end{lstlisting}
|
|
Die Konfiguration des Alias sieht so aus:
|
|
\begin{lstlisting}
|
|
#- virtual service alias
|
|
iface eno1:0 inet static
|
|
address 141.71.38.7/24
|
|
gateway 141.71.38.1
|
|
iface eno1:0 inet6 static
|
|
address 2001:638:614:1780::7/64
|
|
gateway 201:638:614:1780::1
|
|
\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 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
ip6tables -A INPUT -p udp --dport 1194 -m state --state NEW,ESTABLISHED -j ACCEPT
|
|
\end{lstlisting}
|
|
|
|
Antwortpakete für eingehende Pakete auf SSH und OpenVPN-Dienst sind erlaubt.
|
|
\begin{lstlisting}
|
|
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
|
|
ip6tables -A OUTPUT -m state --state ESTABLISHED -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 durchgeführt werden.
|
|
\begin{lstlisting}
|
|
iptables -t nat -A POSTROUTING -s 10.2.0.0/16 -j MASQUERADE
|
|
\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{Einstellungen für Routing}
|
|
\todo{Hier gibt es noch zu tun.}
|
|
Viel ist es nicht
|
|
|
|
\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}
|
|
\todo{Hier gibt es noch zu tun.}
|
|
Nun wird OpenVPN installiert und konfiguriert.
|
|
\begin{lstlisting}
|
|
# apt-get install openvpn
|
|
\end{lstlisting}
|
|
|
|
|
|
Zertifikate beantragen und
|
|
Konfiguration einspielen
|
|
|
|
CRL beschaffen
|
|
curl http://vmvpnca.inform.hs-hannover.de/crl.pem > /etc/openvpn/vpnserver/crl.pem
|
|
|
|
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 reload ist aufgrund der Abgabe von Berechtigungen nach dem Start nicht möglich.
|
|
|
|
Nun wird der OpenVPN-Dienst aktiviert und gestartet.
|
|
\begin{lstlisting}
|
|
# systemctl enable openvpn@vpnserver.service
|
|
# systemctl start openvpn@vpnserver.service
|
|
\end{lstlisting}
|