DNS beschleunigen

Aus Gentoo Linux Wiki

Wechseln zu: Navigation, Suche
Dieser Artikel ist Teil der TIPPs & Tricks Sammlung.
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.


[Bearbeiten] Weblinks

Die Nörgler :-P

'Persönliche Werkzeuge