DNS beschleunigen
Aus Gentoo Linux Wiki
| Terminals / Shells • X • Portage • System • Dateisysteme • Kernel • Netzwerk• Sonstiges • alphabetischer Tipp Index |
Um später einen wirklichen Eindruck des Geschwindigkeitsvorteils zu haben, empfehle ich, jetzt sofort als erstes im Konqueror noch gmx.de anzusurfen.
Inhaltsverzeichnis |
[Bearbeiten] Das Dilemma
Konqueror schickt viele DNS Anfragen, wenn man z.B. GMX ansurft:
12 11/27 21:33:04| qc=IN (1), qt=A (1), query="www.gmx.de." 13 11/27 21:33:04| qc=IN (1), qt=A (1), query="www.gmx.net." 14 11/27 21:33:05| qc=IN (1), qt=A (1), query="gmx.ivwbox.de." 15 11/27 21:33:05| qc=IN (1), qt=A (1), query="www.gmx.net." 16 11/27 21:33:05| qc=IN (1), qt=A (1), query="www.gmx.net." 18 11/27 21:33:05| qc=IN (1), qt=A (1), query="service.gmx.net." 19 11/27 21:33:05| qc=IN (1), qt=A (1), query="gmx.ivwbox.de." 20 11/27 21:33:05| qc=IN (1), qt=A (1), query="images.gmx.net."
Der Roundrip einer DNS-Anfrage dauert ca. 70ms.
Konqueror hat keinen internen DNS-Cache, weshalb für jedes der 100 Bilder auf der Hauptseite von GMX eine DNS-Anfrage gestartet wird. Ein Billig-DSL-Router cached die DNS-Anfragen auch nicht richtig. Folge: Die Seite lädt langsam.
[Bearbeiten] Die Lösung: pdnsd
pdnsd stellt einen Proxy für DNS Abfragen dar. Er ist klein und schnell und da es kein vollständiger DNS Server ist, benötigt er wenig Ressourcen.
Zuerst einmal pdnsd emergen:
emerge -av pdnsd
[Bearbeiten] Konfigurieren
Zum Konfigurieren von pdnsd benutzt man am besten die "pdnsd.conf.sample" Beispielkonfiguration und passt sie eventuell noch etwas an, sie liegt in '/etc/pdnsd/'.
cd /etc/pdnsd/ cp pdnsd.conf.sample pdnsd.conf nano -w pdnsd.conf
Angepasst werden muss haupsächlich die IP des zu verwendenden DNS Servers. Ausserdem nach eigenem Belieben die Grösse des Caches. Für genauere Informationen, was die einzelnen Parameter bedeuten, siehe 'man pdnsd.conf'. Meine pdnsd.conf sieht z.B. folgendermaßen aus:
global {
perm_cache=2048; # Cachegröße in kB.
cache_dir="/var/cache/pdnsd";
run_as="pdnsd";
server_ip = 127.0.0.1;
status_ctl = on;
paranoid=on;
min_ttl=900; # Behalte Cacheeinträge für mindestens 15 Minuten.
max_ttl=604800; # Behalte Cacheeinträge für maximal eine Woche.
timeout=10;
}
server {
label= "myisp";
ip = 192.168.0.1; # Hier die IP des Routers eingeben.
proxy_only=on;
timeout=4;
uptest=if;
interface=eth0;
interval=600;
purge_cache=off;
}
Eine einfachere (hier ganz gut funktionierende) Konfiguration wäre z. B.:
global {
run_as = "pdnsd";
status_ctl = on;
paranoid = on;
}
server {
ip = 192.168.178.1; # Die IP des Routers
timeout = 5;
}
Anschließend ist noch die Datei '/etc/resolv.conf' zu editieren, damit in Zukunft nur noch pdnsd für DNS-Abfragen verwendet wird. Hier tragt ihr einfach 'localhost' als Nameserver ein:
#/etc/resolv.conf domain localdomain nameserver localhost
[Bearbeiten] Starten & Testen
Nun muss man noch pdnsd starten. Mit
/etc/init.d/pdnsd start
sollte pdnsd gestartet werden. Erhaltet ihr eine Fehlermeldung, ist aller Wahrscheinlichkeit nach ein Fehler in der Konfigurationsdatei. Mit einem
ping www.google.de
seht ihr, ob der Cache funktioniert. Wenn alles klappt, pdnsd noch über rc-update aktivieren, damit es bei jedem Start automatisch gestartet wird:
rc-update add pdnsd default
Fertig! Jetzt starte den Konqueror und surfe nochmal zu gmx.de
[Bearbeiten] Zusammenarbeit mit Gnome NetworkManager
Da der NetworkManager leider bei jeder Aktivierung eines Links die /etc/resolv.conf überschreibt und mit einem funktionierenden DNS-Server füllt wird hier der PDNSd umgangen. Abhilfe schafft hier der NetworkManagerDispatcher (der bei Gentoo nicht standardmäßig mitgestartet wird) und bei der Aktivierung eines Links durch den NetworkManager Scripts im Verzeichniss /etc/NetworkManager/dispatcher.d ausführt.
[Bearbeiten] Vorbereiten des NetworkManagerDispatcher
Zunächst muss der NetworkManagerDispatcher in unser Runlevel aufgenommen werden. Dies geschieht entweder durch Anpassen des init-Scripts für den NetworkManager (einfacher, aber nicht upgrade-sicher) oder durch ein manuell angelegtes Script.
Für die erste Methode reicht ein Blick in die /etc/init.d/NetworkManager und das Kopieren und Anpassen der Zeilen mit start-stop-daemon, der Pfad zur Executable lautet im Standardfall /sbin/NetworkManagerDispatcher.
Für die zweite Methode müssen wir zunächst per
touch /etc/init.d/NetworkManagerDispatcher
als root ein neues Script anlegen, dessen Inhalt wie folgt aussieht:
#!/sbin/runscript
#
# NetworkManagerDispatcher: NetworkManagerDispatcher daemon
#
# chkconfig: 345 98 02
# description: This is a daemon for automatically executing \
# scripts on link up/down by NetworkManager.
#
# processname: NetworkManagerDispatcher
# pidfile: /var/run/NetworkManagerDispatcher.pid
#
### BEGIN INIT INFO
# Provides: $network
### END INIT INFO
prefix=/usr
exec_prefix=/usr
sbindir=${exec_prefix}/sbin
NETWORKMANAGERDISPATCHER_BIN=${sbindir}/NetworkManagerDispatcher
# Sanity checks.
[ -x $NETWORKMANAGERDISPATCHER_BIN ] || exit 0
# We need /sbin/ip
[ -x /sbin/ip ] || exit 0
# so we can rearrange this easily
processname=$NETWORKMANAGERDISPATCHER_BIN
pidfile=/var/run/NetworkManagerDispatcher.pid
depend() {
need NetworkManager
}
start()
{
if [ -e ${pidfile} ]; then
rm -f ${pidfile}
fi
ebegin "Starting NetworkManagerDispatcher"
start-stop-daemon --start --quiet --exec ${processname}
eend $?
echo $(/bin/pidof NetworkManagerDispatcher) > ${pidfile}
}
stop()
{
ebegin "Stopping NetworkManagerDispatcher"
start-stop-daemon --stop --quiet --exec ${processname} --pidfile ${pidfile}
eend $?
if [ -e ${pidfile} ]; then
rm -f $pidfile
fi
}
Speichern, starten, wenn alles klappt zum Runlevel hinzufügen.
Als Letztes brauchen wir noch das eigentliche Script, das vom Dispatcher ausgeführt wird. Also
$EDITOR /etc/NetworkManager/dispatcher.d/resolv-NetworkManager
und als Inhalt:
#!/bin/sh
case "$2" in
up)
cp /etc/resolv.conf /etc/resolv.conf.NetworkManager
cp /etc/resolv.conf.localhost /etc/resolv.conf
pdnsd-ctl config
exit 0
;;
down)
cp /etc/resolv.conf.NetworkManager /etc/resolv.conf
exit 0
;;
esac
Die Datei /etc/resolv.conf.localhost ist hierbei exakt die resolv.conf, die laut der Anleitung weiter oben als nameserver localhost definiert haben sollte. Das Script wird jetzt bei jedem Link up (also jedem Update der resolv.conf durch den NetworkManager) die gültige resolv.conf kopieren und durch unsere loopback-Variante ersetzen. Bei einem Link down wird die original resolv.conf zurück kopiert. Dadurch wird sichergestellt, das der pdnsd beim erneuten Link up, gültige Nameserver vorfindet.
Danach noch ein:
chmod 755 /etc/NetworkManager/dispatcher.d/resolv-NetworkManager
um das Skript ausführbar zu machen.
[Bearbeiten] Anpassen des PDNSd
Richtet man den PDNSd jetzt so ein, dass er resolv.conf.NetworkManager als Quelle für seinen DNS-Server benutzt wars das auch schon - $EDITOR /etc/pdnsd/pdnsd.conf und im Abschnitt "Server" folgendes einfügen (und eventuelle Zeilen mit "ip" auskommentieren!):
file = "/etc/resolv.conf.NetworkManager";
Kabel raus, Kabel rein, testen obs noch geht.
