Ich versuche, den IPv6-Verkehr durch einen VPN-Tunnel zu leiten. Auf diese Weise sollte ich IPv6 in einem Netzwerk verwenden können, das IPv6 nicht unterstützt.
Ich habe einen VPS, dem ein IPv6-Block zugewiesen ist. Einen Teil dieses Blocks möchte ich für OpenVPN-Clients verwenden. Der Bereich, den ich im Sinn hatte, war 2001:db8::111:800:0/112
(Präfix ist anonymisiert), weil openvpn nur / 64 und / 112 als Subnetze unterstützt.
IPv6 durch den Tunnel funktioniert bereits, vom Client kann ich den Server anpingen ( 2001:db8::111:800:1
) und auch Schnittstellen auf dem Server ( 2001:db8::111:100:100
und 2001:db8:216:3dfa:f1d4:81c0
).
Wenn ich versuche, google.com vom Client aus zu pingen, erhalte ich keine Antwort (Ping-Timeout). Um dieses Problem zu beheben, habe ich tcpdump verwendet, um den Datenverkehr auf dem Server zu erfassen, und ich kann sehen, dass die Ping-Pakete ausgehen, aber keine Antworten zurückkommen. Das Hinzufügen von Protokollregeln zu ip6tables zeigt dasselbe: Pakete gehen aus, aber nichts kommt herein.
Ich habe ein Online-Traceroute-Tool verwendet, das eine Zeitüberschreitung von meinem Server abruft. Ich habe auch versucht, die IP-Adresse direkt auf der Benutzeroberfläche festzulegen, was dazu führt, dass die IP-Adresse ( 2001:db8::111:800:1001
) erreichbar ist. Ich denke also, dass dies ein Routing-Problem ist.
Ich habe die Weiterleitung für IPv6 durch aktiviert /proc/sys/net/ipv6/conf/all/forwarding
. ip6tables lässt Richtlinien für alle Ketten zu.
Meine Frage ist, was genau benötigt Linux, um dieses Paket für eine IP zu akzeptieren, die keiner Schnittstelle zugewiesen ist, und es weiterzuleiten? Nur eine existierende Route scheint nicht genug zu sein.
Hier ist das Setup für meinen Client und Server. Bitte lassen Sie es wissen, wenn weitere Informationen benötigt werden.
Klient
# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
inet6 2001:db8::111:800:1001/112 scope global
valid_lft forever preferred_lft forever
# ip -6 routes
2001:db8::111:800:0/112 dev tun0 proto kernel metric 256
2000::/3 dev tun0 metric 1024
Server
# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic
valid_lft 86254sec preferred_lft 14254sec
inet6 2001:db8::111:100:100/128 scope global
valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
inet6 2001:db8::111:800:1/112 scope global
valid_lft forever preferred_lft forever
# ip -6 route
2001:db8::111:100:100 dev eth0 proto kernel metric 256
2001:db8::111:800:0/112 dev tun0 proto kernel metric 256
2001:db8::/64 dev eth0 proto kernel metric 256 expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0 proto ra metric 1024 expires 1594sec
POSTROUTING ... MASQUERADE
in dernat
Tabelle. Aber ich bin mir nicht sicher, ob ich das vollständig verstehe. Versuchen Sie, den IPv6-Verkehr zu tunneln? Wenn ja, haben Sie die entsprechenden Einrichtungen eingerichtet? Sind-p ipv6
Pakete in den IPv4 (!) Regeln erlaubt?TRACE
(hier möglicherweise weniger)ip neighbour
, undip route get
. Geben Sie außerdem an, wer pingtgoogle.ca
.Antworten:
Sie müssen Ihren Router anweisen, Ihren Server für dieses VPN-Subnetz zu verwenden. Die richtige Lösung für Ihr Problem besteht darin, auf dem Router eine Route für das OpenVPN-Subnetz hinzuzufügen.
Wenn Sie dies nicht tun können, weil Sie den Router nicht berühren können, können Sie auch einen NDP-Proxy für die Clients auf der
eth0
Verbindung einrichten.Da Sie ein VPS verwenden, können Sie dem Router wahrscheinlich keine Routen hinzufügen: Sie müssen wahrscheinlich die zweite Lösung verwenden.
Fügen Sie eine Route für das Subnetz hinzu
Die richtige Lösung für Ihr Problem besteht darin, dem Router mitzuteilen, dass das VPN-Subnetz über den OpenVPN-Server geroutet werden muss (dies gilt für Linux):
Sie müssen die IPv6-Weiterleitung auf dem Server aktivieren:
NDP-Proxy
Es scheint, dass der Router so konfiguriert ist, dass er Ihren gesamten IPv6-Bereich über die
eth0
Verbindung sendet : Sie können einen NDP-Proxy einrichten.Sie sollten NDP-Anfragen auf der
eth0
Schnittstelle des Servers für Ihr OpenVPN-Subnetz sehen, wenn Sie versuchen, vom Client aus auf das restliche Internet zuzugreifen.Sie müssen die IPv6-Weiterleitung auch auf dem Server und dem NDP-Proxy aktivieren:
sysctl -w net.ipv6.conf.all.proxy_ndp = 1
Subnetz-NDP-Proxy
Der Linux-Kernel erlaubt es nicht, einen NDP-Proxy für ein Subnetz hinzuzufügen, sondern nur für einzelne IPs. Sie können einen Daemon verwenden (z. B. ndppd, um einen NDP-Proxy für ein ganzes Subnetz einzurichten (nie verwendet).
Per IP NDP-Proxy
Eine andere Lösung besteht darin, für jedes IPv6 des VPN-Subnetzes einen NDP-Proxy hinzuzufügen:
Dies sollte funktionieren, da Sie eine vergleichsweise kleine Anzahl von IPs im OpenVPN-Subnetz haben.
Dynamischer NDP-Proxy mit OpenVPN-Hooks
Sie sollten OpenVPN-Hooks verwenden können, um NDP-Proxy-Dynamik hinzuzufügen.
Fügen Sie einen Hook in die OpenVPN-Serverkonfiguration ein:
Mit folgendem
learn-address
Skript:Siehe diesen Thread .
Kurze Antwort
quelle