[Socket]TCP/IP-Verbindung über Proxy



  • Hallo c-community,

    ich beschäftige mich gerade ein wenig mit Client- und Serververbindungen über einen Proxy. Das Socket öffnen und das Verbinden über connect zum Proxy ist kein Problem. Auch das laden einer Webseite mit:

    GET http://www.testseite.de HTTP/1.0\r\nConnection: close\r\n\r\n
    

    Jetzt habe ich probiert meinen TCP-Client mit meinem TCP-Server zu verbinden. Anscheinend funktioniert das bisher noch nicht. Deswegen habe ich mal folgende Fragen:
    1.) Es gibt ja anscheinend unterschiedliche Proxy-Server (HTTP, HTTPS, SOCK5, ...). Kann man eine solche Verbindung mit allen Proxy-Servern aufbauen oder muss ich eine speziellen Typ von Proxy-Servern verwenden?

    2.)Welches Kommando muss ich verwenden, um den Proxy anzuweisen, sich mit meinem Server zu verbinden?

    Vielen Dank
    mirrowwinger



  • Ad 1)

    Als HTTPS Proxy wird ein HTTP Proxy bezeichnet welcher das CONNECT Verb erlaubt.
    Und über einem solchen kannst du beliebige TCP Connections herstellen.
    Über einem SOCKS Proxy geht es ebenso. Wobei ein SOCKS Proxy ein ganz anderes Tier ist, und auch ganz anders angesprochen werden möchte.

    Ad 2)

    Hängt vom Proxy Protokoll ab. Bei HTTP heisst der Befehl wie oben schon erwähnt "CONNECT": http://en.wikipedia.org/wiki/HTTP_tunnel#HTTP_CONNECT_Tunneling
    Wie es mit SOCKS geht liest du am besten im SOCKS Standard nach.

    Und grundsätzlich kann natürlich jeder Proxy blocken was er gerne blocken möchte. So gibt es z.B. viele HTTP Proxies die CONNECT unterstützen, aber als Destination Port nur 443 (HTTPS) erlauben.



  • Danke @hustbaer.

    Für das bessere Verständnis habe ich noch 1 Frage zu der Verbindung mit Sock4/5 am Beispiel eines Sock4-Proxies.
    Gemäß Quelle (http://de.wikipedia.org/wiki/SOCKS) soll ich von meinem Client an den Sock4-Server folgenden Befehl schicken, um eine Verbindung zu meinem Serverprogramm zu bekommen:

    /*
     *  Annahmen:
     *        IP-Adresse: 100.101.102.103 (Server)
     *        Port:       60000
     *
     *  Befehl vom Client:    "4 1 60000 100 101 102 103 0" je Stelle 1Byte (nur Port 2 Byte, 60000 in 2 byte = ea60)
     */
    
    char string[] = "\x04\x01\xea\x60\x64\x65\x66\x67\x00"; // Befehl sich mit dem Server zu verbinden
    

    Ist dieser String so richtig?

    Mit freundlichem Gruß
    mirrowwinger



  • Sieht OK aus, habs aber nur kurz überflogen.
    Ich hab' mit SOCKS ehrlich gesagt noch nie was gemacht...

    Wobei ich es vermutlich gleich so schreiben würde dass man die IP und den Port direkt hinschreiben kann, und die Funktion sich den String dann entsprechend zusammenstoppelt.



  • Leider klappt es so noch nicht.

    Kurze erklärung zum Vorgehen (vieleicht liegt hier ja der Fehler oder ich habe etwas vergessen):

    im Client:
    1.) einen Socket auf machen
    2.) mit dem Sock4-Server per connect() verbinden (erfolgreich!)
    3.) dem Sock4-Server per send() anweisen sich mit meinem Client zu verbinden (Senden funktioniert auch, habe ich mit einem HTTP-Server getestet.) Dazu wird der string = "\x04\x01\xea\x60\x64\x65\x66\x67\x00" (wobei IP und Port meinen Server-Eigenschaften entsprechen) gesendet.

    Leider zeigt mir weder der Client noch der Server an, dass eine Verbindung erfolgreich aufgebaut wurde.



  • Also habe mich jetzt den ganzen gestrigen Abend mit Socks4 und Socks5 beschäfftigt. Habe nach folgenden 2 Quellen (Quelle 1 (Socks4):http://ftp.icm.edu.pl/packages/socks/socks4/SOCKS4.protocol; Quelle 2 (Socks5): http://www.ietf.org/rfc/rfc1928.txt) Packete erstellt und verschickt. Ich habe mich seperat mit allen verwendeten Proxies verbunden, um zu testen, dass sie funktionieren. Wenn ich egal an Socks4 oder Socks5 Packete (Verbindungsanfragen für meinen Server) schicke bekomme ich nie auch nur eine Antwort. Mein Zielserver registriert auch keinen Client der sich verbindet.

    Wie gesagt bei den sockets mit verbinden, Verbindung annehmen und der Kommunikation über die Verbindung bin ich mir sicher, dass sie funktionieren! Es muss also ein Fehler bei dem Erstellen der Verbindungsanforderung am Socks4/5 liegen.
    Die Packeterstellung habe ich in meinen 2 letzten Beiträgen schon dargestellt.

    Hat jemand hierin Erfahrung und sieht den Fehler, den ich mache?

    Vielen Dank
    mirrowwinger





  • Den einzigen Unterschied den ich finden konnte, war dass der Autor ein zusätzliches "\n" an seinen Befehl angehängt hat.

    Mit dem angehängten "\n" bekomme ich auch eine Antwort, die 9 lautet.


Anmelden zum Antworten