iptables leiten den Datenverkehr an den VPN-Tunnel weiter, wenn er geöffnet ist

9

Ich habe die folgende Anleitung verwendet, um meinen Himbeer-Pi als Zugangspunkt einzurichten:

Raspberry Pi 3 als WLAN-Zugangspunkt

Ich bin Weiterleitung wlan0an eth0und NATing all meinen Verkehr. Funktioniert super!

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT  
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT 

Jetzt möchte ich die gleichen Regeln einrichten, außer die Schnittstelle verwenden tun0-00und den gesamten Datenverkehr über meinen VPN-Tunnel weiterleiten. Ich möchte alles senden, möchte nicht, dass etwas in das Host-Netzwerk gelangt. Denke, es geht ungefähr so:

sudo iptables -t nat -A POSTROUTING -o tun0-00 -j MASQUERADE
sudo iptables -A FORWARD -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o tun0-00 -j ACCEPT

Leider weiß ich, dass diese iptables-Regeln nicht vollständig sind ... Das Problem ist, dass es eth0wach bleibt; Die ursprüngliche Regel zum Weiterleiten des Datenverkehrs eth0besteht weiterhin.

Ich möchte meinen gesamten Verkehr durch den Tunnel senden, wenn der Tunnel geöffnet ist. wenn nicht, bin ich gut damit eth0.

Aktualisieren:

Ich habe das Flag -I verwendet, um meine Regeln einzufügen:

sudo iptables -t nat -I POSTROUTING 1 -o tun0-00 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0-00 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0-00 -j ACCEPT

Die FORWARD-Kette:

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  wlan0  tun0-00  0.0.0.0/0            0.0.0.0/0           
2        0     0 ACCEPT     all  --  tun0-00 wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
3        0     0 ACCEPT     all  --  eth0   wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
4        0     0 ACCEPT     all  --  wlan0  eth0    0.0.0.0/0            0.0.0.0/0           
5        0     0 ACCEPT     all  --  wlan1  wlan0   0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
6        0     0 ACCEPT     all  --  wlan0  wlan1   0.0.0.0/0            0.0.0.0/0           

Immer noch keine Freude, die Weiterleitung scheint nicht zu funktionieren.

Client-VPN-Konfiguration

Ich habe Dinge herausgeschrubbt, die empfindlich aussahen:

dev tun
persist-tun
persist-key
cipher AES-256-CBC
auth SHA1
tls-client
client
resolv-retry infinite
remote XXX.XXX.XXX.XXX PORT_NUM udp
lport XXX
verify-x509-name "VPN_Certificate" name
pkcs12 CERT_NAME.p12
tls-auth CERTIFICATE-tls.key 1
ns-cert-type server
redirect-gateway local def1

Der Pi verbindet sich einwandfrei und spiegelt eine andere öffentliche IP wider. Die Clients zeigen den Pi weiterhin als Gateway an, können jedoch keine Verbindung mehr herstellen.

Lösung

Zuerst musste ich redirect-gateway def1in die .ovpn-Datei auf dem pi hinzufügen .

Dann musste ich meinen Schnittstellennamen richtig eingeben ... Ugh. Ich fühle mich wie ein Verrückter, aber anscheinend habe ich tun0-00am Anfang gesehen und das war das einzige Mal, dass es existierte. Die Schnittstelle ist eigentlich nur tun0.

Die entsprechenden iptables-Befehle waren also:

sudo iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
sudo iptables -I FORWARD 1 -i tun0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -I FORWARD 1 -i wlan0 -o tun0 -j ACCEPT

Funktioniert jetzt super!

Shrout1
quelle

Antworten:

15

Sie benötigen beide Regelsätze iptables. Die beiden Regelsätze stellen sicher, dass der Datenverkehr, der von den angegebenen Schnittstellen ausgeht, entsprechend maskiert wird. Hier ist mein Vorschlag, der etwas einfacher ist als Ihrer:

# Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

# Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Forward everything
iptables -A FORWARD -j ACCEPT

Der Teil des Puzzles, der fehlt, ist das Routing. Wenn der Tunnel aktiv ist, soll "der gesamte" ausgehende Verkehr ihn verwenden. Andernfalls verwenden Sie die normale Route.

Dies wird in OpenVPN mithilfe des redirect-gateway def1Parameters in Ihrer Client-Konfiguration behandelt.

Roaima
quelle
Ich werde sehen, ob das mein Problem ist! Vielen Dank!
Shrout1
Sieht gut aus, habe es auf Ubuntu 16.04 ohne Erfolg versucht. Es funktioniert, um eine IP-Adresse zu pingen, kann aber nicht dieselbe IP-Adresse klonen. Ist es möglich, dass Ubuntu 16.04 eine andere Implementierung von iptables für die Weiterleitung hat? Vielen Dank für jede Hilfe!
Cyberjoac
2

Das praktische Tool besteht darin, vorhandene Regeln mit Zeilennummern aufzulisten:

iptables --line-numbers -t filter -L FORWARD

Sie können die Regeln mit der -DOption löschen :

iptables -t filter -D FORWARD 1

Sie können eine neue Regel an der angegebenen Stelle mit der folgenden -IOption einfügen :

iptables -t filter -I FORWARD 0 blah-blah-blah

Dies würde eine neue Regel ganz am Anfang einer Tabelle einfügen, sodass sie in einer ersten Runde konsultiert wird.

Bearbeiten:

Im Allgemeinen benötigen Sie nur eine Regel in der FORWARDTabelle, die übereinstimmt -m state --state RELATED,ESTABLISHED:

-I FORWARD 1 -m state --state RELATED,ESTABLISHED -j ACCEPT

Als Verbindungsverfolgung könnten alle bereits bekannten Verbindungen weitergeleitet werden.

Und ja, Sie müssen das Richtlinienrouting einrichten , um Ihren wlanDatenverkehr nicht an das Standardgateway weiterzuleiten , das höchstwahrscheinlich über Ihre ethernet Schnittstelle, sondern über die Schnittstelle erreichbar ist vpn.

Serge
quelle
Überprüfen Sie mein Update, wissen Sie nicht, was ich vermisse ... Vielleicht ist es Routing? Ich bin mir nicht sicher, warum dies erforderlich sein würde, wenn es zuvor zwischen den Schnittstellen funktioniert hat.
Shrout1
siehe die Bearbeitung. wir müssen Routing richtig einzurichten , weil Routing - Entscheidungen nicht getroffen werdeniptables
Serge
Ok habe beides versucht redirect-gateway def1und redirect-gateway autolocalin meiner .ovpn Datei ... Keine Freude. Ich bin mir nicht sicher, was ich falsch mache! Auch hier verbindet sich der Pi selbst gut durch den Tunnel, aber nicht die Clients.
Shrout1
Hast du den Artikel gelesen, auf den ich hingewiesen habe?
Serge
Ich habe einen Blick darauf geworfen und bin vielleicht immer noch zu ungelernt, um zu verstehen, was ich tun muss. Ich fürchte, wenn ich eine statische Route zum Tunnel einstelle, wird mein Verkehr nicht passieren, wenn der Tunnel heruntergefahren ist.
Shrout1