[Frage] Fritzbox DynDNS und IPv6 Portfreigabe: wie?

meyergru

Neuer User
Mitglied seit
11 Sep 2005
Beiträge
163
Punkte für Reaktionen
3
Punkte
18
Mit den aktuellen Fritz!OS-Versionen kann man ja IPv6-Portfreigaben einrichten. Das funktioniert z.B. auch auf der Adresse, die per /56-Präfix dem Gerät im LAN zugewiesen wird.

Will man dieses aber von außen erreichbar machen, müsste man einen IPv6-DynDNS einrichten - ich habe dafür einen eigenen Dienst.

Dazu wird mit "....&myip=<ip6addr>" die aktuell IPv6-Adresse übergeben. Leider ist das aber nicht die korrekte Adresse, die sich aus /56-Präfix plus dem Host-Anteil des Geräts im LAN ergibt (d.h. EUI-64 aus der MAC), sondern die externe IPv6 der Fritzbox selbst. Der entsprechende Port der Portfreigabe des Endgeräts ist aber unter dieser IP nicht erreichbar.

Ich habe gelesen, dass das mit MyFritz gehen soll. Ist das die einzige Möglichkeit oder gibt es anstelle von <ip6addr> eine andere Variable, die man dann verwenden kann? Im Zweifel so etwas wie <ip6prefix>, so dass man per Konfiguration beim DynDNS-Anbieter den EUI-64-Anteil auf eine Subdomain zuweisen kann.

Dann könnte man host1, host2 usw. mit der EUI64 konfigurieren, und speedy.dyndns.net per DynDNS-Update auf den präfix stellen. Dann ergäbe sich die volle IPv6 für host1.speedy.dyndns.net, host2.speedy.dyndns.net usw. aus dem /56-Präfix + EUI64 für host1 bzw. host2.

P.S.: Die Endgeräte selbst einen DynDNS-Update machen zu lassen, ist auch keine Lösung, denn sie würden im Normalfall mittels IPv6 Privacy Extensions nicht unter Ihrer EUI-64, sondern unter einem temporären Suffix raustelefonieren.
 
Zuletzt bearbeitet:
Auf nem Gerät als Server sollte keine PE aktiv sein wie z.B. nen NAS.

Habe auch eigene Script was IP von FB und dem NAS jeweils unter entsprechenden Hostnamen sendet.

Solange kein Mailserver aktiv ist kannst auch einfach z.B bei eigener Domain bzw. Subdomain nen CNAME auf jeweiligen MyFritz Hostnamen senden.

Ganze ist nicht neu, gibt bereits Themen zu.
 
Zuletzt bearbeitet von einem Moderator:
Auf nem Gerät als Server sollte keine PE aktiv sein wie z.B. nen NAS.

Wieso? Die "offizielle" IPv6 (EUI-64) ist auch bei aktivierter PE aktiv, d.h. die Freigaben sind eigentlich von der Frage unabhängig, ob man z.B. beim Surfen über einen Squid-Proxy nichts preisgeben möchte. Allerdings könnte man die EUI-64 so herausbekommen, wenn man schon ein eigenes Script verwendet - was ich eigentlich vermeiden will:

Code:
[I]ip -6 addr list scope global mngtmpaddr $device | grep -v " fd" | sed -n 's/.*inet6 \([0-9a-f:]\+\).*/\1/p'
[/I]

Aber klar, MyFritz und CNAME ginge. Offenbar wird per MyFritz dann doch der vergebene Präfix zurückgemeldet? Bei anderen DynDNS geht das aber nicht? Das mit dem Präfix als Variable wäre dann ein Verbesserungsvorschlag an AVM.
 
Weil sie den Präfix (als erstes) kennt? Und die Freigaben zulässt? Warum soll sie dann nicht konsequenterweise auch diese Möglichkeit per DNS bekanntgeben? Oft genug sind die freigegebenen Geräte doch "dumm", z.B. im Fall von Webcams - dort besteht gar nicht die Möglichkeit, lokal ein Update-Script laufen zu lassen.

Im Fall von IPv4 fallen FB-eigene und IP-Adressen der freigegebenen Geräte zwar zusammen, bei IPv6 jedoch nicht. Wäre man konsequent, müsste sogar eine DynDNS-Freigabe pro freigegebenem Gerät möglich sein, dann entfiele die zusätzliche externe Konfiguration beim DynDNS-Anbieter.
 
Zuletzt bearbeitet:
Der Router lernt Präfix vom Anbieter, Geräte erzeugen sich selbst ne IP und melden dies der FB. Die FB sendet dann die bekannten IPs für Geräte als einzelne Hostnamen an MyFritz.

Andere DDNS Anbieter wird es problematischer, da FB bisher keine URL Platzhalten hat für andere Geräte.

Grade IP Cam würde ich eher sogar Internet sperren und nur Zugriff aus Heimnetz bzw. VPN.
 
Es gibt - zumindest in der Theorie - eine Variable in der DynDNS-Konfiguration, die wohl den Präfix enthalten soll ... ob das inzwischen funktioniert oder nicht, habe ich aber nicht erneut getestet.

Der Name der "Variablen" wäre "<ip6lanprefix>" ... ob das nun der vom Provider an die Box delegierte sein soll oder der erste von der Box an einen anfordernden "Client" weitergereichte, weiß ich ebenfalls nicht.

Bei einem eigenen DNS-Server und der Möglichkeit, mit den übergebenen Daten noch "zu rechnen" beim Update, müßte es aber mit beiden Varianten (wenn die Variable überhaupt gesetzt ist, das war bei einigen Versionen auch nicht der Fall, 06.83 habe ich - s.o. - nicht getestet) funktionieren, daß man ein Update so ausführt, daß die (bereits bekannte) EUI-64 des kaskadierten Routers zum Präfix hinzugefügt wird.

Ansonsten müßte AVM das gesamte DynDNS-Aktualisieren anders angehen und das für IPv6-Freigaben nicht an die Box, sondern an den freigegebenen Client binden ... genauso macht das auch die MyFRITZ!-Aktualisierung. Das kriegt man aber ohne Eingriff in das FRITZ!OS nicht selbst so hin ... dann bleibt nur ein CNAME mit dem Verweis auf die MyFRITZ!-Adresse eines Clients als Notlösung übrig.

Es gibt ein paar Berichte, daß der PCP-Server Probleme bereitet, wenn man für die Freigabe nicht die EUI-64 benutzt ... wie weit die jetzt auf eine bereits nicht ganz saubere Konfiguration zurückzuführen sind oder ob es sich generell um ein Problem in der neuen PCP-Implementierung handelt, vermag ich auch nicht einzuschätzen ... aber solange man die EUI-64 (das ist i.d.R. auch der erste Vorschlag der Box) benutzt, sollte auch PCP funktionieren.

Auch gegen die Nutzung von PE bei einem Server wäre absolut nichts zu sagen ... es gibt immer noch Leute, die der Idee "1 Gerät == 1 IP-Adresse" verhaftet sind und sich nicht damit anfreunden können/wollen, daß es bei IPv6 der Normalfall ist, daß ein Gerät/ein Interface mehrere IPv6-Adressen für unterschiedliche Aufgaben hat und mit genau diesen unterschiedlichen Adressen auch im Internet 1:1 "sichtbar" ist, denn bei IPv6 gibt es (i.d.R.) kein Masquerading (aka NAT). Wenn dann irgendein Server auch für ausgehende Verbindungen eine IP-Adresse mit einer EUI-64 auf Basis der L2-Adresse benutzt, ist es für jeden Anbieter, den dieser Server dann kontaktiert, ein Leichtes, genau diesen Server "auf ewig" zu verfolgen, selbst wenn der vom Provider alle 10 Minuten ein anderes Präfix erhalten sollte.
 
Guter Tipp, die Variable gibt es tatsächlich, der Inhalt ist aber leider "::". Die Idee scheint bei AVM also im Ansatz stecken geblieben zu sein. Für MyFritz muss es aber eine Möglichkeit geben, den Präfix zu übertragen. Das ist aber wahrscheinlich ein proprietäres Protokoll, bzw. wird nicht mit dem selben DynDNS-Client gemacht.
 
Das bei MyFRITZ! ist SOAP, aber TLS-gesichert und das Zertifikat der Gegenstelle wird geprüft ... ein passendes CA-Zertifikat ist in der Firmware als "/etc/jasonii_root_ca.pem" enthalten. Ist also nicht unbedingt proprietär, aber schon ein spezieller Service.

Wer das direkt auf der Box "überwachen" will, kann sich m.W. mit "inotify" auf die Dateien "/var/tmp/ddnslog_*.txt" stürzen, wo der "ddnsd" der Box seine Aktionen (u.a. auch die MyFRITZ!-Aktualisierungen) protokolliert. Damit hat man den passenden Trigger ... oder man hängt sich an "onlinechanged" ran und verwaltet den Status (was war der letzte Präfix, hat er sich überhaupt geändert, usw.) selbst.

Ansonsten ist die Abfrage des aktuellen Präfix vom Provider direkt über Lua möglich (als Beispiel kann man in die /usr/lua/connection.lua schauen) und muß nicht über das "ip"-Kommando mühsam ausgelesen werden (was auch noch einigermaßen fehlerträchtig ist - ich habe glaube ich oben etwas in der Richtung gelesen).
 
Also, die Variable ip6lanprefix ist bei der 6.92 (7490) immer noch leer.
Aber:
Bei der Einstellung "Native IPv6-Anbindung verwenden" - "Globale Adresse aus dem zugewiesenen Präfix ableiten" wird bei mir (VVDSL/O2 rot, ipv6 auf Wunsch aktiviert)
nur EINE ipv6 für WAN und LAN-Seite der Fritzbox eingerichtet. Das ist aktuell einfach PREFIX::1
Bei dynv6.net stimmt dann der daraus abgeleitete prefix für die ganze subdomain und alle meine dort mit ihrem local identifier in den resource records eingetragenen AAAA hosts bekommen die richtige, geroutete IP
Leider hat das nicht funktioniert. Die Fritzbox verwendet jetzt lokal nicht mehr den Prefix:00:: wie in der Fritzbox-Adresse, sondern den Prefix:01::
War nix mit korrekten hosts in dynv6...
 
Zuletzt bearbeitet:
Mit Hilfe von dynv6 hat es jetzt doch noch funktioniert. Der Support dort hat jetzt den
Algorithmus zum Zusammenfügen von prefix und host-Eintrag geändert. (Danke
Julian!)

"Ab jetzt werden Prefix und Host-Adresse per logischem OR verknüpft, wenn
mindestens die ersten 48 Bit der Host-Adresse aus Nullen besteht."

Und das funktioniert. Bei mir wird der /56 prefix aus der prefix:00::1 WAN Adresse der Fritzbox wird nun erfolgreich mit dem ::1:interface_identifier verbunden, den ich als host in dynv6 eingetragen
habe. Die dns Abfrage ergibt dann für den Host korrekt

prefix:01:local_identifier

...und er ist erreichbar.

Entscheidend auf der Fritzbox-Seite ist, das man die IPv6-nativ Einstellung
"Globale Adresse aus dem zugewiesenen Präfix ableiten" verwendet. Dann gibt es nur noch
einen vom Provider per dhcpv6 zugewiesenen Prefix und stets je ein Subnetz
prefix:00: auf der WAN und prefix:01: auf der LAN Seite.
 
Hallo,

um endlich IPv6 im Büro zu bekommen, haben wir nun mit einen Anschluß zur Telekom gewechselt. Dabei mußte ich nun zwangsläufig auch auf das Problem mit den IPv6-Portfreigaben treffen.

Eine anbieterspezifische oder routerabhängige Lösung (inklusive MyFritz und Umschalten der Fritzbox-eigenen Adresse auf <prefix>:0:0:0:1) mag ich nicht so sehr.

Daher habe ich mir ein kleines Programm selbst geschrieben. Da wir primär mit Windows-Rechnern zu tun haben, handelt es sich um einen Windows-Dienst. Ich habe ihn "DynSix" genannt.

Dieser wird auf dem jeweiligen Host installiert. Jede Minute checkt er die aktuelle IPv6-Adresse. Bei einer Änderung meldet er diese an einen DynDNS-Dienst (hier All-Inkl). Da ich auch den IPv6-Prefix allein benötigte, kann optional eine Bitmaske drübergeschickt werden. Pro Dienst sind mehrere Meldungen parallel möglich.

Für Interessierte habe ich den Quellcode hier angehängt. Vielleicht kann er ja noch jemandem nützlich sein. Der Quellcode besteht nur einer einzigen Datei (C#) und kann auf jedem aktuellen Windows-Rechner (mit C#-Compiler) kompiliert werden. Anbei auch eine Beispielkonfiguration mit 1× für komplette Adresse und 1× nur Prefix. Beide Dateien sind einmal pur als Code und einmal als Zip-Datei angehängt.

Der Router muß dann lediglich noch die Portfreigabe zulassen.

Grüße.

Code:
////////////////////////////////////////////////////////////////////////////////////////////////////////
// DynSix.cs
//
// Requires C# 5 or newer.
// Determines IPv6 address and propagates it to a dynamic DNS server.
// Must be run as an MS Windows service.
// Needs configuration file DynSix.cfg in the programme directory (see class DSConfig).
//
// Compile code:      "%WINDIR%\Microsoft.NET\Framework\v4.0.30319\csc" DynSix.cs
// Install service:   "%WINDIR%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" "%CD%\DynSix.exe"
// Uninstall service: "%WINDIR%\Microsoft.NET\Framework\v4.0.30319\InstallUtil.exe" /u "%CD%\DynSix.exe"
//
// Additional hints:
// Service installation may need elevation (Command Prompt -> Run as administrator).
// How to enable ICMP (ping reply) on MS Windows: netsh firewall set icmpsetting type=all mode=enable
////////////////////////////////////////////////////////////////////////////////////////////////////////

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Security;
using System.Net.Sockets;
using System.Reflection;
using System.Security.Cryptography.X509Certificates;
using System.ServiceProcess;
using System.Timers;

[assembly: AssemblyTitle("DynSix")]
[assembly: AssemblyDescription("DynSix - IPv6 Address Propagator")]
[assembly: AssemblyCompany("ACME")]
[assembly: AssemblyProduct("DynSix")]
[assembly: AssemblyCopyright("Free to the world")]

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

namespace DynSix
{
    class DSMain
    {
        // The main entry point for the application.
        static void Main()
        {
            ServiceBase.Run(new DSService());
        }
    }

    class DSService : ServiceBase
    {
        private Timer workTimer = new Timer();

        public DSService()
        {
            this.ServiceName = "DynSix";
        }

        protected override void OnStart(string[] args)
        {
            DSLog.Info("Starting Service ...");

            workTimer.Elapsed += WorkTimerElapsedHandler;
            workTimer.Interval = 60 * 1000; // every minute
            workTimer.Start();

            DSLog.Info("Starting Service done");
        }

        protected override void OnStop()
        {
            DSLog.Info("Stopping Service");
        }

        private void WorkTimerElapsedHandler(object sender, ElapsedEventArgs e)
        {
            try
            {
                DSWorker.Work();
            }
            catch (Exception ex)
            {
                DSLog.Error(ex.ToString());
            }
        }
    }

    [RunInstaller(true)]
    public class DSServiceInstaller : Installer
    {
        public DSServiceInstaller()
        {
            this.Installers.Add(new ServiceProcessInstaller
            {
                Account = ServiceAccount.LocalSystem,
                Username = null,
                Password = null
            });
            this.Installers.Add(new ServiceInstaller
            {
                ServiceName = "DynSix",
                DisplayName = "DynSix",
                Description = "DynSix - IPv6 Address Propagator"
            });
        }
    }

    class DSWorker
    {
        // DSWorker.Work() is executed periodically.
        // It checks for an IPv6 address change and propagates it to the dynamic DNS server.

        private static Boolean configInitialized = false;
        private static List<DSSession> sessions = null;

        public static void Work()
        {
            if (!configInitialized)
            {
                // Read configuration
                sessions = DSConfigReader.Read();
                configInitialized = true;
            }

            foreach (DSSession session in sessions)
            {
                // Find IPv6 address that can be used to connect the internet
                IPAddress address = FindPublicIpv6Address(session.MacAddress);
                if (session.IpMask != null) address = DSUtil.IPAddress_ApplyMask(address, session.IpMask);

                if ((session.LastPropagatedIpAddress != null) && (session.LastPropagatedIpAddress.Equals(address)))
                {
                    DSLog.Debug("IPv6 address of session \"" + session.Name + "\" is unchanged.");
                }
                else
                {
                    if (session.LastPropagatedIpAddress != null) DSLog.Info("IPv6 address of session \"" + session.Name + "\" has changed from " + session.LastPropagatedIpAddress.ToString() + " to " + address.ToString());

                    // Publish IPv6 address using dynamic DNS
                    String url = session.DynDnsUrlTemplate.Replace("<ip6addr>", address.ToString());
                    DSLog.Info("Session \"" + session.Name + "\", Request: " + url);
                    String response = DSWeb.PerformRequest(new Uri(url), session.DynDnsUsername, session.DynDnsPassword);
                    DSLog.Info("Session \"" + session.Name + "\", Response: " + response);

                    session.LastPropagatedIpAddress = address;
                    DSLog.Info("Ok, propagated IPv6 address of session \"" + session.Name + "\" is now " + session.LastPropagatedIpAddress.ToString());
                }
            }
        }

        // Find IPv6 address that can be used to connect the internet
        private static IPAddress FindPublicIpv6Address(string macAddress)
        {
            PhysicalAddress DesiredPhysicalAddress = PhysicalAddress.Parse(macAddress);

            // Find network interface identified by MAC address
            NetworkInterface ni = NetworkInterface.GetAllNetworkInterfaces().FirstOrDefault(x => (x.GetPhysicalAddress().Equals(DesiredPhysicalAddress)));
            if (ni == null) throw new Exception("Network interface with MAC address " + DesiredPhysicalAddress.ToString() + " not found.");
            DSLog.Debug("Found network interface: " + ni.Name);

            // Find IPv6 address of this network interface.
            // It shall be able to connect to the internet (not IsIPv6LinkLocal, PrefixOrigin = RouterAdvertisement)
            // and not be changed periodically by the IPv6 privacy extensions (SuffixOrigin = LinkLayerAddress).
            // In addition, it must not be deprecated (DuplicateAddressDetectionState = Preferred).
            IPAddressInformation ia = ni.GetIPProperties().UnicastAddresses.FirstOrDefault(x =>
                x.Address.AddressFamily == AddressFamily.InterNetworkV6 &&
                !x.Address.IsIPv6LinkLocal &&
                x.PrefixOrigin == PrefixOrigin.RouterAdvertisement &&
                x.SuffixOrigin == SuffixOrigin.LinkLayerAddress &&
                x.DuplicateAddressDetectionState == DuplicateAddressDetectionState.Preferred);
            if (ia == null) throw new Exception("Network interface \"" + ni.Name + "\" has no appropriate IPv6 address.");
            DSLog.Debug("Found IPv6 address: " + ia.Address.ToString());

            return ia.Address;
        }
    }

    class DSSession
    {
        public string Name = null;
        public string MacAddress = null;
        public IPAddress IpMask = null;
        public string DynDnsUrlTemplate = null;
        public string DynDnsUsername = null;
        public string DynDnsPassword = null;

        public IPAddress LastPropagatedIpAddress = null;
    }

    class DSConfigReader
    {
        // DynSix configuration reader.
        //
        // Configuration file must be named "DynSix.cfg" an be located in the programme directory.
        // Key "DynDnsUrlTemplate" must contain a placeholder "<ip6addr>" for the IPv6 address.
        //
        // Example content:
        // --------------------------------------------------------------
        // # Example DynSix.cfg
        // # Session is required only if more than one session is used
        // # IPMask is optional
        //
        // Session = fasel
        // MacAddress = 00-0C-39-A2-50-11
        // IPMask = ffff:ffff:ffff:ffff::
        // DynDns.UrlTemplate = https://dyndns.service.com/?myip=<ip6addr>
        // DynDns.Username = baffoon
        // DynDns.Password = topsecret
        // --------------------------------------------------------------

        public static List<DSSession> Read()
        {
            List<DSSession> sessions = new List<DSSession>();

            {
                DSSession session = null;

                String configFilename = AppDomain.CurrentDomain.BaseDirectory + "DynSix.cfg";
                using (StreamReader rdr = new StreamReader(configFilename))
                {
                    String line;
                    while ((line = rdr.ReadLine()) != null)
                    {
                        line = line.Trim();
                        if ((line.Length != 0) && !line.StartsWith("#"))
                        {
                            int p = line.IndexOf('=');
                            if (p != -1)
                            {
                                String key = line.Substring(0, p).Trim();
                                String value = line.Substring(p + 1).Trim();

                                if (key == "Session")
                                {
                                    if (session != null) sessions.Add(session);
                                    session = new DSSession() { Name = value };
                                }
                                else
                                {
                                    if (session == null) session = new DSSession() { Name = "default" };

                                    try
                                    {
                                        switch (key)
                                        {
                                            case "MacAddress": session.MacAddress = value; break;
                                            case "IpMask": session.IpMask = IPAddress.Parse(value); break;
                                            case "DynDns.UrlTemplate": session.DynDnsUrlTemplate = value; break;
                                            case "DynDns.Username": session.DynDnsUsername = value; break;
                                            case "DynDns.Password": session.DynDnsPassword = value; break;
                                            default: throw new Exception("Keyword is unknown.");
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        throw new Exception("Invalid configuration at keyword \"" + key + "\" in Session \"" + session.Name + "\": " + ex.Message);
                                    }
                                }
                            }
                            else
                            {
                                throw new Exception("Invalid configuration: Invalid line \"" + line + "\".");
                            }
                        }
                    }
                }

                if (session != null) sessions.Add(session); // last open session
            }

            foreach (DSSession session in sessions)
            {
                if (session.MacAddress == null) throw new Exception("Invalid configuration: Key \"MacAddress\" in Session \"" + session.Name + "\" is not defined.");
                if (session.DynDnsUrlTemplate == null) throw new Exception("Invalid configuration: Key \"DynDns.UrlTemplate\" in Session \"" + session.Name + "\" is not defined.");
                if (session.DynDnsUsername == null) throw new Exception("Invalid configuration: Key \"DynDns.Username\" in Session \"" + session.Name + "\" is not defined.");
                if (session.DynDnsPassword == null) throw new Exception("Invalid configuration: Key \"DynDns.Password\" in Session \"" + session.Name + "\" is not defined.");
            }

            return sessions;
        }
    }

    class DSWeb
    {
        private static Boolean initialized = false;

        private static void Init()
        {
            if (initialized) return;

            // accept arbitrary SSL certifikate
            ServicePointManager.ServerCertificateValidationCallback +=
                (object sender, X509Certificate certification, X509Chain chain, SslPolicyErrors sslPolicyErrors) =>
                { return true; };

            initialized = true;
        }

        // Perform an HTTP or HTTPS request using username and password
        public static String PerformRequest(Uri uri, String username, String password)
        {
            Init();

            String result = "?";

            CredentialCache credentialCache = new CredentialCache();
            credentialCache.Add(uri, "Basic", new NetworkCredential(username, password));

            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
            webRequest.UserAgent = "ACME - DynSix - 1.0";
            webRequest.ContentType = "text/plain";
            webRequest.ContentLength = 0;
            webRequest.Credentials = credentialCache;
            webRequest.PreAuthenticate = true;

            using (WebResponse response = webRequest.GetResponse())
            {
                Stream dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = reader.ReadToEnd();
                result = responseFromServer;
            }

            return result;
        }
    }

    class DSUtil
    {
        public static IPAddress IPAddress_ApplyMask(IPAddress address, IPAddress mask)
        {
            Byte[] addressBytes = address.GetAddressBytes();
            Byte[] maskBytes = mask.GetAddressBytes();

            for (int i = 0; i < addressBytes.Length; i++) addressBytes[i] &= maskBytes[i];

            return new IPAddress(addressBytes);
        }
    }

    class DSLog
    {
        // Simple logging

        public static void Debug(String text)
        {
            //Log('D', text);
        }

        public static void Info(String text)
        {
            Log('I', text);
        }

        public static void Error(String text)
        {
            Log('E', "ERROR: " + text);
        }

        private static void Log(Char level, String text)
        {
            DateTime now = DateTime.Now;
            File.AppendAllText(
                Path.GetTempPath() + "/DynSix_" + now.ToString("yyyyMMdd") + ".log",
                "[" + now.ToString("yyyy-MM-dd HH:mm:ss") + " " + level + "] " + text + Environment.NewLine);
        }
    }
}

Code:
# DynSix.cfg

Session = adr.domain.com
MacAddress = 00-0C-29-A2-30-11
DynDns.UrlTemplate = https://dyndns.kasserver.com/?myip=<ip6addr>
DynDns.Username = dyn000b0a1
DynDns.Password = eMHvzuS65ujcwLsw

Session = adrpfx.domain.com
MacAddress = 00-0C-29-A2-30-11
IpMask = ffff:ffff:ffff:ffff::
DynDns.UrlTemplate = https://dyndns.kasserver.com/?myip=<ip6addr>
DynDns.Username = dyn000b0a2
DynDns.Password = P3M1f4fv/hbbXyCP
 

Anhänge

  • DynSix.zip
    4.2 KB · Aufrufe: 2
...hm...und hast Du die Privacy Extensions auf dem Host ausgeschaltet? Oder wie trägst Du bei dynv6 sonst was ein, wenn sich der local_identifier ja doch in regelmäßigen Intervallen ändert?

Beste Grüße!

Mit Hilfe von dynv6 hat es jetzt doch noch funktioniert. Der Support dort hat jetzt den
Algorithmus zum Zusammenfügen von prefix und host-Eintrag geändert. (Danke
Julian!)
... Vollzitat gekürzt by stoney
 
Zuletzt bearbeitet von einem Moderator:
Auch mit Privacy Extensions ist der local_identifier immer gültig, denn der Host-Anteil wird ja aus der MAC-Adresse generiert. Nur für ausgehende Verbindungen wird die "Privacy Extension" IPv6-Adresse verwendet, bei eingehenden gehen beide.
 
Tatsächlich habe ich die privacy extensions ausgeschaltet. "randomizeidentifiers" ist dagegen noch an.
So wird 1x eine zufälliger local identifier erzeugt und bleibt dann. Der prefix wechselt dann .jede Nacht.
 
Hmm, da haben wir wohl aneinander vorbei gesprochen, ich ging von Linux aus, du wohl von Windows. Wen du so "sichere" Einstellungen wählst, funktioniert die Portfreigabe dann ebenfalls nicht, denn man muss in der FB einen statischen Identifier konfigurieren.
 
Also ich für meinen Teil verwende auf dem Server Linux... ;) ...und ich muss offenbar noch viel über ipv6 lesen und lernen. Ich versuch das mal zusammenzufassen... ;)

Habe beim Server die PE eingeschaltet. Der Server bekommt Standarmäßig drei IPv6-Adressen zugewiesen: eine mit fd00 (link local, oder?), eine mit fe80 und eine mit 2a01 am Anfang. Der Hostteil der fe80-Adresse ist in der Tat immer der gleiche,bei der 2a01-Adresse wechselt auch immer der Hostteil, wenn es ein neues Prefix gibt, bzw. wenn die "preferred_lft" abgelaufen ist.

Die FritzBox aktualisiert ihren DynDNS Eintrag (<meinesubdomain>.dynv6.net) korrekt.

Ich möchte, daß der Server immer unter der gleichen Subdomain (https://cloud.<meinesubdomain>.dynv6.net) erreichbar ist. Lege ich dafür manuell einen AAAA-Eintrag mit der momentan gültigen 2a01-Adresse des Servers an, klappt das natürlich.

Die Lösung von martinbee aus den Beiträgen #10 und #11 funktioniert, allerdings wäre es ja begrüssenswert die PE aktiviert lassen zu können.

In den Fritzbox Freigaben werden mir als lokale Adressen die (korrekte) IPv4-Adresse des Servers angezeigt und der Host-Teil der fe80-Adresse, der sich ja in der Tat nicht ändert. Trage ich diesen nun für den AAAA-Record in dynv6 ein, funktioniert der Zugriff (natürlich?) nicht, da er daraus einen Mix aus dem 2a01-Präfix und dem fe80-Host bastelt, den es so ja eigentlich gibt (!?)...
Leider scheint es bei dynv6.com keine Möglichkeit zu geben, die AAAA-Records per URL zu updaten!?

Fühl mich etwas "verirrt im Wald"...puh...
 
..., denn man muss in der FB einen statischen Identifier konfigurieren.
Könnte man hier nicht den Namens des Gerätes als "statischen Identifier" benutzen? Denn die v6-Firewall der FritzBox sollte diesen Namen doch jederzeit der _nicht festen_ Interface-ID des Gerätes, zuordnen können.
 
Könnte man hier nicht den Namens des Gerätes als "statischen Identifier" benutzen? Denn die v6-Firewall der FritzBox sollte diesen Namen doch jederzeit der _nicht festen_ Interface-ID des Gerätes, zuordnen können.

Nein, so ist die aktuelle Implementierung von AVM leider nicht. Man muss tatsächlich die Interface-ID in der GUI konfigurieren.
 
Nein, so ist die aktuelle Implementierung von AVM leider nicht. Man muss tatsächlich die Interface-ID in der GUI konfigurieren.
Ich häng, dank Glasfaser, auch seit ein paar tagen an dem Thema.
Hab es jetzt soweit, dass der DDNS Client unter Linux die globale IPv6 an Strato meldet.
Dort habe ich ich dies auf eine Subdomain gelenkt. Funktioniert auch.
Mein Problem ist noch
1.) wie macht ihr das mit dem Portforwarding in der FritzBox?
Ich muss da mnuell eine IPv6 Interface ID eingeben. Leider ändert die sich ab und an. Und schon komm ich nicht mehr auf den Server, weil dioe FB es nicht durchlässt. Erst nach manueller Änderung geht es wieder.
Wie kann ich das so einstellen, dass die FB die aktuelle Interface ID für die Portweiterleitung nimmt?

2.) Wenn es gerade beides aktuell ist und aus dem Internet (teste mit Mobilfunk) erreichbar ist, dann ist es im Intra Net nicht zu erreichen. Zwar im Moment nicht so wichtig hätt ich aber auch gern gelöst.
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.