Dies scheint eine triviale Frage zu sein, aber ich konnte die Antwort noch nicht finden.
In meinem LAN (blau im Bild) habe ich unter anderem ein NAS und einen Raspberry Pi. Auf dem Raspberry Pi habe ich einen OpenVPN-Server installiert. Ich möchte, dass der OpenVPN-Client auf das NAS zugreifen kann, also FTP, HTTP usw. Der Client darf auf keine anderen Maschinen als das Raspberry und das NAS selbst zugreifen können.
In diesem Bild sehen Sie die Topologie meines Netzwerks:
Ich kann den OpenVPN-Client mit seinem Server verbinden. Ich weiß, dass ein Subnetzkonflikt vorliegt, kann die Subnetze aber nicht ändern.
Meine Serverkonfiguration:
port 1194
proto udp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/myserver.crt
key /etc/openvpn/easy-rsa/keys/myserver.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem
server 10.8.0.0 255.255.255.0
#push "route 192.168.1.0 255.255.255.0"
ifconfig-pool-persist /etc/openvpn/easy-rsa/ipp.txt
keepalive 10 120
cipher AES-128-CBC
persist-key
persist-tun
status /var/log/openvpn-status.log
#log /var/log/openvpn.log
log-append /var/log/openvpn.log
verb 3
Meine Client-Konfigurationsdatei:
client
remote x.y.z.t 1194
proto udp
dev tun
ca /etc/openvpnclient/ca.crt
cert /etc/openvpnclient/client.crt
key /etc/openvpnclient/client.key
cipher AES-128-CBC
#route-method exe
#route-delay 3
#route 10.8.0.0 255.255.255.0
###route-nopull
route 192.168.1.20 255.255.255.255
resolv-retry infinite
nobind
persist-key
persist-tun
mute 20
verb 3
Ich kann mich mit dem Windows-Client verbinden, aber ich kann das NAS nicht anpingen oder darauf zugreifen. Ich bin sicher, dass mir noch etwas fehlt, konnte aber nicht herausfinden, wie ich den Datenverkehr umleiten kann. Ich habe viele Beiträge zu diesem Thema gelesen, aber immer noch kein Glück gehabt.
Ich sollte in der Lage sein, bei Bedarf eine Routing-Regel im Router hinzuzufügen, der über das OpenVPN-Servernetzwerk läuft.
Update 18.11.2019 @17.31 MEZ
Ich habe zwei Hauptanforderungen:- Ich möchte, dass der Client das NAS erreicht, aber nicht die anderen Maschinen im LAN.
- Der Client muss eine Verbindung herstellen können, auch wenn sein Subnetz mit dem NAS-Subnetz in Konflikt steht (z. B. 192.168.1.0/24).
Tom Yan undDieser Artikelhat mir geholfen, eine Lösung für das erste Problem zu finden. Ich glaube, das zweite Problem ist noch nicht gelöst.
Lösung für Problem Nr. 1:
In der Serverkonfiguration musste ich diese Zeile hinzufügen (auskommentieren), um die Weiterleitung von Anfragen vom OpenVPN-Client an das NAS sicherzustellen:
push "route 192.168.1.0 255.255.255.0"
Um das Routing vom NAS zurück zum OpenVPN-Client zu ermöglichen, habe ich diese Routing-Regel hinzugefügtim NAS:
vi /etc/sysconfig/network-scripts/route-eth0
Hinzufügen dieser Zeile in dieser (leeren) Konfigurationsdatei
10.8.0.0/24 via 192.168.1.88
Und es service network restart
wurde sichergestellt, dass die statische Route angewendet wird.
Danach habe ich den Verkehr eingeschränktim Raspberry Piüber iptables. Ich habe es tatsächlich dauerhaft installiert iptables-persistent
und befolgtdieser Leitfaden.
iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 192.168.1.20 -j ACCEPT
Aktualisierung Nr. 2
Ja, ich brauche viele Clients, die eine Verbindung herstellen können, und ich denke, aus diesem Grund sollte ich NAT und Masquerading vermeiden.Antwort1
Sie müssen eine Route für 10.8.0.0/24
(wo sich das Gateway befinden würde 192.168.1.88
, also Rasp.Pi
der OVPN-Server) entweder zu NAS
oder hinzufügen ROUTER
(vorausgesetzt, in diesem Fall ROUTER
ist dies natürlich das Standard-Gateway von NAS
), damit NAS
/ ROUTER
weiß, wohin der Antwortverkehr geleitet werden soll.
Wenn dies nicht möglich ist, müssen Sie SNAT
/ MASQUERADE
mit iptables
(oder nftables
natürlich ) verwenden Rasp.Pi
, damit der gesamte Datenverkehr der VPN-Clients so aussieht, als stamme er vom Server.
Der Client darf auf keinen anderen Rechner als den Raspberry und das NAS selbst zugreifen können.
Stellen Sie sicher, dass Sie den Weiterleitungsverkehr mit begrenzen iptables
. Sobald Sie die IP-Weiterleitung aktiviert haben Rasp.Pi
(das müssen Sie tun, sonst können die VPN-Clients das LAN des Servers nicht erreichen), kann ein Client jede Route hinzufügen, die er/sie braucht, um einen bestimmten Host im LAN des Servers zu erreichen. Wenn Sie also einfach bestimmte Routen nicht pushen, wird Ihnen das nicht helfen.
Aktualisieren:
So aktivieren Sie die IP-Weiterleitung (und machen die Einstellung über den Systemstart hinaus dauerhaft):
sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
Um nur die Weiterleitungen zuzulassen, die Sie in diesem Fall benötigen ( eth0
und tun0
von denen angenommen wird):
iptables -F FORWARD
iptables -P FORWARD DROP
iptables -A FORWARD -m conntrack --ctstate NEW -i tun0 -s 10.8.0.0/24 -o eth0 -d 192.168.1.20 -j ACCEPT
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
NAS
So führen Sie Source-NAT für die Weiterleitung von Datenverkehr durch (damit Sie die Rückroute nicht auf / konfigurieren müssen ROUTER
), der über Folgendes hinausgeht eth0
:
iptables -t nat -F POSTROUTING
(überspringen Sie das Obige, wenn Sie noch weitere Regeln in der Kette haben, die Sie ebenfalls benötigen)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
oder, wenn die IP eth0
über einen längeren Zeitraum bzw. mehrere Bootvorgänge hinweg bestehen bleibt:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT 192.168.1.88
PS: Wenn Sie die Tabellen, die Sie berührt haben, leeren möchten, haben Sie folgende Möglichkeiten:
for i in $(cat /proc/net/ip_tables_names); do iptables-restore /usr/share/iptables/empty-"$i".rules; done
Beachten Sie auch, dass iptables
Befehle beim Booten nicht persistent gespeichert werden. Sie sollten die Regeln daher in einer Datei speichern iptables-save
(und Ihr System so konfigurieren, dass sie beim Booten irgendwie wiederhergestellt werden).
Aktualisierung 2:
Sie sollten sich unbedingt das oben Gesagte ansehen, um zu erfahren, wie Sie die FORWARD
Kette (in der filter
Tabelle) richtig konfigurieren. Ohne die DROP
Richtlinie (oder eine „Standard“ DROP
-Regel am Ende) ACCEPT
wäre jede Regel nutzlos. (Und Ihre Regel würde nicht ausreichen, wenn Sie das DROP
Teil erst einmal repariert haben.)
Um Subnetz- (genauer: Routen-)Konflikte zu vermeiden, empfiehlt es sich, eine Host-Route (das ist es, was Sie ohnehin brauchen) anstelle einer Subnetz-Route zu pushen. Das sollten Sie also tun push "route 192.168.1.20 255.255.255.255"
(die Subnetzmaske kann eigentlich weggelassen werden), da die Chance, dass ein Client-Host eine Host-Route zu einem LAN-Host (außer dem Standard-Gateway) hat, viel geringer ist (eine Subnetz-Route wird unter Linux immer hinzugefügt, wenn /32
einer Schnittstelle eine Nicht-Adresse zugewiesen wird).
Sie können beispielsweise auch push "route 10.8.1.1"
und DNAT
das Ziel auf 192.168.1.20
on setzen, Rasp.Pi
für den Sonderfall, dass auf einem Client bereits eine Route existiert (Sie sollten dann immer noch mit darauf 192.168.1.20
zugreifen können ):NAS
10.8.1.1
iptables -t nat -A PREROUTING -d 10.8.1.1 -j DNAT --to-destination 192.168.1.20