Weiterleiten des öffentlichen IPv6-Verkehrs durch den OpenVPN-Tunnel

13

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:100und 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
Ikke
quelle
Möglicherweise suchen Sie POSTROUTING ... MASQUERADEin der natTabelle. 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 ipv6Pakete in den IPv4 (!) Regeln erlaubt?
0xC0000022L
Haben Sie die IP-Konfiguration des Routers (auf eth0)? Steuern Sie den Router? (
Können
Versuchen Sie es mit dem Ziel iptables raw table TRACE(hier möglicherweise weniger) ip neighbour, und ip route get. Geben Sie außerdem an, wer pingt google.ca.
Pilona
Ping google.com oder goole.com.?
Totti
@totti google.com, war ein Tippfehler
Ikke

Antworten:

12

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 eth0Verbindung 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):

ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100

Sie müssen die IPv6-Weiterleitung auf dem Server aktivieren:

sysctl sys.net.ipv6.conf.all.forwarding=1

NDP-Proxy

Es scheint, dass der Router so konfiguriert ist, dass er Ihren gesamten IPv6-Bereich über die eth0Verbindung sendet : Sie können einen NDP-Proxy einrichten.

Sie sollten NDP-Anfragen auf der eth0Schnittstelle 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:

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

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:

learn-address /etc/openvpn/learn-address

Mit folgendem learn-addressSkript:

#!/bin/sh

action="$1"
addr="$2"

case "$action" in
    add | update)
        ip neigh replace proxy "$addr" dev tun0
        ;;
    delete)
        ip neigh del proxy "$addr" dev tun0
        ;;
esac

Siehe diesen Thread .

Kurze Antwort

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done
ysdx
quelle
1
Danke, ich werde mich darum kümmern. Ich verstehe jetzt das Problem.ipsidixit.net/2010/03/24/239 enthält weitere Details dazu.
Ikke
Ich habe die IP vom Client als Nachbar-Proxy. Ich habe sys.net.ipv6.conf.all.proxy_ndp aktiviert, kann aber immer noch kein Ping an google.com senden. Wenn ich den Server überprüfe, werden auf eth0 ndp solications-Pakete eingehen, aber es werden keine Werbeanzeigen ausgegeben.
Ikke
1
Nach der Installation und Einrichtung von npd6 funktioniert es plötzlich!
Ikke