www.fabiankeil.de/blog-surrogat/2006/03/27/privoxy-tor-dns-problem-behoben.html

Privoxy-DNS-Probleme behoben

Gestern bin ich dem Problem nachgegangen, warum Privoxy bei der DNS-Auflösung so häufig 404er liefert. Durch einen Wechsel des Aufenthaltsraum meines Laptops hat die Funkverbindung hier stark nachgelassen: die letzten Tage habe ich mehr 404er 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.

Gesteigertes Leiden Dank Firefox

Firefox hat weiter Öl ins Feuer gegossen und die DNS-Fehler fröhlich gecacht.

Das läuft dann im Fehlerfall so:

  1. Benutzer fordert ein Dokument an.
  2. Firefox gibt Anfrage an Privoxy weiter.
  3. Privoxy versucht die Domain in eine IP-Adresse zu wandeln.
  4. Privoxy bekommt einen DNS-Timeout.
  5. Privoxy gibt generischen DNS-Fehler an Firefox weiter. Status Code 404 No such domain.
  6. Firefox zeigt Fehlermeldung an.
  7. Benutzer versucht es erneut.
  8. Firefox setzt If-Modified-Since-Header und gibt den Zeitpunkt der Fehlermeldung als Zeit an.
  9. Privoxy versucht die Domain in eine IP-Adresse zu wandeln.
  10. Der Nameserver war inzwischen erfolgreich – Privoxy bekommt eine IP-Adresse zurück.
  11. Privoxy filtert Firefox' Anforderung und gibt sie an den Webserver weiter.
  12. Webserver wertet den If-Modified-Since-Header aus und stellt fest, dass das angeforderte Dokument älter als die Zeitangabe ist.
  13. Webserver liefert 304 Not Modified.
  14. Privoxy gibt 304er an Firefox weiter.
  15. Firefox zeigt erfreut die alte Fehlermeldung aus dem Cache an.
  16. Benutzer beißt in die Tischkannte.

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.

Problem erkannt, Problem gebannt

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 504er 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.

Installations-Anleitung

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.

Erste Ergänzung

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.

Zweite Ergänzung: Holzhammer-Patch für 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.

Letzte Ergänzung

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.