![Generieren Sie iptables-Regeln, während Sie eine Verbindung zum VPN-Server herstellen](https://rvso.com/image/1072880/Generieren%20Sie%20iptables-Regeln%2C%20w%C3%A4hrend%20Sie%20eine%20Verbindung%20zum%20VPN-Server%20herstellen.png)
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 up
und down
in Ihrer OpenVPN-Datei *.conf verwenden. Diese ermöglichen die Ausführung benutzerdefinierter Skripte.
script-security 2
ist 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 iptables
Befehle sind in diesen Skripten enthalten. Bitte prüfen Sie auf der Manpage, ob das script-security 2
fü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.