www.fabiankeil.de/blog-surrogat/2006/03/27/privoxy-tor-dns-problem-behoben.html
Gestern bin ich dem Problem nachgegangen, warum Privoxy bei der
DNS-Auflösung so häufig 404
er liefert.
Durch einen Wechsel des Aufenthaltsraum meines Laptops hat die Funkverbindung hier
stark nachgelassen: die letzten Tage habe ich mehr 404
er gesehen als mir lieb war.
Ich nutzte seit einiger Zeit einen lokal laufenden DNS-Server,
es handelte sich nicht um die vom Tor-Netzwerk verursachten Timeouts, die früher auftraten, wenn Privoxy und
Tor über socks4a
kommunizierten und der DNS-Verkehr
anonymisiert abgewickelt wurde. Siehe dazu auch die Ergänzung am Seitenende.
Firefox hat weiter Öl ins Feuer gegossen und die DNS-Fehler fröhlich gecacht.
Das läuft dann im Fehlerfall so:
404 No such domain
.If-Modified-Since
-Header und gibt den Zeitpunkt der Fehlermeldung
als Zeit an.If-Modified-Since
-Header aus und stellt fest,
dass das angeforderte Dokument älter als die Zeitangabe ist.304 Not Modified
.304
er an Firefox weiter.
Handelt es sich bei dem Dokument um eine Webseite kann der erfahrene Benutzer
Strg
+F5
drücken, Firefox lässt darauf hin
den If-Modified-Since
-Header weg, der Server liefert das komplette Dokument aus.
Handelt es sich bei dem Dokument um einen Feed, hat der Benutzer Pech gehabt: der Menüpunkt
Reload Live Bookmark
führt ebenfalls nur zu einer Abfrage mit If-Modified-Since
-Header.
Um den Feed erfolgreich zu laden muss der Benutzer entweder den Cache leeren, oder die Adresse kopieren,
den Feed als Webseite aufrufen, Privoxys Fehlermeldung aus dem Cache geliefert bekommen,
Strg
+F5
drücken und erneut
Reload Live Bookmark
klicken.
Macht keinen Spass.
Meine erste Idee war, die DNS-Fehlermeldung nicht mehr mit
Status Code 404
, sondern mit 504
auszuliefern. Der entsprechende
Patch gegen
cgi.c
war schnell geschrieben und hat Firefox das Cachen der
DNS-Fehlermeldung abgewöhnt, das eigentliche Timeout-Problem
jedoch nicht beseitigt.
Darüber hinaus gibt es ein paar andere DNS-Fehler,
deren Auslieferung als 504
er unzulässig ist, beispielsweise NO_ADDRESS
,
wenn die Domain tatsächlich nicht existiert.
Am einfachsten ist es daher, im Falle eines Timeouts eine erneute DNS-Abfrage zu starten und den Nutzer gar nicht erst mit einer Fehlermeldung zu nerven.
gethostbyname(3)
aus der Standard-C-Bibliothek bringt die Variable h_error
bereits mit, man muss sie nur noch auswerten und reagieren. Dafür sorgt dieser
Patch gegen jbsockets.c
.
Der Patch sollte auf allen Betriebssystemen funktionieren die gethostbyname(3)
benutzen,
getestet habe ich ihn nur unter FreeBSD. Bei manchen Betriebssystemen nutzt Privoxy andere
gethostbyname-Varianten (siehe #if defined
-Gewusel in jbsockets.c
),
dort müsste der Patch angepasst werden.
FreeBSD-Nutzer müssen den Patch nur noch nach ${PORTSDIR}/www/privoxy/files
kopieren,
beim anschließenden make install clean
wird er automatisch angewandt.
Der Rest der Welt kann den Betriebssystem-Wechsel erwägen oder den Privoxy-Handbuch-Abschnitt
2.2. Building from Source
befolgen und zwischen den Schritten ./configure
und make
den Patch mit:
patch < patch-jbsockets.c
anwenden.
Die erste Fassung dieser Seite trug noch den Namen
Privoxy-Tor-DNS-Problem behoben
.
Kurz nach dem ich die gepatchte Privoxy-Version installierte habe ich die Verbindung zu Tor auf socks4a
umgestellt und keine durch Timeouts verursachten DNS-Fehler mehr gesehen.
Meine Annahme war daher, der zweite Patch würde auch DNS-Probleme durch Tor-Timeouts beseitigen. Wie mir später einfiel wird gethostbyname für socks4a aber gar nicht genutzt, mein Erfolg mit socks4a wird an Verbesserungen in Tor selbst liegen, der zweite Patch hatte jedenfalls nichts damit zu tun.
Die Aussage Privoxy-Tor-DNS-Problem behoben
wird dadurch
nicht falsch, den Artikel habe ich dennoch überarbeitet, da mein zweiter Patch nur ein anderes
Privoxy-DNS-Problem beseitigt.
Wer mit Privoxy DNS über Tor nutzen möchte kann sich das Patchen sparen und einfach eine aktuelle Tor-Version installieren. Momentan nutze ich tor-devel-0.1.1.13, die vor ein paar Monaten wahrgenommenen DNS-Probleme sind so gut wie verschwunden.
socks4a
Mittlerweile habe ich einen dritten Patch
für socks4a
-Verbindungen
geschrieben, der auch DNS-Timeout-Probleme entschärft.
Da ich keinen Weg gefunden habe, wie (und ob) man
DNS-Probleme über socks4a
unterscheiden kann,
wird es auch dann neu versucht, wenn die Domain gar nicht existiert, oder der Tor-Ausgangsserver aus
einem anderen Grund EINVAL
meldet.
Die Patche auf dieser Seite sind veraltet, der Sammelpatch enthält aktualisierte Fassungen. Weitere Auswirkungen des Patches sind zusammen mit Hinweisen zur Installation auf der Seite Minor Privoxy improvements aufgeführt.