René Telemann

Die Dynamik von DynDNS: Eine Lösung für IP-Adressen im Missbrauch

Einleitung: Die Rolle von IP-Adressen im Internet

In der Welt des Internets spielen IP-Adressen eine entscheidende Rolle, ähnlich wie Fingerabdrücke für Geräte, die miteinander kommunizieren. Sie sind das Rückgrat der Web-Infrastruktur. Doch nicht alle IP-Adressen sind gleich. Einige geraten in den Strudel des Missbrauchs durch Spam, Malware und andere schädliche Aktivitäten.

Das Problem mit missbräuchlichen IP-Adressen bei DynDNS

Für Nutzer mit dynamischen IP-Adressen, die ihre Heimverbindungen verwalten, ist dies ein ernstes Problem. Hier kommt das DynDNS (Dynamic Domain Name System) ins Spiel. Es ermöglicht die Zuweisung eines statischen Domainnamens zu einer dynamischen IP-Adresse. Strato ist ein bekannter Anbieter von DynDNS-Diensten, der Benutzern die Möglichkeit bietet, ihre IP-Adressen mit einem Domainnamen zu verknüpfen, um von überall auf ihre Heimnetzwerke zugreifen zu können.

Die Lösung: Ein automatisiertes Skript zur Überwachung und Reaktion

Um dieses Problem anzugehen, habe ich ein Skript entwickelt, das die aktuelle IP-Adresse überprüft und bei Missbrauch automatisch handelt. Das Skript vergleicht die aktuelle IP-Adresse mit einer Liste von bekannten Missbrauchs-IP-Adressen. Wenn die IP-Adresse als missbräuchlich identifiziert wird, setzt das Skript sie automatisch auf eine schwarze Liste und fordert eine neue IP-Adresse von ihrem ISP an.

Wie das Skript funktioniert

  1. IP-Adresse abrufen: Das Skript ruft die aktuelle IP-Adresse des DynDNS-Dienstes ab.
  2. Missbrauch erkennen: Es überprüft, ob die Antwort die Markierung „abuse“ enthält, die auf Missbrauch hinweist.
  3. Automatische Reaktion: Falls ja, setzt das Skript die IP-Adresse auf eine schwarze Liste und fordert eine neue IP-Adresse an.
  4. Zusätzliche Sicherheit: Zusätzlich wird die FRITZ!Box neu verbunden, um sicherzustellen, dass die Änderungen wirksam sind.

Vorteile für die Benutzer

Dieses Skript ermöglicht es Benutzern, die Kontrolle über ihre DynDNS-Dienste zu behalten und sicherzustellen, dass sie nicht mit missbräuchlichen IP-Adressen verbunden sind. Es bietet eine zusätzliche Sicherheitsebene für Heimnetzwerke und andere Geräte, die über das Internet zugänglich sind.

Wichtige Hinweise und Verfügbarkeit des Skripts

Das Skript ist auf meiner GitHub-Repository verfügbar oder im Anhang dieses Artikels. Es ist wichtig zu beachten, dass solche Skripte sorgfältig entwickelt und gewartet werden müssen, um ordnungsgemäß zu funktionieren und keine unerwünschten Nebenwirkungen zu haben. Benutzer sollten sicherstellen, dass sie die Nutzungsbedingungen ihres DynDNS-Anbieters einhalten und keine Richtlinien verletzen.

Fazit: Sicherheit und Flexibilität mit DynDNS

In einer Welt, in der Internet-Sicherheit immer wichtiger wird, sind solche DIY-Lösungen ein Beispiel für die Kreativität und den Einfallsreichtum der Internetgemeinschaft. Sie ermöglichen es den Nutzern, ihre Online-Präsenz zu schützen und gleichzeitig die Flexibilität und Bequemlichkeit von DynDNS-Diensten zu nutzen.

Das Script:

<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);

// Pfad zur Textdatei, in der "Abuse" IP-Adressen gespeichert sind
$abuse_ip_list_file = '/var/www/html/abuse_ip_list.txt';

// Funktion zum Abrufen der aktuellen IP-Adresse
function getCurrentIP($abuse_ip_list_file)
{
    $url = 'https://deinedomain:deinpasswort@dyndns.strato.com/nic/update?hostname=deinedomain';

       $options = array(
        'http' => array(
            'header' => "User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36\r\n"
        )
    );

    $context = stream_context_create($options);
    $response = file_get_contents($url, false, $context);

    // Ausgabe der tatsächlichen Antwort
    echo 'Antwort von getCurrentIP(): ' . $response . PHP_EOL;

    // Überprüfen Sie, ob die Antwort "abuse" enthält
    if (strpos($response, 'abuse') !== false) {
        echo 'Die Antwort von getCurrentIP() enthält "abuse".' . PHP_EOL;

        // Hier weitere Aktionen hinzufügen, wenn nötig.

        // IP zur "Abuse" IP-Adressenliste hinzufügen
        file_put_contents($abuse_ip_list_file, $response . PHP_EOL, FILE_APPEND);

        // Verwenden Sie die UPnP-Funktion, um die FRITZ!Box neu zu verbinden
        reconnectFritzBoxUPnP();

        // Beende das Skript, da eine Neuverbindung durchgeführt wurde
        exit();
    }

    // Extrahieren Sie die IP-Adresse aus der Antwort
    preg_match('/\d+\.\d+\.\d+\.\d+/', $response, $matches);
    $ip = $matches[0];

    echo 'Aktuelle IP-Adresse: ' . $ip . PHP_EOL;

    return $ip;
}

// Funktion Reconnect via UPnP
function reconnectFritzBoxUPnP($host = 'fritz.box', $port = 49000, $debug = false)
{
    $xml_request = <<<EOT
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Body>
    <u:ForceTermination xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"></u:ForceTermination>
  </s:Body>
</s:Envelope>
EOT;

    // Setze die URL für die UPnP-Verbindung
    $upnp_url = "http://$host:$port/igdupnp/control/WANIPConn1";

    // Erstelle eine cURL-Sitzung
    $ch = curl_init();

    // Setzen Sie die cURL-Optionen
    curl_setopt_array($ch, array(
        CURLOPT_URL => $upnp_url,
        CURLOPT_POST => 1,
        CURLOPT_HTTPHEADER => array(
            'SOAPAction: "urn:schemas-upnp-org:service:WANIPConnection:1#ForceTermination"',
            'Content-Type: text/xml; charset="utf-8"',
            'Content-Length: ' . strlen($xml_request),
        ),
        CURLOPT_POSTFIELDS => $xml_request,
        CURLOPT_RETURNTRANSFER => true,
    ));

    // Führe die cURL-Anfrage aus
    $response = curl_exec($ch);

    // Überprüfe auf cURL-Fehler
    if ($response === false) {
        echo 'CURL-Fehler: ' . curl_error($ch) . PHP_EOL;
    } else {
        // Hier können Sie mit $response arbeiten, z. B. die Antwort anzeigen
        echo 'CURL Response: ' . $response . PHP_EOL;
    }

    // Beende die cURL-Sitzung
    curl_close($ch);
}

// Holen Sie sich die aktuelle IP-Adresse
$current_ip = getCurrentIP($abuse_ip_list_file);

// Alles OK, keine Neuverbindung erforderlich
echo 'Alles OK. Keine Neuverbindung erforderlich.' . PHP_EOL;

// Haupt-Schleife
while (true) {
    try {
        // Solange "abuse" in der Antwort enthalten ist, wiederhole den Vorgang alle 60 Sekunden
        while (strpos($current_ip, 'abuse') !== false) {
            // Warten Sie 5 Sekunden
            sleep(5);

            // Holen Sie sich die aktuelle IP-Adresse erneut
            $new_ip = getCurrentIP($abuse_ip_list_file);

            echo 'Aktuelle IP-Adresse: ' . $new_ip . PHP_EOL;

            // Überprüfen, ob sich die IP-Adresse geändert hat
            if ($new_ip !== $current_ip) {
                // Die IP-Adresse hat sich geändert

                // Wenn die Antwort "abuse" enthält, die IP-Adresse hinzufügen und neu verbinden
                if (strpos($new_ip, 'abuse') !== false) {
                    $current_ip = $new_ip;

                    // Überprüfen, ob die IP-Adresse bereits in der "Abuse" IP-Adressenliste ist
                    if (isIPInList($current_ip, $abuse_ip_list_file)) {
                        // Die IP-Adresse ist in der "Abuse" IP-Adressenliste
                        echo 'Die IP-Adresse ' . $current_ip . ' ist bereits in der "Abuse" IP-Adressenliste. Neuverbindung wird durchgeführt.' . PHP_EOL;

                        // Verwenden Sie die UPnP-Funktion, um die FRITZ!Box neu zu verbinden
                        reconnectFritzBoxUPnP();
                    } else {
                        // Die IP-Adresse ist nicht in der "Abuse" IP-Adressenliste
                        echo 'Die IP-Adresse ' . $current_ip . ' wurde als "Abuse" erkannt. Neuverbindung mit FritzBox wird durchgeführt.' . PHP_EOL;

                        // IP zur "Abuse" IP-Adressenliste hinzufügen
                        file_put_contents($abuse_ip_list_file, $current_ip . PHP_EOL, FILE_APPEND);

                        // Verwenden Sie die UPnP-Funktion, um die FRITZ!Box neu zu verbinden
                        reconnectFritzBoxUPnP();
                    }
                }
            }
        }

        // Wenn "abuse" nicht mehr in der Antwort enthalten ist, pausiere für 60 Minuten
        sleep(3600);
    } catch (Exception $e) {
        echo 'Fehler beim Abrufen der IP-Adresse oder Neuverbinden mit der FritzBox: ' . $e->getMessage() . PHP_EOL;
    }
}
// Funktion zum Überprüfen, ob eine IP-Adresse bereits in der Liste ist
function isIPInList($ip, $file)
{
    $ipList = file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
    return in_array($ip, $ipList);
}
?>

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Rating*