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
- IP-Adresse abrufen: Das Skript ruft die aktuelle IP-Adresse des DynDNS-Dienstes ab.
- Missbrauch erkennen: Es überprüft, ob die Antwort die Markierung „abuse“ enthält, die auf Missbrauch hinweist.
- Automatische Reaktion: Falls ja, setzt das Skript die IP-Adresse auf eine schwarze Liste und fordert eine neue IP-Adresse an.
- 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);
}
?>