Dieses Premium Script ist exklusiv für unsere Newsletter Abonnenten!
Der DNS Global Checker ist ein leistungsstarkes Dreamcodes Online-Tool zur weltweiten Überprüfung der DNS-Einträge einer Domain. Mit diesem Tool können Sie schnell und zuverlässig feststellen, wie Ihre Domain aus verschiedenen Regionen der Welt aufgelöst wird. Es ermöglicht die Analyse von DNS-Server-Antworten aus verschiedenen Ländern und Kontinenten, um die Verbreitung und Konsistenz Ihrer DNS-Daten zu überprüfen.
Ideal für Website-Betreiber, IT-Administratoren und Netzwerkspezialisten, die sicherstellen möchten, dass ihre DNS-Einträge korrekt propagiert sind und weltweit erreichbar bleiben. Der DNS Global Checker hilft bei der Diagnose von DNS-Problemen, Verzögerungen bei der DNS-Aktualisierung oder fehlerhaften Konfigurationen, die den Zugriff auf Webseiten oder Dienste beeinträchtigen können.
Funktionen:
- Überprüfung von A-, AAAA-, MX-, CNAME-, TXT- und weiteren DNS-Einträgen
- Abfrage von DNS-Servern aus verschiedenen Ländern und Regionen
- Anzeige von Antwortzeiten und Status der DNS-Server
- Historische Vergleiche zur Überwachung von Änderungen
- Hilfreich bei der Fehlersuche und Optimierung der DNS-Infrastruktur
Mit dem DNS Global Checker behalten Sie die Kontrolle über Ihre Domain und stellen sicher, dass Ihre Dienste weltweit zuverlässig erreichbar sind.
- index.php
<?php
// index.php - Frontend fuer Dreamcodes DNS Global Checker mit method selector
?>
<!DOCTYPE html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<title>Dreamcodes - DNS Global Checker</title>
<link rel="stylesheet" href="https://unpkg.com/leaflet@1.9.4/dist/leaflet.css"/>
<style>
:root{
--bg:#0f1724; --card:#0b1220; --accent:#06f; --muted:#9aa4b2; --ok:#16a34a; --warn:#f59e0b; --err:#ef4444;
}
html,body{height:100%;margin:0;font-family:Inter,Segoe UI,Roboto,Arial,sans-serif;background:linear-gradient(180deg,#071023 0%, #071727 100%);color:#e6eef8}
.header{padding:18px 24px;display:flex;align-items:center;gap:16px}
.logo{font-weight:700;color:var(--accent);font-size:20px}
.container{max-width:1200px;margin:12px auto;padding:12px}
.controls{display:flex;gap:10px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
.input, select, button{padding:10px 12px;border-radius:8px;border:1px solid rgba(255,255,255,0.06);background:rgba(255,255,255,0.02);color:inherit}
.input{min-width:220px;flex:1}
.button-primary{background:var(--accent);border:0;color:#001;cursor:pointer;font-weight:600}
.small{font-size:13px;color:var(--muted)}
.layout{display:grid;grid-template-columns:1fr 420px;gap:14px}
@media(max-width:980px){.layout{grid-template-columns:1fr}}
.card{background:linear-gradient(180deg, rgba(255,255,255,0.02), rgba(255,255,255,0.01));border-radius:10px;padding:12px;box-shadow:0 8px 30px rgba(2,6,23,0.6)}
#map{height:640px;border-radius:8px}
.tablewrap{max-height:640px;overflow:auto}
table{width:100%;border-collapse:collapse;color:#dfe9f5}
th,td{padding:10px;border-bottom:1px solid rgba(255,255,255,0.03);text-align:left;font-size:13px}
th{background:rgba(255,255,255,0.02);position:sticky;top:0}
.status-dot{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:8px}
.legend{display:flex;gap:12px;align-items:center;margin-top:8px;font-size:13px;color:var(--muted)}
.footer{margin-top:12px;font-size:13px;color:var(--muted)}
.notice{background:rgba(255,255,255,0.02);padding:8px;border-radius:8px;color:var(--muted);font-size:13px}
.method-switch{display:flex;gap:8px;align-items:center}
</style>
</head>
<body>
<div class="header">
<div class="logo">Dreamcodes DNS Global Checker</div>
<div class="small">- mit wählbarer Abfragemethode</div>
</div>
<div class="container">
<div class="controls card">
<input id="domain" class="input" placeholder="z. B. example.com" value="example.com" />
<select id="type" class="input" style="max-width:160px;">
<option>A</option><option>AAAA</option><option>CNAME</option><option>MX</option><option>NS</option><option>TXT</option><option>SOA</option><option>PTR</option><option>SRV</option>
</select>
<div class="method-switch">
<label class="small">Methode</label>
<select id="method" class="input" style="max-width:220px;">
<option value="dig">Direkte Abfrage (dig)</option>
<option value="php">PHP-Resolver (dns_get_record, fallback)</option>
</select>
</div>
<button id="checkBtn" class="button-primary">Prüfen</button>
<button id="clearBtn">Reset</button>
<div style="flex-basis:100%"></div>
<div class="small">Anzeige der Ergebnisse von mehreren weltweit verteilten DNS-Resolvern. API rate-limit schützt den Server.</div>
</div>
<div class="layout">
<div class="card">
<div id="map"></div>
<div class="legend">
<span><span class="status-dot" style="background:var(--ok)"></span>OK</span>
<span><span class="status-dot" style="background:var(--warn)"></span>Langsam</span>
<span><span class="status-dot" style="background:var(--err)"></span>Fehler</span>
</div>
</div>
<div class="card">
<div class="notice">Tabelle mit Live-Status von Resolvern</div>
<div class="tablewrap" id="tablewrap">
<table id="resultsTable" style="display:none">
<thead><tr><th>Resolver</th><th>Ort</th><th>Antwort</th><th>ms</th></tr></thead>
<tbody></tbody>
</table>
</div>
<div class="footer small">Hinweis: Dieses Tool ist Powered by Dreamcodes.NET</div>
</div>
</div>
</div>
<script src="https://unpkg.com/leaflet@1.9.4/dist/leaflet.js"></script>
<script>
const map = L.map('map').setView([18,0],2);
L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',{maxZoom:6,attribution:'© OpenStreetMap'}).addTo(map);
let markers = {}; // ip -> marker
let servers = []; // loaded from servers.json
async function loadServers(){
const resp = await fetch('servers.json');
servers = await resp.json();
servers.forEach(s => {
const m = L.circleMarker([s.lat,s.lng],{radius:8,fillColor:'#888',color:'#333',weight:1,fillOpacity:0.9}).addTo(map);
m.bindPopup(`<strong>${s.name}</strong><br>${s.server}<br><em>noch nicht geprüft</em>`);
markers[s.server] = m;
});
}
loadServers();
// UI
const checkBtn = document.getElementById('checkBtn');
const clearBtn = document.getElementById('clearBtn');
const table = document.getElementById('resultsTable');
const tbody = table.querySelector('tbody');
const methodSelect = document.getElementById('method');
function colorFor(ms){
if(ms === null) return '#ef4444';
if(ms < 120) return '#16a34a';
if(ms < 400) return '#f59e0b';
return '#ef4444';
}
function resetUI(){
tbody.innerHTML='';
table.style.display='none';
Object.values(markers).forEach(m => m.setStyle({fillColor:'#888', color:'#333'}));
}
clearBtn.addEventListener('click', resetUI);
checkBtn.addEventListener('click', async () => {
const domain = document.getElementById('domain').value.trim();
const type = document.getElementById('type').value;
const method = methodSelect.value;
if(!domain) return alert('Bitte Domain eingeben');
tbody.innerHTML='';
table.style.display='table';
// create rows and show spinner
servers.forEach(s => {
const tr = document.createElement('tr'); tr.id = 'row-'+s.server.replace(/\./g,'-');
tr.innerHTML = `<td>${s.server}</td><td>${s.name}</td><td><em>prüfe…</em></td><td>–</td>`;
tbody.appendChild(tr);
});
// batch concurrency
const CONCURRENCY = 8;
let i = 0;
async function worker(){
while(i < servers.length){
const idx = i++;
const srv = servers[idx];
const params = new URLSearchParams();
params.append('domain', domain);
params.append('server', srv.server);
params.append('type', type);
params.append('method', method);
const row = document.getElementById('row-'+srv.server.replace(/\./g,'-'));
try{
const start = performance.now();
const res = await fetch('api_check.php', {method:'POST', body: params});
const data = await res.json();
const duration = data.response_time !== null ? data.response_time : null;
const color = colorFor(duration);
// build displayText
let displayText = 'Keine Antwort';
if(Array.isArray(data.resolved) && data.resolved.length) displayText = data.resolved.join('; ');
else if(data.resolved_ip) displayText = data.resolved_ip;
else if(data.resolved_raw) displayText = data.resolved_raw;
else if(data.result) displayText = data.result;
row.children[2].textContent = displayText;
row.children[3].textContent = duration !== null ? duration : 'err';
// update marker
const m = markers[srv.server];
if(m) {
m.setStyle({fillColor: color, color: color});
m.bindPopup(`<strong>${srv.name}</strong><br>${srv.server}<br>Antwortzeit: ${duration !== null ? duration + ' ms' : 'keine'}<br><pre style="white-space:pre-wrap; margin:0;">${displayText}</pre>`);
}
}catch(err){
row.children[2].textContent = 'Fehler';
row.children[3].textContent = 'err';
const m = markers[srv.server];
if(m) m.setStyle({fillColor:'#ef4444', color:'#ef4444'});
}
}
}
const workers = [];
for(let k=0;k<CONCURRENCY;k++) workers.push(worker());
await Promise.all(workers);
});
</script>
</body>
</html>
2. api_check.php
<?php
// api_check.php - backend for one DNS check with method selection
header('Content-Type: application/json; charset=utf-8');
// basic rate limit per IP
$max = 120; $window = 60;
$ip = $_SERVER['REMOTE_ADDR'];
$store = __DIR__ . '/ratelimit_api.json';
if(!file_exists($store)) file_put_contents($store, json_encode([]));
$logs = json_decode(file_get_contents($store), true) ?: [];
if(!isset($logs[$ip])) $logs[$ip] = [];
$logs[$ip] = array_filter($logs[$ip], function($t) use($window){ return $t > time() - $window; });
if(count($logs[$ip]) >= $max){ http_response_code(429); echo json_encode(['error'=>'rate_limit']); exit; }
$logs[$ip][] = time();
file_put_contents($store, json_encode($logs));
// read input
$domain = $_POST['domain'] ?? '';
$server = $_POST['server'] ?? '';
$type = strtoupper(trim($_POST['type'] ?? 'A'));
$method = $_POST['method'] ?? 'dig';
// allowed types
$allowed = ['A','AAAA','CNAME','MX','NS','TXT','SOA','PTR','SRV'];
if (!preg_match('/^[A-Za-z0-9\-\._]{1,253}$/', $domain) || !filter_var('http://'.$server, FILTER_VALIDATE_URL) || !in_array($type, $allowed)){
echo json_encode(['error'=>'invalid_input']); exit;
}
// helper
function out($arr){ echo json_encode($arr); exit; }
// choose method: dig or php
$dig = trim(shell_exec('which dig 2>/dev/null')) ?: null;
if($method === 'dig' && $dig){
// build command
$escapedServer = escapeshellarg($server);
$escapedDomain = escapeshellarg($domain);
$escapedType = escapeshellarg($type);
// For SRV, dig needs service format; frontend should send proper name for SRV
$cmd = "$dig @$escapedServer $escapedDomain $escapedType +time=2 +tries=1 +short 2>/dev/null";
$start = microtime(true);
$output = shell_exec($cmd);
$time = round((microtime(true)-$start)*1000,2);
$output = trim($output);
if($output === ''){
out(['result'=>'no','response_time'=>null,'resolved'=>[],'resolved_raw'=>'','resolved_ip'=>null]);
}
$lines = preg_split('/\r?\n/',$output);
$lines = array_values(array_filter(array_map('trim',$lines), fn($l)=>$l!==''));
$first = $lines[0] ?? null;
out(['result'=>'ok','response_time'=>$time,'resolved'=>$lines,'resolved_raw'=>$output,'resolved_ip'=>$first]);
}
// fallback to PHP resolver (dns_get_record)
$map = [
'A' => DNS_A,
'AAAA' => defined('DNS_AAAA') ? DNS_AAAA : 0,
'CNAME' => DNS_CNAME,
'MX' => DNS_MX,
'NS' => DNS_NS,
'TXT' => DNS_TXT,
'SOA' => defined('DNS_SOA') ? DNS_SOA : 0,
'PTR' => defined('DNS_PTR') ? DNS_PTR : 0,
'SRV' => defined('DNS_SRV') ? DNS_SRV : 0
];
$flag = $map[$type] ?? DNS_A;
$start = microtime(true);
$records = @dns_get_record($domain, $flag);
$time = round((microtime(true)-$start)*1000,2);
if(!$records || count($records)===0){
out(['result'=>'no','response_time'=>null,'resolved'=>[],'resolved_raw'=>'','resolved_ip'=>null]);
}
// format records nicely
$lines = [];
foreach($records as $r){
$t = $r['type'] ?? '';
switch($t){
case 'A': $lines[] = $r['ip'] ?? ''; break;
case 'AAAA': $lines[] = $r['ipv6'] ?? ($r['ipv6'] ?? ''); break;
case 'CNAME': $lines[] = $r['target'] ?? ''; break;
case 'MX': $pri = $r['pri'] ?? ($r['preference'] ?? ''); $lines[] = trim(($pri !== '' ? $pri . ' ' : '') . ($r['target'] ?? '')); break;
case 'NS': $lines[] = $r['target'] ?? ($r['host'] ?? ''); break;
case 'TXT':
if(isset($r['txt'])){ if(is_array($r['txt'])) $lines[] = implode(' ', $r['txt']); else $lines[] = $r['txt']; }
elseif(isset($r['entries'])){ $lines[] = implode(' ', $r['entries']); }
break;
case 'SOA': $lines[] = ($r['mname'] ?? '') . ' serial ' . ($r['serial'] ?? ''); break;
case 'PTR': $lines[] = $r['target'] ?? ''; break;
case 'SRV': $lines[] = ($r['priority'] ?? '') . ' ' . ($r['target'] ?? '') . ' ' . ($r['port'] ?? ''); break;
default: $lines[] = json_encode($r);
}
}
$first = $lines[0] ?? null;
out(['result'=>'ok','response_time'=>$time,'resolved'=>$lines,'resolved_raw'=>implode("\n",$lines),'resolved_ip'=>$first]);
?>
3. servers.json
[
{"name":"Google DNS - USA (Mountain View)","lat":37.386,"lng":-122.0838,"server":"8.8.8.8"},
{"name":"Google DNS - USA (Mountain View) 2","lat":37.386,"lng":-122.0838,"server":"8.8.4.4"},
{"name":"Cloudflare - Global","lat":37.751,"lng":-97.822,"server":"1.1.1.1"},
{"name":"Cloudflare - Global 2","lat":37.751,"lng":-97.822,"server":"1.0.0.1"},
{"name":"Quad9 - Global","lat":37.751,"lng":-97.822,"server":"9.9.9.9"},
{"name":"OpenDNS - US","lat":37.7749,"lng":-122.4194,"server":"208.67.222.222"},
{"name":"OpenDNS - US 2","lat":37.7749,"lng":-122.4194,"server":"208.67.220.220"},
{"name":"Comodo Secure DNS - US","lat":33.749,"lng":-84.388,"server":"8.26.56.26"},
{"name":"Verisign - US","lat":37.751,"lng":-97.822,"server":"64.6.64.6"},
{"name":"Yandex DNS - RU","lat":55.7558,"lng":37.6173,"server":"77.88.8.8"},
{"name":"DNS.WATCH - DE","lat":52.52,"lng":13.405,"server":"84.200.69.80"},
{"name":"DNS.WATCH - DE 2","lat":52.52,"lng":13.405,"server":"84.200.70.40"},
{"name":"Google AP - IN","lat":19.0760,"lng":72.8777,"server":"8.8.8.8"},
{"name":"Cloudflare AP - SG","lat":1.3521,"lng":103.8198,"server":"1.1.1.2"},
{"name":"China DNS - CN","lat":39.9042,"lng":116.4074,"server":"223.5.5.5"},
{"name":"China DNS - CN 2","lat":31.2304,"lng":121.4737,"server":"114.114.114.114"},
{"name":"Level3 - BR","lat":-23.5505,"lng":-46.6333,"server":"200.160.2.3"},
{"name":"NL OpenNIC - NL","lat":52.3676,"lng":4.9041,"server":"185.228.168.168"},
{"name":"NL OpenNIC - NL 2","lat":52.3676,"lng":4.9041,"server":"185.228.169.168"},
{"name":"Telstra - AU","lat":-33.8688,"lng":151.2093,"server":"203.12.160.35"},
{"name":"NTT - JP","lat":35.6895,"lng":139.6917,"server":"210.130.1.1"},
{"name":"Ripe - FR","lat":48.8566,"lng":2.3522,"server":"91.239.100.100"},
{"name":"Ripe - FR 2","lat":48.8566,"lng":2.3522,"server":"91.239.100.101"},
{"name":"OpenNIC - CA","lat":43.65107,"lng":-79.347015,"server":"156.154.70.1"},
{"name":"OpenNIC - CA 2","lat":43.65107,"lng":-79.347015,"server":"156.154.71.1"},
{"name":"Alternate DNS - US","lat":37.3382,"lng":-121.8863,"server":"198.101.242.72"},
{"name":"Freenom - ZA","lat":-26.2053,"lng":28.0491,"server":"196.207.25.25"},
{"name":"Yandex - RU 2","lat":55.7558,"lng":37.6173,"server":"77.88.8.1"},
{"name":"Cloudflare - US 3","lat":40.7128,"lng":-74.0060,"server":"1.1.1.1"}
]