Wie kann ich Linux als Gateway verwenden?

16

ANMERKUNG: Wenn Clientgeräte ( computer Bin diesem Beispiel) über den Gateway-Computer Internet beziehen möchten, müssen sie möglicherweise noch die Nameserver-Auflösung konfigurieren. Dies wird hier nicht erläutert (ein Gateway muss nicht unbedingt das Internet bedienen).

Ich versuche, die Grundlagen des Netzwerkroutings zu verstehen.
Ich experimentiere also mit meinem LAN (ich brauche im Moment kein Internet, nur LAN-Kommunikation).

Ich weiß, dass die Netzwerkkonfiguration ziemlich komplex ist, aber ich versuche nur, einen Computer (z. B. A) als Gateway für einen anderen (z. B. B) zu verwenden (beide mit Ubuntu Linux).
Ich brauche nur B, um den Router zu erreichen, der nur für A erreichbar ist.

Das ist der Fall:

Router for computer A  -->  192.168.0.1
Computer A - eth0      -->  192.168.0.2
Computer A - eth1      -->  192.168.1.1

Computer B - eth0      -->  192.168.1.2

Computer A stellt eine Verbindung zum Router her .
Computer A und B verbinden fein (ping, SSH ... etc) zwischen ihnen .
Computer B kann den Router für Computer A nicht erreichen .

Ich dachte, dass nur das Hinzufügen von Computer A auf B als Standardgateway und das Aktivieren der IP-Weiterleitung auf A dazu führen würde, dass B in der Lage ist, den Router für A zu erreichen:

luis@ComputerB:~$ sudo route add default gw 192.168.1.1
luis@ComputerB:~$ sudo routel

target            gateway      source        proto    scope  dev   tbl
127.0.0.0         broadcast    127.0.0.1     kernel   link   lo    local
127.0.0.0 8       local        127.0.0.1     kernel   host   lo    local
127.0.0.1         local        127.0.0.1     kernel   host   lo    local
127.255.255.255   broadcast    127.0.0.1     kernel   link   lo    local
192.168.1.0       broadcast    192.168.1.2   kernel   link   eth0  local
192.168.1.2       local        192.168.1.2   kernel   host   eth0  local
192.168.1.255     broadcast    192.168.1.2   kernel   link   eth0  local
default           192.168.1.1                                eth0
169.254.0.0 16                                        link   eth0
192.168.1.0 24                 192.168.1.2   kernel   link   eth0

Und auf Computer A (dem Zwischengateway):

root@ComputerA:~$ echo 1 > /proc/sys/net/ipv4/ip_forward

Computer B kann immer noch Computer A anpingen, aber Router für A antwortet nicht:

luis@ComputerB:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
^C

(Keine Ping-Antwort)

Ist dies das richtige Verfahren , um einen Computer unter Linux auf einfache Weise als Gateway für einen anderen Computer zu verwenden?

Sopalajo de Arrierez
quelle

Antworten:

21

Sie sind fast da. Sie müssen nur sicherstellen, dass der Datenverkehr wieder zu B zurückkehrt. Im Moment haben Sie den Datenverkehr von B nach außen weitergeleitet, aber A weiß nicht, wie Sie den Datenverkehr zurück zu B bringen können die Verbindungen gehen durch. Dazu müssen Sie NAT aktivieren . Sie haben bereits Schritt eins, in dem Sie die Weiterleitung zulassen. Dann müssen Sie einige Firewall-Regeln hinzufügen iptables:

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Dies besagt: Nachdem wir in der Netzwerkadressen-Übersetzungstabelle das Routing eines Pakets am Ausgang eth0 (extern) herausgefunden haben, ersetzen Sie die Rücksendeadressen-Informationen durch unsere eigenen, damit die Rücksendepakete zu uns kommen. Denken Sie auch daran, dass wir dies getan haben (wie eine Nachschlagetabelle, die sich an diese Verbindung erinnert).

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Lassen Sie zu, dass Pakete, die von eth1 (der internen Schnittstelle) kommen sollen, eth0 (die externe Schnittstelle) verlassen.

iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Verwenden Sie diese Nachschlagetabelle, die wir zuvor hatten, um festzustellen, ob das auf der externen Schnittstelle ankommende Paket tatsächlich zu einer Verbindung gehört, die bereits von der internen initiiert wurde.

user1794469
quelle
Eine prägnante Erklärung. Müssen alle Codeblöcke auf Computer A ausgeführt werden?
Sopalajo de Arrierez
@SopalajodeArrierez Ja, diese werden alle auf dem "Gateway" -Computer ausgeführt. System B muss nichts anderes über das Routing wissen, als die Pakete an B zu senden (Standard-GW), wenn es einen anderen Computer erreichen möchte.
user1794469
Getestet mit Ubuntu v14 auf dem Desktop und Ubuntu v12 auf Utilite Pro (einem eingebetteten Evice von CompuLabs). Vielen Dank, dass Sie die Funktionen der einzelnen Zeilen genau erläutert haben. Ich habe viele lange, lange Erklärungen recherchiert und gefunden, die nicht funktionierten. Ich hoffe, dieser Frage-Antwort-Thread könnte in Zukunft für andere nützlich sein.
Sopalajo de Arrierez
@ user1794469 Ist es dasselbe, wenn die Gateway-Schnittstelle virtuell ist, dh eine Tap-Schnittstelle? Sie können auf einen Blick hier ?
RAM
1

Damit das Routing zwischen zwei Linux-Computern, die als Gateways fungieren, ordnungsgemäß funktioniert, müssen verschiedene Voraussetzungen erfüllt sein:

  • Beide Gateways müssen physisch miteinander verbunden sein (oder virtuell, wenn Sie virtuelle Maschinen verbinden).
  • Zu beiden Schnittstellen des Routers müssen Routen hinzugefügt werden.

    route add -net 192.168.0.0/24 gw 192.168.0.1
    route add -net 192.168.1.0/24 gw 192.168.1.1
    
  • Für das entfernte Netzwerk muss auf beiden Gateways ein lokales Gateway angegeben werden. Dadurch können Computer im lokalen Netzwerk wissen, wohin Pakete für das Remotenetzwerk gesendet werden sollen. Das Gateway sollte die IP-Adresse des Computers sein, der Pakete an das Remote-Netzwerk sendet.

  • Computer, die Datenverkehr zwischen den Netzwerken senden möchten, müssen auch darüber informiert werden, welches lokale Gateway den Datenverkehr zum und vom Remotenetzwerk verarbeitet. Dies erfolgt normalerweise über DHCP (Dynamic Host Control Protocol). Wenn Sie jedoch ein separates Gateway für das Internet verwenden möchten, müssen Sie beide auf den Computern angeben, die sowohl Zugriff auf das Internet als auch auf das andere Netzwerk benötigen (z. B. das Internet-Gateway über DHCP) DHCP und das Gateway des anderen Netzwerks über eine Route).
  • Die IP-Weiterleitung muss für beide Gateways aktiv sein.
  • IP-Masquerading muss aktiviert sein, damit NAT zwischen den Gateways funktioniert.

    modprobe iptable_nat
    echo 1 > /proc/sys/net/ipv4/ip_forward
    iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    iptables -A FORWARD -i eth1 -j ACCEPT
    

    Möglicherweise müssen Sie eine Quelle und ein Ziel angeben, da Sie für die Maskierung dieselbe Schnittstelle verwenden:

    iptables -t nat -A POSTROUTING -i eth0 -s 192.168.0.0/24 ! -d 192.168.1.0/24 -j MASQUERADE
    

    und das andere Gateway:

    iptables -t nat -A POSTROUTING -i eth1 -s 192.168.1.0/24 ! -d 192.168.0.0/24 -j MASQUERADE   
    

    Für jedes Gateway sollte der lokale Netzwerkverkehr auf der entsprechenden Schnittstelle wie folgt akzeptiert werden:

    iptables -A FORWARD -i eth0 -s 192.168.0.0/24 -j ACCEPT
    

    oder

    iptables -A FORWARD -i eth1 -s 192.168.1.0/24 -j ACCEPT
    

Es gibt zahlreiche Links und ähnliche Fragen, auf die verwiesen werden kann, um Ihre Probleme zu lösen.

In diesem speziellen Fall scheint es falsch zu sein, dass die Routen- und Gateway-Einrichtung auf beiden Computern nicht abgeschlossen ist und die Netzwerkadressübersetzung (Network Address Translation, NAT) nicht mit iptables aktiviert wurde, sodass die Gateways die Anforderung von einem Computer im anderen Subnetz übertragen können in ihrem Namen.

Dies ist auch beim Einrichten einer Internetverbindung von entscheidender Bedeutung, da Sie für ein Ende der Verbindung verantwortlich sind (z. B. die Verwendung eines Linux-Computers als Gateway für eine PPPoE-Verbindung).

John Pettit
quelle