iptables leitet den Verkehr an den VPN-Tunnel weiter, wenn dieser geöffnet ist

iptables leitet den Verkehr an den VPN-Tunnel weiter, wenn dieser geöffnet ist

Ich habe die folgende Anleitung verwendet, um meinen Raspberry Pi als Zugriffspunkt einzurichten:

Raspberry Pi 3 als WLAN-Zugangspunkt

Ich leite meinen gesamten Datenverkehr wlan0weiter eth0und verwende NAT. 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 Schnittstelle verwenden tun0-00und weiterleitenallemein Datenverkehr durch meinen VPN-Tunnel. Ich möchte ihn vollständig senden und nicht, dass etwas in das Host-Netzwerk gelangt. Ich denke, es läuft ungefähr so ​​ab:

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 besteht darin eth0, dass sie bestehen bleiben. Die ursprüngliche Regel zur Weiterleitung des Datenverkehrs ist eth0weiterhin vorhanden.

Ich möchte meinen gesamten Datenverkehr durch den Tunnel schicken, sofern dieser geöffnet ist. Wenn nicht, reicht mir die Verwendung von aus eth0.

Aktualisieren:

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 kein Erfolg, die Weiterleitung scheint nicht zu funktionieren.

Client-VPN-Konfiguration

Ich habe Dinge entfernt, die sensibel 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

Die Verbindung zum Pi funktioniert einwandfrei und zeigt eine andere öffentliche IP-Adresse an. Die Clients zeigen den Pi zwar immer noch als Gateway an, können aber keine Verbindung mehr herstellen.

Lösung

redirect-gateway def1Zuerst musste ich es in die .ovpn-Datei auf dem Pi einfügen .

Dann musste ich den Namen meiner Schnittstelle tatsächlich richtig eingeben ... Ugh. Ich komme mir wie ein Verrückter vor, aber anscheinend habe ich es 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!

Antwort1

Sie benötigen beide Regelsätze innerhalb von iptables. Die beiden Regelsätze stellen sicher, dass der Datenverkehr, der über die angegebenen Schnittstellen abgeht, 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

Das fehlende Puzzleteil ist das Routing. Wenn der Tunnel aktiv ist, soll ihn „der gesamte“ ausgehende Verkehr nutzen. Andernfalls verwenden Sie die normale Route.

Dies wird behandeltinnerhalb von OpenVPNverwenden Sie den redirect-gateway def1Parameter in Ihrer Clientkonfiguration.

Antwort2

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

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

Sie können die Regeln mit -Dder folgenden Option löschen:

iptables -t filter -D FORWARD 1

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

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

Dadurch wird eine neue Regel ganz am Anfang einer Tabelle eingefügt, sodass sie als Erstes konsultiert wird.

Bearbeiten:

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

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

da durch Verbindungsverfolgung alle bereits bekannten Verbindungen weitergeleitet werden könnten.

Und ja, Sie müssen einrichtenRichtlinienroutingum Ihren Datenverkehr nicht an das Standard-Gateway weiterzuleiten wlan, das höchstwahrscheinlich über Ihre ethernet Schnittstelle erreichbar ist, sondern über die vpnSchnittstelle.

verwandte Informationen