OpenVPN mit IPv6 Verbindungsprobleme
Hallo liebe Netzwerk-Profis,
wieder mal so ein Problem mit OpenVPN und IPv6....
Ich habe folgendes Setup:
Pihole
Ziel:
Anpassungen an der bestehenden Konfiguration:
ULA: fd00:abba:abba:abba:
OVPN: fd00:affe:affe:affe:
Client-LAN Site-2-Site: fd00:ace:ace:ace
LLA des RaspberryPi: fe80::beef:beef:beef:beef
Unique Local Addresses (ULA) immer zuweisen
ULA-Präfix manuell festlegen: fd00:abba:abba:abba
DNSv6-Server auch über Router Advertisement bekanntgeben (RFC 5006): fe80:0:0:0:beef:beef:beef:beef
Portfreigabe UDP 1194 für IPv4 und IPv6
Statische Route OpenVPN Netzwerk fd00:affe:affe:affe:0:0:0:0 Präfix 64 Gateway fe80:0:0:0:beef:beef:beef:beef
Statische Route Site-2-Site Netzwerk fd00:ace:ace:ace:0:0:0:0 Präfix 64 Gateway fe80:0:0:0:beef:beef:beef:beef
Problem:
- Deaktiviert ich die Portfreigabe für IPv4 kann Client keine Verbindung mehr aufbauen. IPv6 wird also nicht hergestellt.
- Auch bei deaktivierter Firewall kann die Verbindung nicht aufgebaut werden.
- Auf https://www.wieistmeineip.de/ipv6-test/ steht, meine IPv6 ist bei bestehender VPN nicht vorhanden. Angezeigt wird mir nur die IPv4.
wieder mal so ein Problem mit OpenVPN und IPv6....
Ich habe folgendes Setup:
- Fritzbox Cable
- Dualstack
- RasPi mit
Pihole
- nftables
Ziel:
- Ich will meine bestehende OpenVPN IPv4 Konfiguration um IPv6 erweitern.
Anpassungen an der bestehenden Konfiguration:
ULA: fd00:abba:abba:abba:
OVPN: fd00:affe:affe:affe:
Client-LAN Site-2-Site: fd00:ace:ace:ace
LLA des RaspberryPi: fe80::beef:beef:beef:beef
- Server.conf
proto udp6
push tun-ipv6
ifconfig-ipv6 fd00:affe:affe:affe::1 fd00:affe:affe:affe::2
server-ipv6 fd00:affe:affe:affe::/64
push "route-ipv6 fd00:abba:abba:abba:: ::2/64"
route-ipv6 fd00:abba:abba:abba:: ::2/64
#Laut c't Artikel sollen diese beiden Zeilen aaskommentiert werden, aber der gesamte Traffic soll durch den Tunnel und Pihole die Werbung filtern. Daher habe ich es belassen:
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
- Client.ovpn
proto udp6
route-ipv6 fd00:abba:abba:abba:: ::2/64
- CCD normaler Client
ifconfig-push fd00:affe:affe:affe::30/64
- CCD Site-2-Site
ifconfig-push fd00:affe:affe:affe::20/64
iroute fd00:abba:abbs:abba::20/64
- sudo nano /etc/sysctl.conf
net.ipv6.conf.all.forwarding=1
- Fritz!box (Server-Seite)
Unique Local Addresses (ULA) immer zuweisen
ULA-Präfix manuell festlegen: fd00:abba:abba:abba
DNSv6-Server auch über Router Advertisement bekanntgeben (RFC 5006): fe80:0:0:0:beef:beef:beef:beef
Portfreigabe UDP 1194 für IPv4 und IPv6
Statische Route OpenVPN Netzwerk fd00:affe:affe:affe:0:0:0:0 Präfix 64 Gateway fe80:0:0:0:beef:beef:beef:beef
Statische Route Site-2-Site Netzwerk fd00:ace:ace:ace:0:0:0:0 Präfix 64 Gateway fe80:0:0:0:beef:beef:beef:beef
- DynDNS unterstützt IPv6
- Fritz!box (Site-2-Site)
Problem:
- Deaktiviert ich die Portfreigabe für IPv4 kann Client keine Verbindung mehr aufbauen. IPv6 wird also nicht hergestellt.
- Auch bei deaktivierter Firewall kann die Verbindung nicht aufgebaut werden.
- Auf https://www.wieistmeineip.de/ipv6-test/ steht, meine IPv6 ist bei bestehender VPN nicht vorhanden. Angezeigt wird mir nur die IPv4.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 11310790380
Url: https://administrator.de/contentid/11310790380
Ausgedruckt am: 19.12.2024 um 11:12 Uhr
27 Kommentare
Neuester Kommentar
Laut c't Artikel sollen diese beiden Zeilen auskommentiert werden
Dann musst du aber auch das Pushen der dedizierten Route auskommentieren.Beides, Split Tunneling und Gateway Redirect ist Unsinn und funktioniert nicht.
Guckst du auch hier.
Deaktiviert ich die Portfreigabe für IPv4 kann Client keine Verbindung mehr aufbauen.
Was ja auch irgendwie verständlich ist bei Port Forwarding.in der Regel arbeitet die Firewall kombiniert mit IPv4 und IPv6 so das vermutlich das Port Forwarding für beide Protokolle gilt. Das solltest du nochmal genau prüfen. Ansonsten wäre das PFW Verhalten fehlerhaft.
Wie sieht deine IPv6 Routing Tabelle auf dem Client aus wenn der VPN Tunnel aktiv ist??
Zitat von @aqui:
Nur wenn du den Zugriff von außen auf eine Global v6 Adresse erlaubst wäre die überhaupt routebar. Bei IPv6 gibt es bekanntlich kein NAT.
Doch klar gibt es auch bei IPv6 NAT, auch wenn es natürlich gegen denk Gedanken von IPv6 spricht. Wenn er also den Clients im Tunnel keine globale Adresse/Prefix zuweisen kann/will muss er am OUTPUT des VPN-Servers auf die Globale IPv6 Adresse des Servers NATen, dann klappt es auch mit dem IPv6 GW-Redirect in den Tunnel.Nur wenn du den Zugriff von außen auf eine Global v6 Adresse erlaubst wäre die überhaupt routebar. Bei IPv6 gibt es bekanntlich kein NAT.
Via iptables
ip6tables -t nat -A POSTROUTING -s fd00:affe:affe:affe::/64 -o eth0 -j MASQUERADE
table inet nat {
chain POSTROUTING {
meta nfproto ipv6 ip saddr fd00:affe:affe:affe::/64 oifname eth0 counter masquerade
}
}
Wenn man dagegen nur für IPv4 und nicht für IPv6 einen Gateway-Rediect machen will kann man das so in der Client-Config machen
redirect-gateway !ipv6 ipv4
Gruß sid
Denk hier ist nochmal etwas IPv6 Grundlagenarbeit fällig
https://danrl.com/ipv6/
Na ja, das etwas angestaubte und wenig skalierende OpenVPN zu verwenden ist auch nicht mehr zeitgemäß zumal der RasPi ja mit einer entsprechenden Konfig (Strongswan) problemlos und ohne große Frickelei mit (überflüssigen) externen VPN Client Apps die onboard VPNs aller Smartphones und bestehenden Betriebssysteme supportet inkl. IPv6.
Warum man dann noch mit OpenVPN rumfrickelt erschliesst sich einem nicht so wirklich?!
IKEv2 VPN Server für Windows und Apple Clients mit Raspberry Pi
Warum man dann noch mit OpenVPN rumfrickelt erschliesst sich einem nicht so wirklich?!
IKEv2 VPN Server für Windows und Apple Clients mit Raspberry Pi
Ist ja auch klar weil du alles außer icmpv6 echo requests dropst, da werden sämtliche RouterAdvertisements etc. weg gefiltert.
Fur IPv6 sind ICMPv6 Pakete essentiell da sämtliche abstimmende Kommunikation darüber abläuft.
Du brauchst also mindestens diese ICMP Typen in der Input Chain und zwar stateless oder im state "new"
Und in der Forward Chain für die Clients die ICMPv6 Basics für Problemmeldungen ohne state
Und wenn ein DHCPv6 Client zum Einsatz kommt im INPUT auch noch eine Freigabe von Port 546 UDP.
Fur IPv6 sind ICMPv6 Pakete essentiell da sämtliche abstimmende Kommunikation darüber abläuft.
Du brauchst also mindestens diese ICMP Typen in der Input Chain und zwar stateless oder im state "new"
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
ip6 nexthdr icmpv6 icmpv6 type { destination-unreachable, packet-too-big, time-exceeded, parameter-problem } accept
ip6 daddr fe80::/64 udp dport dhcpv6-client accept
Mit kommt nur ArchLinux auf diese Bananen, alles andere ist mir schon zu viel überflüssiges Gedöhns mit an Bord. Da reichen dann auch schon mal weit weniger als 100MB Arbeitsspeicher für so ne Kiste.
Nur mal so nebenbei als Tipp.
Nur mal so nebenbei als Tipp.
welcher Aufwand für mich dahinter steckt, alles wieder auf Wireguard oder ein IKEv2 umzumodeln.
Das wissen wir natürlich auch nicht, denn wir kennen dich und deine Fähigkeiten ja leider nicht.Für einen durchschnittlichen Netzwerker ist sowas in 30 Min bis maximal einer Stunde erledigt. Bei WG eher noch die Hälfte da dort lediglich nur 7 oder weniger Konfig Zeilen zu tippen sind und keine Zeretifikate erforderlich sind. Hat aber den nachteil das du wieder mit zusätzlicher Client Software frickeln muss was bei IKEv2 entfällt, da alle onboard.
Its your choice!
Du wirst davon sicherlich von mir hier lesen
Immer gerne! 😉Wenn ich sie aktiviere, verliert der Pi seine IPv6 Adresse.
Oha, zeigt das du ihm vermutlich IPv6 abgedreht hast...?!Etwas sinnvolle und kostenlose Lektüre zum IPv6 Protokoll kann da ganz sicher nicht schaden:
https://danrl.com/ipv6/
So sähe es z.B. in der input Chain aus:
# Interface name
define pub_iface = "eth0"
# OpenVPN port
define ovpn_port = 1194
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# accept any localhost traffic
iif lo accept
# accept any OpenVPN traffic
iifname "tun0" accept
# accept traffic originated from RasPi
ct state established,related accept
# accepted ICMP types
ip protocol icmp icmp type { time-exceeded, parameter-problem, destination-unreachable } accept
# accept common local TCP services
# tcp dport { ssh, http, https } ct state new accept
iif $pub_iface tcp dport { ssh } ct state new accept
# accepted UDP VPN ports on public interface
iif $pub_iface udp dport { isakmp, ipsec-nat-t, $ovpn_port } accept
iif $pub_iface ip protocol esp accept
# allow IPsec VPN networks
meta ipsec exists accept
# accept neighbour discovery otherwise IPv6 connectivity breaks.
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
# log and count dropped traffic
# log prefix "[nftables]Denied: " counter drop
# only count dropped traffic
counter drop
}
Kollege @7907292512 hat ja oben schon alles gepostet zu der Thematik...
Du hast auf dem Key noch ein Passwort und vermutlich in der Konfig vergessen das an die Textdatei zu binden in der dieser User/Pass konfiguriert ist. Das geht z.B. mit dem folgenden Eintrag in der Konfig Datei:
auth-user-pass /etc/openvpn/auth.txt
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-5 ...
auth-user-pass /etc/openvpn/auth.txt
https://openvpn.net/community-resources/reference-manual-for-openvpn-2-5 ...
IPv6 funktioniert mit leerem nft ruleset
Dann ist es ja eine Einstellung der Firewall! Wie sieht denn dein v6 Ruleset aus??Dort sollte für die Input Chain bei v6 sowas stehen:
# Interface name
define pub_iface = "eth0"
# OpenVPN port
define ovpn_port = 1194
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Accept any localhost traffic
iif lo accept
# Accept any OpenVPN traffic
iifname "tun0" accept
# Accept traffic originated from us
ct state established,related accept
# Accepted ICMP types
# ip protocol icmp icmp type {echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept
ip protocol icmp icmp type { time-exceeded, parameter-problem, destination-unreachable } accept
# Accept local TCP services on public interface
iif $pub_iface tcp dport { ssh } ct state new accept
# Accepted OpenVPN on public interface
iif $pub_iface udp dport { $ovpn_port } accept
# Accept neighbour discovery otherwise IPv6 connectivity breaks.
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
counter drop
}
Für feste Interfaces sollte man immer "iif" verwenden, weil das deutlich weniger Resourcen bindet! Nur für dynamische Interfaces wie die bei SSL VPN z.B. ist es besser "iifname" zu verwenden.
Hier ein vollständiger /etc/nftables.conf Ruleset mit dem es fehlerfrei rennt.
Hier ein vollständiger /etc/nftables.conf Ruleset mit dem es fehlerfrei rennt.
#!/usr/sbin/nft -f
flush ruleset
define pub_iface = "eth0"
define ovpn_port = 1194
table inet drop-bad-ct-states {
chain prerouting {
type filter hook prerouting priority -150; policy accept;
# drop packets in "invalid" connection-tracking state
ct state invalid drop
# drop tcp packets for new connections that aren't syn packets
tcp flags & (fin|syn|rst|ack) != syn ct state new counter drop
# drop XMAS packets.
tcp flags & (fin|syn|rst|psh|ack|urg) == fin|syn|rst|psh|ack|urg counter drop
# drop NULL packets.
tcp flags & (fin|syn|rst|psh|ack|urg) == 0x0 counter drop
# drop new connections over rate limit
ct state new limit rate over 1/second burst 10 packets drop
}
}
table inet filter {
chain input {
type filter hook input priority 0; policy drop;
# Accept any localhost traffic
iif lo accept
# Accept any OpenVPN traffic
iifname "tun0" accept
# Accept traffic self originated
ct state established,related accept
# Accepted ICMP types
# ip protocol icmp icmp type {echo-request, echo-reply, time-exceeded, parameter-problem, destination-unreachable } accept
ip protocol icmp icmp type {time-exceeded, parameter-problem, destination-unreachable } accept
# Accept local TCP services on public interface
# tcp dport { ssh, http, https } ct state new accept
iif $pub_iface tcp dport { ssh } ct state new accept
# Accepted UDP ports on public interface
iif $pub_iface udp dport { $ovpn_port } accept
# Accept neighbour discovery otherwise IPv6 connectivity breaks.
ip6 nexthdr icmpv6 icmpv6 type { nd-neighbor-solicit, nd-router-advert, nd-neighbor-advert } accept
counter drop
}
chain forward {
type filter hook forward priority 0;
}
chain output {
type filter hook output priority 0;
}
}
Ich bin hier einigermaßen überrascht, dass OpenVPN bei IPv6 untracked Pakete nutzt
Ganz einfach UDP ist ein stateless protocol deswegen auch kein connection state, ergo untracked 😁. Gibt bei UDP ja kein ACK der Gegenseite wie bei TCP ...https://www.thegeeksclan.com/stateful-and-stateless-protocols/#:~:text=U ....
Und...die Output Chain benutzt man auch so gut wie nie. Wozu auch, denn man will ja schon von vorn herein verhindern das Pakete überhaupt in den Rechner gelangen.
Man lässt ja auch keine Einbrecher ins Haus, die dann in Ruhe alles verwüsten und erst wenn sie aus dem Haus gehen steht da die Polizei und wartet... 😉
Man lässt ja auch keine Einbrecher ins Haus, die dann in Ruhe alles verwüsten und erst wenn sie aus dem Haus gehen steht da die Polizei und wartet... 😉