Kapitel 20
IN DIESEM KAPITEL
Wenn ein virtuelles internes Netzwerk Zugriff auf das reale Netzwerk und insbesondere auf das Internet benötigt, muss ein virtueller Router her, der vergleichbar dem Router Ihres Providers eine Brücke schlägt. Neben seiner Brückenfunktion soll er auch dafür sorgen, dass im internen Netzwerk die IP-Adressen automatisch verteilt werden und ein Namensdienst eingerichtet ist.
Ein Router steht zwischen dem lokalen Netzwerk und dem großen Internet. Entsprechend hat ein Router zwei Netzwerkadapter, die sehr unterschiedlich sind. Nach innen ist der Router im Allgemeinen der Boss, der angibt, wie alle zu heißen haben. Nach außen freut er sich, wenn er mitspielen darf.
Sie brauchen einen virtuellen Router, wenn Sie von einem internen Netzwerk aus ins Internet kommen wollen. Und dieses Kapitel stellt die Bauanleitung für einen solchen Router dar.
Da der Router immer in Verbindung mit anderen virtuellen Maschinen laufen soll, sollte er so wenig Ressourcen verbrauchen, wie es geht. Insbesondere der Hauptspeicher dürfte auf den meisten Gastgebersystemen knapp werden. Darum ist es eine gute Idee, dem Router den Desktop zu klauen. Wir verwenden dazu eine Debian-Installation. Alternativ könnten Sie auch ein Ubuntu-Server-System ohne grafische Oberfläche verwenden. Die Unterschiede dürften marginal sein.
Es gibt viele Möglichkeiten, an ein Debian-Installationsmedium zu kommen. Unter der folgenden URL finden Sie ein Installationsmedium:
https://www.debian.org/distrib/netinst
Dort klicken Sie unter der Überschrift »Kleine CDs oder USB-Sticks« auf den Link für den benötigten Prozessor. Das ist bei einem Intel-Prozessor die Bezeichnung AMD64. AMD hatte noch vor Intel eine 64-Bit breite Prozessorgeneration. Der Name blieb auch als Intel 64-Prozessoren auf den Markt brachte.
Sie starten VirtualBox und erstellen eine virtuelle Maschine für den Router:
Der Dialog verschwindet. Nun muss die Maschine mit dem Installationsmedium verbunden werden.
Wenn Sie nun STARTEN anklicken, wird die virtuelle Maschine booten. Da die virtuelle Festplatte zur Zeit noch leer ist, wird die virtuelle Maschine von ihrer virtuellen CD booten, der wir gerade das Installations-Image untergeschoben haben.
Es startet die Installation. Die nun folgende Liste der Schritte bis zur Erstellung der Installation ist lang. Es ist aber nicht so schlimm, weil Sie fast immer nur die Vorgabe bestätigen müssen. In einem Forum wurde geäußert, dass selbst ein Huhn Debian installieren könne, wenn man nur genügend Körner auf die -Taste legt. Das ist vielleicht dann doch etwas arg überzogen.
Es wird nach dem Root-Passwort gefragt. Ich habe hier der Einfachheit halber »root« verwendet. Sollte der Computer nur geringste Sicherheitsrelevanz haben, reicht das natürlich nicht.
Wenn Sie kein Kennwort eingeben, wird es kein explizites root-Konto geben, sondern Debian verhält sich wie Ubuntu und Sie erreichen die administrativen Befehle per sudo
über den ersten Benutzer.
Der eigentliche Benutzer muss ein Konto bekommen. Es gilt bei Unixoiden wie Linux die strenge Regel, dass ein Administrationskonto niemals als Anwendungskonto verwendet werden darf.
Hier habe ich als Benutzer linux mit dem Passwort linux eingesetzt. Auch dieses Passwort sollte man nur verwenden, wenn Sicherheitsaspekte überhaupt keine Rolle spielen.
Nach dem Neustart sehen Sie einen schwarzen Bildschirm mit der Möglichkeit sich als Benutzer linux
einloggen zu können.
Um an Admistratorrechte zu gelangen, geben Sie su -
ein, wenn Sie bei der Installation ein Root-Passwort vorgegeben haben.
Sollten Sie kein Passwort für den Administrator eingegeben haben, geben Sie als Befehl sudo -s
ein. Auch hier werden Sie nach einem Passwort gefragt. Hier ist es allerdings das des Benutzers, im Beispiel also linux.
# shutdown -h now
Alternativ können Sie auch aus dem Menü die Kombination MASCHINE | AUSSCHALTEN PER ACPI wählen.
Als erstes müssen Sie die Netzwerkanschlüsse des Routers definieren. Dazu klicken Sie die Router-VM in VirtualBox mit der rechten Maustaste an, wählen ÄNDERN. Es erscheint eine große Dialogbox. Sie wählen den Punkt NETZWERK in der linken Spalte an. Dort finden Sie mehrere Adapter. Zwei davon wollen Sie einstellen.
Der zweite Anschluss soll das lokale Netzwerk verwalten, das mit dem Internet verbunden werden soll. Diese Adresse ist in der virtuellen Maschine normalerweise noch nicht aktiviert. Das sollten Sie ändern!
intnet
belassen, sofern Sie nicht mehrere Netzwerke anlegen wollen.Das Ergebnis sieht dann so aus wie in Abbildung 20.2.
Für die nächsten Schritte müssen Sie die virtuelle Maschine starten. Loggen Sie sich ein und wechseln Sie mit su -
oder sudo -s
zum Administrator.
Für die folgenden Einstellungen benötigen Sie die Bezeichner für die beiden Netzwerkadapter. Das ermittelt der Befehl ip a
. Auf meiner virtuellen Maschine gab es folgende Adapter:
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state ...
inet 127.0.0.1/8 scope host lo
...
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
link/ether 08:00:27:60:e8:3c brd ff:ff:ff:ff:ff:ff
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic ...
...
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc ...
link/ether 08:00:27:bd:a6:cc brd ff:ff:ff:ff:ff:ff
...
Und damit sind die Namen der Netzwerkadapter auch schon ermittelt.
enp0s3
ist der über NAT beziehungsweise über die Netzwerkbrücke angeschlossene Adapter. Das ist leicht daran zu erkennen, dass er eine IP-Adresse zugewiesen bekommen hat.enp0s8
ist der verbliebene Adapter für das interne Netzwerk. Er hat noch keine IP-Adresse. Damit er aus dem lokalen Netzwerk erreichbar ist, muss diese Adresse statisch festgelegt werden.Das interne Netzwerk sollte ein privates Netzwerk sein, beispielsweise 192.168.1.0/24. Für den Router wird gern die Host-IP-Adresse 1 verwendet, also in diesem Fall 192.168.1.1. Diese muss dann statisch festgelegt werden. Hier gibt es derzeit zwei Methoden. Debian verwendet wie die meisten Linux-Derivate die Deklaration im Verzeichnis /etc/network, Ubuntu und dementsprechend Linux Mint verwenden /etc/netplan. Schauen wir uns beides an:
Wenn Sie der Anleitung gefolgt sind und Debian installiert haben, werden Sie die klassische Art der Zuweisung der Netzwerkadressen in der Datei /etc/network/interfaces konfigurieren.
auto lo
iface lo inet loopback
allow-hotplug enp0s3
iface enp0s3 inet dhcp
allow-hotplug enp0s8
iface enp0s8 inet static
address 192.168.1.1
netmask 255.255.255.0
Hiermit ist definiert, dass das Interface enp0s3
per DHCP automatisch konfiguriert wird. Das Interface enp0s8
wird dagegen fest auf die Adresse 192.168.1.1 mit der Subnetmask 255.255.255.0 festgelegt.
Das steht nun so erst einmal in einer Datei. Damit diese Einstellung gültig wird, starten Sie die Netzwerkkonfiguration durch den folgenden Befehl neu:
# systemctl restart networking
Ausführlichere Details finden Sie in Kapitel 8 oder unter der URL:
Sollten Sie eine Ubuntu-Variante verwenden, wird dort seit einigen Jahren Netplan eingesetzt. Im Verzeichnis /etc/netplan existiert eine Datei für die Konfiguration der Netzwerkadapter. Auf meinem System heißt sie 1-network-manager-all.yaml. Diese Datei müssen Sie bearbeiten. Die ersten drei Zeilen dürften bei Ihnen gleich aussehen. Die restlichen Zeilen sollten Sie anpassen. Prüfen Sie dabei, ob die Adapterbezeichnung enp0s8
bei Ihnen identisch ist, ansonsten passen Sie diese entsprechend an.
network:
version: 2
renderer: NetworkManager
ethernets:
enp0s8:
dhcp4: no
addresses:
- 192.168.1.1/24
Nach dieser Eingabe kann die Konfiguration sofort aktiv geschaltet werden.
# netplan apply
Ein erneuter Aufruf von ip a
sollte enp0s3 immer noch auf der bisherigen IP-Adresse stehen, aber für enp0s8 nun die Adresse 192.168.1.1 anzeigen.
Nähere Informationen finden Sie in Kapitel 8 oder unter der URL:
Die angeschlossenen Computer sollen sich idealerweise selbst konfigurieren. Um ins Internet zu gelangen, müssen sie eine IP-Adresse bekommen, eine Gateway-Adresse und einen DNS-Server. Das ist ein Betätigungsfeld für einen DHCP-Server, den Sie in Kapitel 8 näher kennenlernen können. Sie installieren ihn mit dem folgenden Befehl:
# apt install isc-dhcp-server
Nach der Installation müssen Sie die Konfigurationsdatei bearbeiten. Kopieren Sie das Original, und dann rufen Sie den Editor auf:
# vi /etc/dhcp/dhcpd.conf
Da Sie das Original ja kopiert haben, können Sie den kompletten Inhalt durch folgende Zeilen ersetzen:
option domain-name-servers 192.168.1.1;
default-lease-time 600;
max-lease-time 7200;
authoritative;
subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.100 192.168.1.200;
option routers 192.168.1.1;
}
Das reicht schon, um den meisten Ansprüchen an einen DHCP-Server zu genügen.
authoritative
legen Sie fest, dass dieser DHCP-Server der einzige im Netzwerk ist.Nachdem die Konfiguration in der Datei eingetragen ist, starten Sie den DHCP-Server. Normalerweise müssten Sie darauf achten, ob nicht versehentlich ein weiterer DHCP-Server in Form eines Routers im Netzwerk aktiv ist. Hier ist der Vorteil eines virtuellen Netzwerks. Hier kann niemand versehentlich ein Gerät anschließen.
# systemctl start isc-dhcp-server
Zum Testen könnten Sie einen virtuellen Client einsetzen, dessen Netzwerkadapter Sie in der VirtualBox auf INTERNES NETZWERK umstellen. Wenn Sie ihn starten, sollte er nach einem DHCP-Server Ausschau halten und eine IP-Adresse aus dem Raum 192.168.1.0 erhalten, eine Default-Route und die Adresse des DNS-Servers.
Dazu prüfen Sie zunächst, ob der Befehl ip a
eine Nummer aus dem angegeben Pool erhalten hat. Außerdem sollte ein ping
auf den Router funktionieren.
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...
...
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 ...
link/ether 08:00:27:4a:6c:b7 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope ...
...
$ ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.828 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.886 ms
^C
--- 192.168.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.828/0.857/0.886/0.029 ms
alice@client:˜$
Wenn es nicht auf Anhieb geklappt hat, können Sie durch Trennen und Neuverbinden des Netzwerkadapters eine DHCP-Client-Anfrage erzwingen. So müssen Sie den Client nach einer Konfigurationsänderung des DHCP-Servers nicht jedes Mal neu starten.
Der Router hat nun zwei Adressen auf seinen Netzwerkadaptern. Allerdings wird der Router nicht von allein auf den Gedanken kommen, Pakete von einem Adapter auf den anderen zu übertragen. Dazu muss eine Weiterleitung eingeschaltet werden.
Das Durchreichen der Netzwerkpakete an eine andere Netzwerkschnittstelle nennt man Forwarding und ist das, was einen Router ausmacht. Er reicht die Pakete weiter. Damit Linux dies tut, wird im Verzeichnis /proc/sys/net/ipv4 die Pseudodatei ip_forward mit einer »1« gefüllt. Das erreichen Sie mit dem folgenden Befehl:
# echo "1"> /proc/sys/net/ipv4/ip_forward
Tatsächlich handelt es sich bei dem Verzeichnis /proc nicht um ein wirkliches Dateiverzeichnis, sondern um einen Zugang zur Systemkonfiguration, der sich aber weitgehend wie ein normales Dateiverzeichnis verhält.
Dieser Effekt überlebt allerdings keinen Reboot. Um diese Einstellung dauerhaft zu machen, muss der entsprechende Eintrag in der Datei /etc/sysctl.conf entkommentiert werden.
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
Ob das Forwarding nach dem Booten noch da ist, können Sie durch folgenden Befehl feststellen. Er sollte eine 1 ausgeben. Wenn dort eine 0 erscheint, ist das Forwarding nicht aktiviert.
# cat /proc/sys/net/ipv4/ip_forward
Im nächsten Schritt wird der Paketfilter nftables
verwendet, um ein NAT (Network Address Translation) aufzubauen. Wie eine NAT funktioniert, wird in Kapitel 8 beschrieben.
Das Paket nftables
gehört bei einigen Distrubutionen bereits zur Standardausstattung. Ansonsten müssen Sie es installieren.
# apt install nftables
Sie können mit den Paketfilter durch direkte Befehle konfigurieren. Damit die Konfiguration auch nach einem Reboot erhalten bleibt, wird sie in der Datei /etc/nftables.conf gespeichert.
vi /etc/nftables.conf
Ein Paketfilter arbeitet mit Regeln, die beispielsweise als Firewall eingesetzt werden können. Dabei werden sogenannte Ketten (chain) gesetzt, die Pakete beim Eingang (input
), beim Ausgang (output
) und bei der Weiterleitung (forward
) beschreiben.
Für diese Ketten sind schon ein paar Rahmen vorhanden, um Regeln für den Paketfilter zu erstellen. Diese werden wir allerdings nicht benötigen, können also entfernt werden. Sie können sie auch stehenlassen und die neue Kette postrouting
daneben konfigurieren. Für unseren Router benötigen wir nur Masquerading. Dieses stellt die Basis für ein NAT dar.
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
chain postrouting {
type nat hook postrouting priority 0;
policy accept;
oifname “enp0s3” ip saddr 192.168.1.0/24 masquerade
}
}
Die Regel besagt, dass die lokalen Adressen über den externen Netzwerkadapter gemappt werden.
Zu guter Letzt müssen die nftables auch aktiviert werden, damit sie nach dem Start aus den Hufen kommen.
# systemctl start nftables
# systemctl enable nftables
Spätestens nach einem Reboot des Routers sollte ein ping auf die Adresse 8.8.8.8 von jedem Client im internen Netzwerk möglich sein.
Die Verbindung zum Internet steht, allerdings kann der Client des lokalen Netzwerks noch keine Namen auflösen. Es fehlt also der Zugang zum DNS (siehe Kapitel 8).
Der Router kann die Namen auflösen, weil er über seinen im Internet stehenden Adapter von seinem Router mit dem Zugang zum DNS-Server versorgt wird.
Um die DNS Anfragen weiterzuleiten, müssen Sie auf dem Router einen DNS-Server einrichten. Das Thema wird im Kapitel 8 noch etwas ausführlicher behandelt. Um einen DNS-Server einzurichten, müssen Sie das Paket bind9, das den DNS-Server enthält, installieren.
# apt-get install bind9
Bei der Installation ist das Konfigurationsverzeichnis /etc/bind angelegt worden, in dem Sie bereits alle möglichen Dateien angelegt worden.
Diese Konfiguration genügt schon, um die DNS-Anfragen durchzureichen. Damit ist Ihr Router bereits voll funktionstüchtig. Natürlich können Sie auf dieser Basis für das lokale Netzwerk Namen an Router vergeben, wie es bereits in Kapitel 8 beschrieben wird.