So verwandeln Sie einen Linux-Server in einen Router zur statischen und dynamischen Verkehrsverarbeitung – Teil 10

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.

Linux Foundation Certified Engineer – Part 10
Einführung in das Linux Foundation Zertifizierungsprogramm

Zuerst einmal, klären wir einige Definitionen:

  1. 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.
  2. Routing ist der Prozess des „Führens“ der Daten von der Quelle zum Ziel innerhalb eines Netzwerks.
  3. 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.
  4. 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):

  1. link: Netzwerkgerät.
  2. addr: Protokoll (IP oder IPv6) Adresse auf einem Gerät.
  3. route: Routing-Tabelle Eintrag.
  4. 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
IP Command 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
Disable eth0 Interface

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
Check Linux Route Table

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“.

Route Network in Linux

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
Network Routing in Linux

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:

Check Network Routing

und,

Route Ping Status

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.

Route Packages in Linux

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
Start Quagga Service

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):

Configure Quagga

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
Configure Router

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.
Enable Router

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
Check IP Routing

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.

Source:
https://www.tecmint.com/setup-linux-as-router/