Netcat ist kein spezialisierter HTTP-Client. Das Herstellen einer Verbindung über einen Proxyserver für Netcat bedeutet daher, dass eine TCP-Verbindung über den Server hergestellt wird. Aus diesem Grund wird ein SOCKS- oder HTTPS-Proxy mit dem folgenden -x
Argument erwartet -X
:
-X proxy_protocol
Requests that nc should use the specified protocol when talking
to the proxy server. Supported protocols are “4” (SOCKS v.4),
“5” (SOCKS v.5) and “connect” (HTTPS proxy). If the protocol is
not specified, SOCKS version 5 is used.
connect
Gibt eine Methode zum Erstellen von SSL-Verbindungen (HTTPS) über einen Proxyserver an. Da der Proxy nicht der andere Endpunkt ist und die Verbindung endpunktweise verschlüsselt ist, CONNECT
können Sie mit einer Anforderung eine Punkt-zu-Punkt-Verbindung über einen HTTP-Proxy tunneln (sofern dies zulässig ist). (Ich beschönige hier vielleicht Details, aber es ist sowieso nicht der wichtige Punkt; Details zum " HTTP CONNECT
Tunneln" hier )
Also , auf den Webserver zu verbinden , einen Proxy verwenden, müssen Sie tun , was der Web - Browser tun würde - sprechen Sie mit dem Proxy :
$ nc squid-proxy 3128
GET http://webserver/sample HTTP/1.0
( Diese Frage hat Ähnlichkeiten mit dieser; ich weiß nicht, ob sie proxychain
hier von Nutzen ist. )
Nachtrag
Ein Browser, der einen normalen HTTP-Proxy verwendet, z. B. Squid (wie ich ihn kenne), macht mehr oder weniger das, was das Beispiel zeigt, wie Netcat Ihnen zeigen kann: Nach dem nc
Aufruf habe ich Firefox so konfiguriert, dass 127.0.0.1 Port 8080 als Proxy verwendet wird und versucht, Google zu öffnen, wurde Folgendes ausgegeben (abzüglich eines Cookies):
$ nc -l 8080
GET http://google.com/ HTTP/1.1
Host: google.com
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip, deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
DNT: 1
Proxy-Connection: keep-alive
Auf diese Weise können Sie auch Netcat verwenden, um über den HTTP-Proxy auf einen HTTP-Server zuzugreifen. Was sollte nun passieren, wenn Sie versuchen, auf einen HTTPS-Webserver zuzugreifen? Der Browser sollte den Datenverkehr sicherlich niemandem in der Mitte offenlegen , daher ist eine direkte Verbindung erforderlich. und hier CONNECT
kommt ins Spiel. Wenn ich erneut starte nc -l 8080
und versuche, beispielsweise https://google.com
mit eingestelltem Proxy auf etwas zuzugreifen, 127.0.0.1:80
kommt Folgendes heraus:
CONNECT google.com:443 HTTP/1.1
User-Agent: Mozilla/5.0 (X11; FreeBSD amd64; rv:6.0.2) Gecko/20100101 Firefox/6.0.2
Proxy-Connection: keep-alive
Host: google.com
Sie sehen, die CONNECT
Anforderungen fordern den Server auf, eine direkte Verbindung zum google.com
Port 443
(https) herzustellen . Nun , was macht diese Anforderung?
$ nc -X connect -x 127.0.0.1:8080 google.com 443
Die Ausgabe der nc -l 8080
Instanz:
CONNECT google.com:443 HTTP/1.0
Auf die gleiche Weise wird also eine direkte Verbindung hergestellt. Da dies natürlich für fast alles ausgenutzt werden kann (z. B. mit corkscrew
), sind CONNECT
Anforderungen normalerweise nur auf die offensichtlichen Ports beschränkt.
0.1
, um meine Unwissenheit zu maskieren.:)
nc
und Firefox die Dinge ein wenig?nc squid-proxy 3128
gefolgt vonGET http://webserver/sample HTTP/1.0
einem HTTP / 1.0 403 Forbidden (Zugriff verweigert Fehler).:)
Sie sind hier kein Experte. Sie können wahrscheinlich Ihre eigene Verbindung verwendentcpdump
oder nutzenwireshark
,CONNECT
um Einblicke zu gewinnen ...Schauen Sie sich socat an: http://www.dest-unreach.org/socat/doc/README
quelle
echo "GET /sample HTTP/1.0" | socat PROXY:squid-proxy:web-server:80,proxyport=3128 STDIN
, aber diesen Fehler bekommen :2012/05/17 06:56:23 socat[3135] E CONNECT web-server:80: Forbidden
. Um zu sehen, ob ich dieses Tool richtig verstanden habe, habe ich als nächstes die grundlegende Nicht-Proxy-Verwendung ausprobiert :echo "GET /sample HTTP/1.0" | socat TCP4:web-server:80 STDIN
, aber keine Antwort zurückbekommen! Offensichtlich fehlt mir hier im Socat-Gebrauch etwas. Würde mich freuen, wenn Sie auf meinen Fehler hinweisen könnten.STDIO
(oder,-
) anstelle von verwendeSTDIN
. Aber die Proxy-Version gibt mir immer noch den gleichen Fehler.echo "GET http://web-server/sample" | socat - TCP:squid-proxy:3128
und es hat funktioniert. Würden Sie bestätigen, ob ich dies so verwenden sollsocat
(anstelle derPROXY:...
Adressangabe)?