Page 1 of 1

Socket-Verbindung durch Proxy hindurch

Posted: 30. Apr 2008 12:51
by ElBlues
So, nach dem Google mir auf die entsprechenden Suchstichworte nur erklären mag, wie ein Proxy funktioniert, hier mal meine eigentliche Frage, vielleicht hat ja jemand einen Link.

Wie normale Netzwerkverbindungen mittels socket(), connect(), send() und recv() funktionieren ist mir klar. Nur gibt es jetzt auch den Fall, dass jemand hinter einer Firewall sitzt und nach draußen möchte. Diverse Applikationen kriegen das mit angabe der Proxy-IP und -Portnummer sowie möglicherweise auch einem Passwort hin. Nur: was steckt dahinter? Wie wird das auf Codeebene gelöst, sprich was muss ich tun um ein connect() von so einem Proxy akzeptiert zu bekommen?

Posted: 30. Apr 2008 19:20
by Janka
Entweder muss das Protokoll explizit Proxies unterstützen, das ist zum Beispiel bei HTTP oder FTP der Fall. In diesem Fall wird z.B. die HTTP-Anfrage nicht direkt an den Server geschickt, den man in der URL genannt hat, sondern stattdessen an den Proxy. Der guckt in den Request-Header der Anfrage rein, dort steht die "echte" URL drin, und diese Seite fordert er dann an und liefert sie kurz darauf an den fragenden Rechner aus. Mit einem statusbehafteten Protokoll wie FTP ist es etwas komplizierter, funzt im Prinzip aber genauso.

Dann gibt es noch den Fall des "transparenten Proxies". In diesem Fall braucht man Kernel-Unterstützung, bei Linux ist das netfilter. Dieser fängt Pakete, die nach draußen gehen ab und leitet sie an den Proxy-Server, der transparentes Proxiing unterstützen muss, weiter. Dieser erkennt anhand der IP-Adresse (DNS ist zu diesem Zeitpunkt schon aufgelöst worden), dass er ein Paket bekommen hat, das für einen Internet-Host gedacht ist. Er fragt nun diesen Internet-Host bei z.B. HTTP nach der Seite, die im Paket drin steht. Diese liefert der Internet-Server an den Proxy zurück, dieser liefert sie an den netfilter zurück. Der erkennt, dass das Paket zu einer Verbindung zum Proxyserver kommt und schreibt die Quell-Adresse so um, dass es aussieht, als käme das Paket direkt vom Internet-Server. Damit ist das Proxiing von außen nicht zu erkennen.

Janka

Posted: 02. May 2008 9:53
by ElBlues
Ah, so weit so klar. Und wie sieht das mit den SOCKS-Proxies aus, gehören die in die Exke der transparenten Proxies?

Posted: 02. May 2008 20:37
by Janka
SOCKS ist ein Proxy-System unterhalb der Protokollebene von HTTP, FTP etc.. Man kann es als Library in einen Client, z.B. einen Browser einbauen, dann kann der die Protokolle, die er beherrscht, über SOCKS statt direkt über TCP schicken.

Für Programme, die die SOCKS-Library nicht eingebaut haben, gibt es zum Beispiel "tsocks", das sich per LD_PRELOAD in die socket()-Aufrufe etc. einhängt und so die SOCKS-Funktionalität nachrüstet.

Janka