Wie kann ich OpenVPN mit IPv4 und IPv6 mithilfe eines Tap-Geräts einrichten?

8

Ich habe es geschafft, OpenVPN für die vollständige IPv4-Konnektivität mit tap0 einzurichten. Jetzt möchte ich dasselbe für IPv6 tun.

Adressen und Netzwerkeinrichtung (beachten Sie, dass mein echtes Präfix durch 2001 ersetzt wird: db8):

2001:db8::100:0:0/96    my assigned IPv6 range
2001:db8::100:abc:0/112 OpenVPN IPv6 range
2001:db8::100:abc:1     tap0 (on server) (set as gateway on client)
2001:db8::100:abc:2     tap0 (on client)
2001:db8::1:2:3:4       gateway for server

 Home laptop   (tap0: 2001:db8::100:abc:2/112 gateway 2001:db8::100:abc:1/112)
  |      | |      (running Kubuntu 10.10; OpenVPN 2.1.0-3ubuntu1)
  | wifi | |
   router  |
      |   OpenVPN
  INTERNET |
eth0  |   /tap0
     VPS        (eth0:2001:db8::1:2:3:4/64    gateway 2001:db8::1)
               (tap0: 2001:db8::100:abc:1/112)
                  (running Debian 6; OpenVPN 2.1.3-2)

Der Server verfügt sowohl über native IPv4- als auch über IPv6-Konnektivität. Der Client verfügt nur über IPv4.

Ich kann über OpenVPN von und zu meinem Server pingen, aber nicht auf andere Computer (zum Beispiel ipv6.google.com).

net.ipv6.conf.all.forwardingist auf eingestellt 1, ich habe auch versucht net.ipv6.conf.all.accept_ra, ohne Glück zu deaktivieren .

Wenn tcpdumpich sowohl auf dem Server als auch auf dem Client verwende, kann ich sehen, dass Pakete tatsächlich über tap0 nach eth0 übertragen werden. Der Router (2001: db8 :: 1) sendet eine Nachbaranfrage für den Client (2001: db8 :: 100: abc: 2) an eth0, nachdem er die ICMP6-Echoanforderung empfangen hat. Der Server reagiert nicht auf diese Aufforderung, wodurch die ICMP6-Echoanforderung nicht an das Ziel weitergeleitet wird.

Wie kann ich diese IPv6-Verbindung herstellen?

Lekensteyn
quelle
Hast du net.ipv6.conf.eth0.forwarding = 1auf dem Server eingestellt?
Steven Montag,
Ja, ich habe vergessen, das zu erwähnen; Ich kann sehen, dass das Paket ausgeht, aber dann macht der Router eine Nachbaranfrage an eth0, aber tap0 wird darüber nicht benachrichtigt.
Lekensteyn

Antworten:

5

Die Antwort von Timothy Baldwins brachte mich auf den richtigen Weg, obwohl die Antwort ziemlich kryptisch war. IPv6-Nachbarwerbung / -werbung ist wie ARP für IPv6. Es wird verwendet, um andere Computer im Netzwerk zu "sehen". Der Router sendet eine Nachbarwerbung, auf die der Computer (Server oder Client) mit einer Nachbarwerbung antworten soll.

Auch bei net.ipv6.conf.all.forwardinggesetztem 1Wert werden Nachbarwerbung und Werbung nicht weitergeleitet. Um Nachbarwerbung und -werbung von eth0 weiterzuleiten, sollte eth0 als Proxy für die IPv6-Adresse des Clients hinter tap0 festgelegt und das Proxy für Nachbarmaterial für eth0 aktiviert sein:

echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp
/sbin/ip -6 neigh add proxy 2001:db8::100:abc:2 dev eth0

Leider ist es nicht möglich, die Liste der hinzugefügten Proxys abzurufen, und es werden auch keine ip -6Fehlermeldungen angezeigt, wenn der Befehl wiederholt ausgeführt wird. Ich bin mir auch nicht sicher, ob "neigh del proxy" funktioniert, es gibt keine Fehlermeldung und die C-Quelle ist für mich nicht wirklich aussagekräftig.


Da ich nicht alles manuell erledigen möchte, habe ich ein Skript erstellt, das die Arbeit für mich erledigt.

Serverkonfiguration

IPv6-Adressen basieren auf dem IPv4-Teil (die 1 in 10.8.0. 1 ). Das Präfix und die Netzmaske werden in gespeichert /etc/openvpn/variables.

Die nächsten Schritte werden zum Einrichten von OpenVPN mit verschlüsselter IPv4 / IPv6-Konnektivität zum Internet über eine native IPv4-Verbindung ausgeführt. RSA-Schlüssel und tls-auth werden zur Authentifizierung und MITM-Verhinderung verwendet.

/etc/openvpn/variables enthält Variablen, die für das up-Skript (beim Start nach der Erstellung des tap0-Geräts ausgeführt) und das Client-Verbindungsskript (nach der Authentifizierung des Clients ausgeführt) verwendet werden.

# this prefix is handled out by the provider, replace it with your own prefix
prefix=2001:db8::abc
# netmask, 2001:db9::abc:0000 - 2001:db9::abc:FFFF
prefixlen=112

/etc/openvpn/server-clientconnect.shwird als root ausgeführt und stellt sicher, dass IPv6 ordnungsgemäß weitergeleitet wird, indem die IPv6-Adresse zum eth0-Proxy hinzugefügt wird. Da client-connectOpenVPN aufgerufen wird, nachdem es zu dem durch die UserEinstellung angegebenen Benutzer gewechselt wurde , sudoist es erforderlich, dem Skript ausreichende Berechtigungen zum Ausführen als Root zu erteilen. Natürlich sollten Variablen vor der Verwendung überprüft werden, die Nummer sollte zwischen und einschließlich 2 und 254 liegen. (1 ist das Gateway, 255 die Broadcast-Adresse).

#!/bin/sh
. /etc/openvpn/variables
if [ -z "$ifconfig_pool_remote_ip" ]; then
        echo "Missing environment variable."
        exit 1
fi
ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
        echo "Invalid IP part."
        exit 1
fi
hexipp=$(printf '%x' $ipp)
/sbin/ip -6 neigh add proxy $pfx:$hexipp dev eth0

Damit dies funktioniert, vpnsollte es dem Benutzer gestattet sein, das Skript unter Beibehaltung $ifconfig_pool_remote_ipder IPv4-Adresse des Remotenetzwerks auszuführen . Fügen Sie der sudoers-Datei die nächsten Zeilen hinzu, indem Sie Folgendes ausführen sudo visudound anhängen:

Defaults:vpn env_keep=ifconfig_pool_remote_ip
vpn ALL=NOPASSWD: /etc/openvpn/server-clientconnect.sh

/etc/openvpn/server-up.shAktiviert IPv4, IPv6-Weiterleitung (eth0 + tap0 hat nicht funktioniert, es musste wirklich sein all) und Nachbar-Proxy auf eth0. Die Gateway-Adresse wird auch den Servern tap0hinzugefügt.

#!/bin/sh
. /etc/openvpn/variables
/sbin/ip -6 addr add $pfx:1/$pfxlen dev $dev
echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
echo 1 > /proc/sys/net/ipv6/conf/eth0/proxy_ndp

Schließlich die OpenVPN-Konfigurationsdatei unter /etc/openvpn/internet.conf:

proto udp
dev tap
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
server 10.8.0.0 255.255.255.0
script-security 2
up /etc/openvpn/server-up.sh
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
# encrypt all traffic
push "redirect-gateway def1"
# keep the same IP addresses each time
ifconfig-pool-persist ipp.txt
keepalive 10 120
tls-auth ta.key 0
cipher BF-CBC
comp-lzo
# OpenVPN will switch to this user, it is also used for sudo
user vpn
group vpn
persist-key
persist-tun

Der Vollständigkeit halber die Berechtigungen und das Eigentum an Dateien in /etc/openvpn:

drwx------  root root  .
-rw-------  root root  ca.crt
-rw-------  root root  dh1024.pem
drwx------  root root  easy-rsa      <-- left from creation of keys
-rw-------  root root  ipp.txt
-rwx------  root root  server-clientconnect.sh
-rw-------  root root  internet.conf
-rw-------  root root  variables
-rwx------  root root  server-up.sh
-rw-------  root root  server.crt
-rw-------  root root  server.key
-rw-------  root root  ta.key
-rwx------  root root  update-resolv-conf <-- this was installed by default

Firewall-Einstellungen:

itpables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -i tap0 -o eth0 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
ip6tables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
ip6tables -A FORWARD -s 2001::db8::abc:0/112 -i tap0 -o eth0 -j ACCEPT

Konfiguration auf dem Client

/etc/openvpn/client.conf::

client
dev tap
proto udp
remote 178.21.112.251 1194
script-security 2
up /etc/openvpn/client-up.sh
resolv-retry infinite
nobind
user nobody
group nogroup
persist-key
persist-tun
ca ca.crt
cert home.crt
key home.key
ns-cert-type server
tls-auth ta.key 1
cipher BF-CBC
comp-lzo

ta.keyund ca.keysind die gleichen Dateien vom Server. home.keyund home.crtsind Dateien, die auf dem Server erstellt wurden.

client-up.sh fügt die IPv6-Adresse und -Route hinzu (basierend auf der IPv4-Adresse):

#!/bin/sh
pfx='2001:db8::abc'
pfxlen=112
hexippart=`printf '%x' "$(echo $ifconfig_local | cut -d. -f4)"`
/sbin/ip -6 addr add $pfx:$hexippart/$pfxlen dev $dev
/sbin/ip -6 route add default via $pfx:1 dev $dev

Die Anleitung unter http://www.ipsidixit.net/2010/03/24/239/ war sehr hilfreich und die OpenVPN-Handbuchseite ist nützlich, um Informationen zu verschiedenen Einstellungen zu erhalten.

Lekensteyn
quelle
Vermutlich ist eth0 die Schnittstelle mit IPv6-Konnektivität, die Sie über OpenVPN verfügbar machen möchten? Können Sie dies bitte bestätigen?
Ivan Vučica
@ IvanVučica Das ist richtig, eth0ist die Schnittstelle, die standardmäßig den gesamten Datenverkehr (einschließlich IPv6) weiterleitet .
Lekensteyn
0

Der Upstream-Router ist für 2001: db8 :: 100: abc: 2 so konfiguriert, dass er sich auf dem direkt angeschlossenen Link befindet. Setzen Sie net.ipv6.conf.eth0.proxy_ndp = 1, um dies vorzutäuschen.

Timothy Baldwin
quelle