Generieren Sie iptables-Regeln, während Sie eine Verbindung zum VPN-Server herstellen

Generieren Sie iptables-Regeln, während Sie eine Verbindung zum VPN-Server herstellen

Ich baue einen virtuellen Ubuntu-Server (LXC auf Proxmox), der als Router fungieren und einige Geräte (z. B. AppleTV) meines lokalen Netzwerks über ein VPN (expressVPN) tunneln soll. Die Verbindung und das Routing zu verschiedenen VPN-Zielen (verschiedene Länder) funktioniert.

Einige Dienste wissen jedoch immer noch, dass ich nicht aus dem Land anrufe, in dem sich der VPN-Server befindet. (Ich glaube, es heißtDNS-Leck???)

Das liegt daran, dass mein Client, sagen wir die AppleTV-Box, z. B. 1.1.1.1 als DNS verwendet. Er kennt den DNS-Server nicht, den der VPN-Server an mein Gateway veröffentlicht hat.

Um das zu verhindern, möchte ich den DNS-Dienst des VPN verwenden, den ich beim Verbinden erhalte. Ich habe das AppleTV auf mein Gateway als DNS ausgerichtet und einige iptables-Regeln geschrieben, um die Anfragen an die vom VPN-Server bereitgestellten DNS-Server zu DNATieren. (Hoffe, das ergibt Sinn)

# Route DNS Traffic
iptables -t nat -A PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53
iptables -t nat -A PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination 10.54.0.1:53

Das funktioniert gut.

Frage

Wie werden diese Regeln beim Aufbau der OpenVPN-Verbindung automatisch generiert? Die spezifische DNS-Adresse ändert sich bei der Verbindung zu einer anderen VPN-Station (z. B. einem anderen Land). Oder gibt es eine bessere Lösung?

Ich habe darüber nachgedacht, es in das einzufügen update-systemd-resolved, aber das scheint mir viel zu kompliziert. Ich nehme an, es gibt einen einfacheren Weg.

Ich bin für jeden Hinweis dankbar.

Antwort1

Willkommen, Sie können die Befehle upund downin Ihrer OpenVPN-Datei *.conf verwenden. Diese ermöglichen die Ausführung benutzerdefinierter Skripte. script-security 2ist erforderlich, wenn Sie diesen Weg gehen. Beispiel:

script-security 2
up /usr/local/bin/set-redirect-dns.sh
down /usr/local/bin/unset-redirect-dns.sh

Die eigentlichen iptablesBefehle sind in diesen Skripten enthalten. Bitte prüfen Sie auf der Manpage, ob das script-security 2für Sie in Ordnung ist.

Antwort2

Ich werde meine eigene Frage beantworten, um meine Lösung zu zeigen.

Ich habe erfahren, dass Resolve einen DNS via Stub (127.0.0.53) verwendet und daher weiß, wie der DNS des VPN zu verwenden ist.

Ich musste „nur“ die DNS-Anfragen der LAN-Clients weiterleiten/naten, die diesen Server als Gateway (und DNS) verwenden.

In der OpenVPN-Clientkonfiguration habe ich die folgenden Zeilen hinzugefügt:

mci@vpngateway:/etc/openvpn$ head destinations/belgium_udp.ovpn -n4
script-security 2
up /etc/openvpn/linkup.sh
down /etc/openvpn/linkdown.sh
down-pre

Meine Skripte sind hochgeladen ...

mci@vpngateway:/etc/openvpn$ cat linkup.sh 
#!/bin/bash

# First let systemd-resolved do its magic
/etc/openvpn/update-systemd-resolved $@

# Set iptable rules
/etc/openvpn/iptables_baserules.sh

# Set DNS
/etc/openvpn/iptables_setdns.sh

und runter

mci@vpngateway:/etc/openvpn$ cat linkdown.sh 
#!/bin/bash

# First delete DNS iptables rules
/etc/openvpn/iptables_removedns.sh

# After let systemd-resolved do its magic
/etc/openvpn/update-systemd-resolved $@

Grundregeln, um andere Dinge größtenteils fallen zu lassen

mci@vpngateway:/etc/openvpn$ cat iptables_baserules.sh 
#!/bin/bash

# Flush
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X

# Block All
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP

# allow Localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Make sure you can communicate with any DHCP server
iptables -A OUTPUT -d 255.255.255.255 -j ACCEPT
iptables -A INPUT -s 255.255.255.255 -j ACCEPT

# Make sure that you can communicate within your own network
iptables -A INPUT -s x.x.x.0/24 -d x.x.x.0/24 -j ACCEPT
iptables -A OUTPUT -s x.x.x.0/24 -d x.x.x.0/24 -j ACCEPT

# Allow established sessions to receive traffic:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow TUN
iptables -A INPUT -i tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -j ACCEPT
iptables -A FORWARD -o tun0 -j ACCEPT
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
iptables -A OUTPUT -o tun0 -j ACCEPT

# allow VPN connection
iptables -I OUTPUT 1 -p udp --destination-port 1195 -m comment --comment "Allow VPN connection" -j ACCEPT
iptables -I OUTPUT 1 -p tcp --destination-port 1195 -m comment --comment "Allow VPN connection" -j ACCEPT

# Block All
iptables -A OUTPUT -j DROP
iptables -A INPUT -j DROP
iptables -A FORWARD -j DROP

Beachten Sie diese Regeln. Ich musste sie hinzufügen, damit der Knoten selbst nach einem Namen suchen konnte, nachdem die VPN-Verbindung geschlossen wurde (vielleicht, weil ich die VPN-Konfiguration auf einen anderen Server umstellen möchte).

iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

Als letztes muss noch dynamisch die DNS-Nat hinzugefügt werden

mci@vpngateway:/etc/openvpn$ cat iptables_setdns.sh 
#!/bin/bash

# Route DNS Traffic
# Get DNS from VPN
dns=$(resolvectl dns -i tun0)
dns=${dns##* }
echo "Found DNS on tun0: ${dns}"
iptables -t nat -A PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53
iptables -t nat -A PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53

und entfernen Sie es anschließend

mci@vpngateway:/etc/openvpn$ cat iptables_removedns.sh 
#!/bin/bash

# Route DNS Traffic
# Get DNS from VPN
dns=$(resolvectl dns -i tun0)
dns=${dns##* }
echo "Found DNS on tun0: ${dns}"
iptables -t nat -D PREROUTING -p tcp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53
iptables -t nat -D PREROUTING -p udp --dst x.x.x.x --dport 53 -j DNAT --to-destination ${dns}:53

Vielleicht hilft dies jemand anderem, der ein VPN-Gateway baut.

verwandte Informationen