Wie wir es in den vorherigen Tutorials dieser LFCE (Linux Foundation Certified Engineer) Serie vorhergesehen haben, werden wir in diesem Artikel die Weiterleitung von IP-Verkehr statisch und dynamisch mit spezifischen Anwendungen diskutieren.

Einführung in das Linux Foundation Zertifizierungsprogramm
Zuerst einmal, klären wir einige Definitionen:
- In einfachen Worten ist ein Paket die grundlegende Einheit, die verwendet wird, um Informationen innerhalb eines Netzwerks zu übertragen. Netzwerke, die TCP/IP als Netzwerkprotokoll verwenden, folgen den gleichen Regeln für die Datenübertragung: Die tatsächlichen Informationen werden in Pakete aufgeteilt, die sowohl Daten als auch die Adresse enthalten, an die sie gesendet werden sollen.
- Routing ist der Prozess des „Führens“ der Daten von der Quelle zum Ziel innerhalb eines Netzwerks.
- Statisches Routing erfordert eine manuell konfigurierte Reihe von Regeln, die in einer Routing-Tabelle definiert sind. Diese Regeln sind festgelegt und werden verwendet, um den Weg festzulegen, den ein Paket durchlaufen muss, wenn es von einer Maschine zur anderen reist.
- Dynamisches Routing oder intelligentes Routing (wenn Sie möchten) bedeutet, dass das System automatisch, bei Bedarf, die Route ändern kann, der ein Paket folgt.
Erweiterte IP- und Netzwerkgerätekonfiguration
Das iproute-Paket bietet eine Reihe von Tools zur Verwaltung von Netzwerken und Verkehrssteuerung, die wir in diesem Artikel verwenden werden, da sie die Ablösung von Legacy-Tools wie ifconfig und route darstellen.
Die zentrale Utility in der iproute-Suite heißt einfach ip. Ihre grundlegende Syntax lautet wie folgt:
# ip object command
Wo Objekt nur eines der folgenden sein kann (nur die häufigsten Objekte werden gezeigt – für eine vollständige Liste siehe man ip):
- link: Netzwerkgerät.
- addr: Protokoll (IP oder IPv6) Adresse auf einem Gerät.
- route: Routing-Tabelle Eintrag.
- rule: Regel in Routing-Richtliniendatenbank.
Wobei Befehl eine spezifische Aktion darstellt, die auf das Objekt angewendet werden kann. Sie können den folgenden Befehl ausführen, um die vollständige Liste der Befehle anzuzeigen, die auf ein bestimmtes Objekt angewendet werden können:
# ip object help
Zum Beispiel,
# ip link help

Das obige Bild zeigt zum Beispiel, dass Sie den Status einer Netzwerkschnittstelle mit dem folgenden Befehl ändern können:
# ip link set interface {up | down}
Für weitere Beispiele von ‚ip‘-Befehlen lesen Sie 10 nützliche ‚ip‘-Befehle zum Konfigurieren der IP-Adresse
Beispiel 1: Deaktivieren und Aktivieren einer Netzwerkschnittstelle
In diesem Beispiel werden wir eth1 deaktivieren und aktivieren:
# ip link show # ip link set eth1 down # ip link show

Wenn Sie eth1 wieder aktivieren möchten,
# ip link set eth1 up
Anstatt alle Netzwerkschnittstellen anzuzeigen, können wir eine von ihnen angeben:
# ip link show eth1
Was alle Informationen für eth1 zurückgeben wird.
Beispiel 2: Anzeige der Haupt-Routing-Tabelle
Sie können Ihre aktuelle Haupt-Routing-Tabelle mit einem der folgenden 3 Befehle anzeigen:
# ip route show # route -n # netstat -rn

Die erste Spalte in der Ausgabe der drei Befehle gibt das Zielnetzwerk an. Die Ausgabe des Befehls ip route (nach dem Schlüsselwort dev) zeigt auch die Netzwerkgeräte an, die als physisches Gateway zu diesen Netzwerken dienen.
Obwohl heutzutage der Befehl ip gegenüber route bevorzugt wird, können Sie immer noch auf die Handbücher ip-route und route für eine detaillierte Erklärung der restlichen Spalten verweisen.
Beispiel 3: Verwenden eines Linux-Servers zum Routen von Paketen zwischen zwei privaten Netzwerken
Wir möchten icmp (Ping)-Pakete von dev2 nach dev4 und umgekehrt routen (beachten Sie, dass sich beide Client-Maschinen in unterschiedlichen Netzwerken befinden). Der Name jeder Netzwerkkarte sowie die entsprechende IPv4-Adresse sind in eckigen Klammern angegeben.
Unsere Testumgebung ist wie folgt:
Client 1: CentOS 7 [enp0s3: 192.168.0.17/24] - dev1 Router: Debian Wheezy 7.7 [eth0: 192.168.0.15/24, eth1: 10.0.0.15/24] - dev2 Client 2: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
Lassen Sie uns die Routing-Tabelle in dev1 (CentOS-Box) anzeigen:
# ip route show
und dann ändern, um die Netzwerkkarte enp0s3 und die Verbindung zu 192.168.0.15 zu verwenden, um auf Hosts im Netzwerk 10.0.0.0/24 zuzugreifen:
# ip route add 10.0.0.0/24 via 192.168.0.15 dev enp0s3
Was im Wesentlichen bedeutet: „Fügen Sie eine Route zum Netzwerk 10.0.0.0/24 über die Netzwerkschnittstelle enp0s3 unter Verwendung von 192.168.0.15 als Gateway hinzu“.

Ebenso in dev4 (openSUSE-Box), um Hosts im Netzwerk 192.168.0.0/24 anzupingen:
# ip route add 192.168.0.0/24 via 10.0.0.15 dev enp0s3

Zuletzt müssen wir das Forwarding in unserem Debian-Router aktivieren:
# echo 1 > /proc/sys/net/ipv4/ip_forward
Jetzt führen wir einen Ping aus:

und,

Um diese Einstellungen über Neustarts hinweg beizubehalten, bearbeiten Sie /etc/sysctl.conf auf dem Router und stellen sicher, dass die Variable net.ipv4.ip_forward wie folgt auf true gesetzt ist:
net.ipv4.ip_forward = 1
Darüber hinaus konfigurieren Sie die Netzwerkkarten auf beiden Clients (suchen Sie die Konfigurationsdatei unter /etc/sysconfig/network auf openSUSE und /etc/sysconfig/network-scripts auf CentOS – in beiden Fällen heißt sie ifcfg-enp0s3).
Hier ist die Konfigurationsdatei vom openSUSE-Rechner:
BOOTPROTO=static BROADCAST=10.0.0.255 IPADDR=10.0.0.18 NETMASK=255.255.255.0 GATEWAY=10.0.0.15 NAME=enp0s3 NETWORK=10.0.0.0 ONBOOT=yes
Beispiel 4: Verwendung eines Linux-Servers zum Routen von Paketen zwischen privaten Netzwerken und dem Internet
Ein weiteres Szenario, in dem eine Linux-Maschine als Router verwendet werden kann, ist, wenn Sie Ihre Internetverbindung mit einem privaten LAN teilen müssen.
Router: Debian Wheezy 7.7 [eth0: Public IP, eth1: 10.0.0.15/24] - dev2 Client: openSUSE 13.2 [enp0s3: 10.0.0.18/24] - dev4
Zusätzlich zur Einrichtung der Paketweiterleitung und der statischen Routing-Tabelle im Client wie im vorherigen Beispiel müssen wir ein paar iptables-Regeln im Router hinzufügen:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT # iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
Der erste Befehl fügt eine Regel in die POSTROUTING-Kette in der nat (Network Address Translation)-Tabelle ein, die angibt, dass die NIC eth0 für ausgehende Pakete verwendet werden soll.
MASQUERADE gibt an, dass diese NIC eine dynamische IP hat und dass vor dem Senden des Pakets in die „wilde weite Welt“ des Internets die private Quelladresse des Pakets in die öffentliche IP des Routers geändert werden muss.
In einem LAN mit vielen Hosts behält der Router in /proc/net/ip_conntrack den Überblick über aufgebaute Verbindungen, damit er weiß, wohin er die Antwort aus dem Internet zurücksenden soll.
Nur ein Teil der Ausgabe von:
# cat /proc/net/ip_conntrack
wird im folgenden Screenshot gezeigt.

Wo der Ursprung (private IP des openSUSE-Rechners) und das Ziel (Google DNS) der Pakete hervorgehoben sind. Dies war das Ergebnis von:
# curl www.tecmint.com
auf dem openSUSE-Rechner.
Wie Sie sicherlich schon vermuten können, verwendet der Router Googles 8.8.8.8 als Nameserver, was erklärt, warum das Ziel ausgehender Pakete auf diese Adresse zeigt.
Hinweis: Eingehende Pakete aus dem Internet werden nur akzeptiert, wenn sie Teil einer bereits hergestellten Verbindung sind (Befehl #2), während ausgehende Pakete „frei passieren“ dürfen (Befehl #3).
Vergessen Sie nicht, Ihre iptables-Regeln dauerhaft zu machen, indem Sie die in Teil 8 – Konfiguration der Iptables-Firewall dieser Serie dargelegten Schritte befolgen.
Dynamisches Routing mit Quagga
Heutzutage ist das am häufigsten verwendete Tool für dynamisches Routing in Linux quagga. Es ermöglicht Systemadministratoren, mit einem relativ kostengünstigen Linux-Server dieselbe Funktionalität zu implementieren, die von leistungsstarken (und teuren) Cisco-Routern bereitgestellt wird.
Das Tool selbst übernimmt nicht das Routing, sondern modifiziert die Kernel-Routingtabelle, während es neue beste Routen zum Umgang mit Paketen lernt.
Weil es sich um einen Fork von Zebra handelt, einem Programm, dessen Entwicklung vor einiger Zeit eingestellt wurde, behält es aus historischen Gründen dieselben Befehle und die Struktur wie Zebra. Daher werden Sie von diesem Punkt an viele Verweise auf Zebra sehen.
Bitte beachten Sie, dass es in einem einzigen Artikel nicht möglich ist, dynamisches Routing und alle damit verbundenen Protokolle abzudecken, aber ich bin zuversichtlich, dass der hier präsentierte Inhalt Ihnen als Ausgangspunkt dienen wird.
Installation von Quagga in Linux
Um Quagga auf Ihrer ausgewählten Distribution zu installieren:
# aptitude update && aptitude install quagga [On Ubuntu] # yum update && yum install quagga [CentOS/RHEL] # zypper refresh && zypper install quagga [openSUSE]
Wir verwenden die gleiche Umgebung wie bei Beispiel #3, mit dem einzigen Unterschied, dass eth0 mit einem Haupt-Gateway-Router mit der IP 192.168.0.1 verbunden ist.
Bearbeiten Sie als nächstes /etc/quagga/daemons mit,
zebra=1 ripd=1
Erstellen Sie nun die folgenden Konfigurationsdateien.
# /etc/quagga/zebra.conf # /etc/quagga/ripd.conf
und fügen Sie diese Zeilen hinzu (ersetzen Sie sie durch einen Hostnamen und ein Passwort Ihrer Wahl):
service quagga restart hostname dev2 password quagga
# service quagga restart

Hinweis: ripd.conf ist die Konfigurationsdatei für das Routing Information Protocol, das dem Router die Informationen darüber liefert, welche Netzwerke erreicht werden können und wie weit (in Bezug auf die Anzahl der Hops) sie entfernt sind.
Beachten Sie, dass dies nur eines der Protokolle ist, die zusammen mit Quagga verwendet werden können, und ich es für dieses Tutorial aufgrund der Benutzerfreundlichkeit und der Tatsache, dass die meisten Netzwerkgeräte es unterstützen, ausgewählt habe, obwohl es den Nachteil hat, Anmeldeinformationen im Klartext zu übertragen. Aus diesem Grund müssen Sie dem Konfigurationsfile die entsprechenden Berechtigungen zuweisen:
# chown quagga:quaggavty /etc/quagga/*.conf # chmod 640 /etc/quagga/*.conf
Beispiel 5: Einrichten von Quagga zur dynamischen Weiterleitung von IP-Verkehr
In diesem Beispiel verwenden wir das folgende Setup mit zwei Routern (stellen Sie sicher, dass Sie die Konfigurationsdateien für Router #2 wie zuvor erklärt erstellen):

Wichtig: Vergessen Sie nicht, das folgende Setup für beide Router zu wiederholen.
Verbinden Sie sich mit Zebra (das auf Port 2601 lauscht), das das logische Zwischenglied zwischen dem Router und dem Kernel ist:
# telnet localhost 2601
Geben Sie das Passwort ein, das in der Datei /etc/quagga/zebra.conf festgelegt wurde, und aktivieren Sie dann die Konfiguration:
enable configure terminal
Geben Sie die IP-Adresse und Netzwerkmaske jeder Netzwerkkarte ein:
inter eth0 ip addr 192.168.0.15 inter eth1 ip addr 10.0.0.15 exit exit write

Jetzt müssen wir uns mit dem RIP Daemon-Terminal (Port 2602) verbinden:
# telnet localhost 2602
Geben Sie Benutzername und Passwort ein, wie in der Datei /etc/quagga/ripd.conf konfiguriert, und geben Sie dann die folgenden Befehle in Fettschrift ein (Kommentare dienen der Klarstellung):
enable turns on privileged mode command. configure terminal changes to configuration mode. This command is the first step to configuration router rip enables RIP. network 10.0.0.0/24 sets the RIP enable interface for the 10.0.0.0/24 network. exit exit write writes current configuration to configuration file.

Hinweis: In beiden Fällen wird die Konfiguration an die Zeilen angehängt, die wir zuvor hinzugefügt haben (/etc/quagga/zebra.conf und /etc/quagga/ripd.conf).
Verbinden Sie sich abschließend erneut mit dem Zebra-Dienst auf beiden Routern und beachten Sie, wie jeder von ihnen die Route zum Netzwerk hinter dem anderen „gelernt“ hat und welches der nächste Sprung ist, um zu diesem Netzwerk zu gelangen, indem Sie den Befehl show ip route ausführen:
# show ip route

Wenn Sie verschiedene Protokolle oder Konfigurationen ausprobieren möchten, können Sie sich auf der Quagga-Projektseite für weitere Dokumentationen beziehen.
Abschluss
In diesem Artikel haben wir erklärt, wie man statisches und dynamisches Routing einrichtet, indem man einen Linux-Box-Router verwendet. Fügen Sie so viele Router hinzu, wie Sie möchten, und experimentieren Sie so viel Sie möchten. Zögern Sie nicht, uns über das untenstehende Kontaktformular zu kontaktieren, wenn Sie Kommentare oder Fragen haben.