[Linux] Bequem zwischen Umgebungen mit und ohne Proxy wechseln
-
Hallo Forum.
Ich habe ein Notebook (Linux) das häufig die Netzwerkumgebung
wechselt. In einer Umgebung geht die Internet-Anbindung über einen
Proxy (HTTP und SOCKS) während die andere direkt ist. Ich möchte nun
an genau einer Stelle eine Einstellung ändern, die von allen
Programmen, ohne Neustart, übernommen werden.Das schließt LD_PRELOAD-Lösungen wie tsocks aus, da hier ein Neustart
erforderlich ist.Die Umgebungsvariablen "http_proxy" und "socks_proxy" sind aus dem
selben Grund schlecht.Die Gnome- und KDE-Lösungen sind ebenfalls ungenügend, da sie nur für
Programme gelten, die das entsprechende Toolkit benutzten. Als ich es
bei KDE zum letzten Mal probiert habe war es sogar so, dass man die
gesamte Desktop-Umgebung neustarten musste um die Einstellung wirksam
zu machen.Die Anforderungen verlangen nach einer Firewall-Lösung. Was ich
gefunden habe ist redsocks [1], ein Daemon der lokal auf dem Notebook
läuft und Anfragen über einen eingestellten Proxy leitet. Die Anfragen
werden über iptables-Regeln an redsocks weitergeleitet. Dies
funktioniert auch für SOCKS, jedoch nicht für HTTP. (Der SOCKS-proxy
nimmt keine HTTP-Anfragen an.) Im Prinzip benötige ich nur noch eine
Lösung für HTTP, wobei ich natürlich eine Komplettlösung bevorzuge.Ich kenne mich mit HTTP-Proxies nicht aus, aber soweit ich sehe
(u.a. an wireshark-traces) muss der HTTP-Request an einen Proxy-Server
anders lauten als an einen normalen. Da ich nichts im Browser
umstellen möchte, müsste das ein anderes Programm erledigen.Programme, die unterstützt werden müssen:
- Firefox
- Chromium
- wget
- aptitude
- instant messaging (pidgin/kopete/skype)
- Mail-clients (Thunderbird/mutt/gnus)
-
Also ein Dienst, der erkennt, in welchem Netz er sich befindet, um dann entscheiden zu können, ob er einen HTTP-Request in eine SOCKS-Anfrage wrappt oder ob er direkt den Request absendet, oder? WObei nicht einmal sichersteht, dass es eine HTTP-Geschichte ist, schließlich möchtest du noch IMAP/POP (kann man ja einstellen) und Instant-Masseger (kenne hier die Protokollart nicht) verwenden. Chrome, Firefox und wget verwenden HTTP, Firefox und Chrome außerdem noch FTP und HTTPS (weiß nicht, ob wget das auch schafft, glaub aber nicht).
Leider kenne ich mich nicht gut genug mit SOCKS aus, um dir da richtig weiterhelfen zu können. Mein Ansatz wäre ein eigener Skript-Daemon, der auf einem Port horcht, immer mal wieder rausfindet, in welchem Netzwerk er eigentlich ist, und dann die Anfragen entsprechend weiterleitet. Einen Wrapper, der das für dich macht, brauchst du so oder so auf einem statischen Port und musst dann deine Programme darauf abrichten, ihre Anfragen dorthin zu senden, damit der Daemon dann entscheidet, ob er direkt sendet oder eine SOCKS-Anfrage an den Proxy stellt - den Programmen fehlt die Intelligenz hierzu und sie sind darauf angewiesen, dass ihnen jemand sagt, wohin sie Ihre Anfragen stellen sollen.
Das machst du, indem du ihnen den Port, wo dein Skript lauert, angibst, welches dann entscheidet, was es mit den Anfragen macht.Kann sein, dass dies völlig unpraktikabel ist, aber das wäre so die Richtung, die ich einschlagen würde.
-
Hallo Forum!
Der aus dem Westen .. schrieb:
Also ein Dienst, der erkennt, in welchem Netz er sich befindet, um dann entscheiden zu können, ob er einen HTTP-Request in eine SOCKS-Anfrage wrappt oder ob er direkt den Request absendet, oder? WObei nicht einmal sichersteht, dass es eine HTTP-Geschichte ist, schließlich möchtest du noch IMAP/POP (kann man ja einstellen) und Instant-Masseger (kenne hier die Protokollart nicht) verwenden. Chrome, Firefox und wget verwenden HTTP, Firefox und Chrome außerdem noch FTP und HTTPS (weiß nicht, ob wget das auch schafft, glaub aber nicht).
Mein Vorhaben ist sogar einfacher: Ich führe selbst ein Skript aus, oder ändere anderweitig eine Konfiguration, wenn ich das Netz wechsele. Es muss nur genau eine Aktion sein, nicht ein Umschalten in jedem Programm. Das ganze könnte man dann relativ einfach automatisieren, da man an der vergebenen IP sein Netz erkennen kann und es genug stellen gibt, an denen man diese Abfrage automatisch ausführen lassen kann.
Wie ich geschrieben habe ist auch nur HTTP das Problem: Andere TCP-Verbindungen gehen mit Hilfe von redsocks konfigurationsfrei über den SOCKS-Proxy (in der ge-Proxy-ten Umgebung).
Ich habe dafür aber nun eine Lösung gefunden: Ein lokal installierter squid [2] leitet alle anfragen an den externen Proxy-Server weiter. Aus einem Grund den ich nicht verstehe kann man an diesen der Firewall Pakete problemlos weiterleiten. Damit muss die lokale, HTTP-benutzende Anwendung nichts von einem Proxy wissen.
---
So werden Anfragen an Port 80 von allen Benutzern außer "proxy"
(unter dem squid läuft) an selbigen weitergeleitet, auf den standard-squid-port 3128:iptables -t nat -A OUTPUT -m tcp -p tcp --dport 80 -m owner --uid-owner proxy -j RETURN iptables -t nat -A OUTPUT -m tcp -p tcp --dport 80 -j REDIRECT --to-ports 3128
Und so werden alle anderen TCP-Anfragen geSOCKSt:
# Create new chain iptables -t nat -N REDSOCKS # Ignore LANs and some other reserved addresses. iptables -t nat -A REDSOCKS -d 0.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 10.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN iptables -t nat -A REDSOCKS -d 169.254.0.0/16 -j RETURN iptables -t nat -A REDSOCKS -d 172.16.0.0/12 -j RETURN iptables -t nat -A REDSOCKS -d 192.168.0.0/16 -j RETURN iptables -t nat -A REDSOCKS -d 224.0.0.0/4 -j RETURN iptables -t nat -A REDSOCKS -d 240.0.0.0/4 -j RETURN # MY network iptables -t nat -A REDSOCKS -d $MY_NETWORK/16 -j RETURN # Anything else should be redirected to port 12345 (redsocks) iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports 12345 iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
---