Woher wissen Webserver, ob Sie direkten IP-Adresszugriff verwenden?

64

Einige Webserver geben beim Zugriff über ihre IP-Adresse den Fehler zurück, dass der direkte Zugriff auf die IP-Adresse nicht zulässig ist.

Ich habe mich schon seit einiger Zeit gefragt, wie das funktioniert. Ich meine, löst der Browser die IP-Adresse nicht immer auf und stellt eine Verbindung her? Überspringt "Direkter IP-Adresszugriff" nicht einfach DNS? Woher weiß der Remote-Server überhaupt, dass Sie DNS übersprungen haben?

Joseph A.
quelle
2
Wie ich mich erinnere, wurde das , wonach er wirklich gefragt hat , sehr früh zum http-Protokoll hinzugefügt, um virtuelle Server auf demselben realen Host bereitzustellen.
JDługosz
3
Es ist im Grunde derselbe Prozess, mit dem ein einzelner Server zwischen verschiedenen virtuellen Hosts unterscheiden kann. Der reale Server ordnet eine URL einem seiner virtuellen Hosts zu. Viele Server verfügen weder standardmäßig noch standardmäßig über einen Fallback für eine nicht zugeordnete URL.
Manngo
Sie können DNS überspringen, aber diesen Fehler vermeiden, wenn Sie in Ihrer Hosts-Datei einen Eintrag für den betreffenden Domainnamen erstellen. Ihr Browser sucht nach dem Domain-Namen und fügt ihn in den Host: -Header ein. Aufgrund des Host-Dateieintrags wird jedoch keine DNS-Abfrage durchgeführt.
Monty Harder
Die Antwort auf diese Art von Fragen lautet normalerweise, weil Sie es ihnen gesagt haben .
Thomas

Antworten:

91

Um Ihre Frage zu beantworten, wie es weiß , hat es damit zu tun, was Ihr Browser an den Server sendet.

Sie haben Recht, dass das System es immer in eine IP-Adresse auflöst, aber der Browser sendet die URL, auf die Sie zugreifen wollten, im HTTP-Header.

Hier ist ein Beispiel-Header, den ich online gefunden habe und der so geändert wurde, dass er aussieht, als hätten Sie Firefox unter Windows verwendet und apple.comin die Adressleiste eingegeben :

GET / HTTP/1.1
Host: apple.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
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
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

So würde der Header aussehen, wenn Sie seine IP-Adresse verwenden:

GET / HTTP/1.1
Host: 17.142.160.59
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko/20091102 Firefox/3.5.5 (.NET CLR 3.5.30729)
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
Keep-Alive: 300
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache

Beide werden über einen Socket an dieselbe IP-Adresse gesendet, aber der Browser teilt dem Server mit, auf was zugegriffen wurde.

Warum? Da Webserver mit derselben IP-Adresse möglicherweise mehrere Sites hosten und für jede unterschiedliche Seiten bereitstellen. Es kann nicht unterscheiden, wer welche Seite anhand der IP-Adresse haben möchte, da alle dieselbe Seite haben - es kann sie jedoch anhand des HTTP-Headers unterscheiden.

iAdjunct
quelle
7
Ahh, macht jetzt viel mehr Sinn! Grundsätzlich sendet der Browser TO an die IP den Header entweder mit der IP oder der Domain, und die Site geht davon aus. Also wirklich, diese Einschränkungen sind leicht zu umgehen?
Joseph A.
7
Es ist nicht so, dass Sie eine Einschränkung umgehen, sondern nur, dass Sie keinen Ball spielen und seltsame Ergebnisse erzielen.
iAdjunct
Diese HTTP-Anforderungen erhalten Sie, wenn Sie einen Proxy verwenden. Ohne Proxy werden die Informationen in der hostKopfzeile angezeigt. Siehe dieses Beispiel .
0xFE
2
bytec0de: Das andere Teil davon ist, dass Webserverkonfigurationen häufig basierend auf dem Hostnamen eingerichtet werden. Das IP-Paket gibt die IP-Adresse an, das TCP-Segment die Portnummer und der HTTP-Header den Hostnamen. Daher werden Server normalerweise so konfiguriert, dass sie sagen: "Wenn der Client / Browser nach example.com fragt, geben Sie ihnen dies." Sie können so eingerichtet werden, dass sie auch auf IP-Adressen oder Platzhalter reagieren (auf alles reagieren). Viele Benutzer kopieren jedoch nur Beispiele, und viele bereits vorhandene Beispiele basieren auf dem vom Browser angegebenen Domänennamen.
TOOGAM
14
@ bytec0de Es ist keine Einschränkung . Es ist eher so, als ob Sie die richtige Telefonnummer verwenden, aber die falsche Nebenstelle - Sie haben das richtige Gebäude angerufen, aber nicht die richtige Person. Der Grund für die Einführung ist derselbe wie bei Telefonen: Sie können mehrere separate Sites auf derselben IP-Adresse (und demselben TCP-Port) hosten. Beispielsweise hat unser Entwicklungsserver Hunderte verschiedener Websites gleichzeitig gehostet, und viele Webhosting-Lösungen verwenden denselben Ansatz ("Domain registrieren, auf unsere IP-Adresse verweisen, wir kümmern uns um den Rest"). .
Luaan
21

Mit dem HTTP 1.1-Protokoll (die frühere HTTP 1.0-Version ist seit geraumer Zeit veraltet und wird daher wahrscheinlich nicht von einer neueren Version eines Browsers verwendet) wurde der hostHeader eingeführt. Für HTTP 1.1 ist dies eine erforderliche Kopfzeile, die von einem Browser ausgegeben werden muss . Der Domainname wird vom Browser in diese Zeile eingefügt, z Host: example.com. Der Webserver weiß also, auf welche Website der Browser von dieser Leitung aus zugreifen möchte. Da ein Webserver möglicherweise Dutzende von Websites unterstützt, ist diese Zeile wichtig, um festzustellen, auf welcher Website sich die angeforderte Seite befindet. Angenommen, der Browser möchte auf die Homepage einer Site auf example.com zugreifen. Er gibt die folgende Zeile an den Server aus, wenn eine Verbindung zum Server hergestellt wird:

GET / HTTP/1.1

Diese Zeile gibt an, für welchen Browser das Stammdokument abgerufen werden soll, dh "/" für die Website. Wenn Sie zugreifen wollten /somedir/testpage.html, GET /somedir/testpage.htmlwäre in der "get" -Zeile. Der Zeile folgt die folgende Zeile:

Host: example.com

Wenn der Webserver also die Webseiten example.com, someothersite.com, yetanothersite.org usw. unterstützt, weiß er, dass er die Hauptseite für example.com zurückgeben sollte. Wenn diese Zeile nicht angezeigt wird oder kein Domain-Name in der HostZeile aufgeführt ist, weiß das Programm nicht, welche Homepage der Website zurückgegeben werden soll. Daher wird möglicherweise stattdessen eine Fehlermeldung oder die Homepage einer "Standard" -Site für den Server zurückgegeben.

Sie können dieselben Befehle eingeben, die ein Browser unter Verwendung des Telnet- Protokolls ausgibt , z. B. telnet example.com 80über eine Linux-Shell-Eingabeaufforderung oder ein Apple OS X- Terminalfenster , um eine Verbindung zum Standard-HTTP-Port 80 herzustellen. Schritte hierzu finden Sie unter Testen des Zugriffs auf eine Website mit PuTTY dazu mit PuTTY auf einem Windows-System.

Mondpunkt
quelle
3
Nur eine Anmerkung: Der Host-Header wurde auch in HTTP 1.0 verwendet, er wurde nur nicht benötigt . HTTP 1.1 hat das Feld obligatorisch gemacht. In der Praxis haben viele HTTP 1.0-Server einfach nicht funktioniert, wenn der Browser den Host-Header nicht gesendet hat (aus den oben genannten Gründen). Die meisten Browser haben ihn also trotzdem gesendet.
Luaan
6

Dies liegt am Host:HTTP-Header. Dies ist sehr nützlich, um mehrere Websites unter derselben IP-Adresse zu hosten. Beispielsweise haben http://www.k7dxs.net/ und http://www.philipgrimes.com/ dieselbe IP-Adresse. Aufgrund des Host:Headers können sie jedoch zwei verschiedene Sites anzeigen.

Bei HTTPS wird, wie @Toothbrush betont hat, die TLS-Servername-Angabe verwendet, da der Host-Header Teil der verschlüsselten Anforderung ist und der Server nicht weiß, welches Zertifikat ohne diese Angabe angeboten werden soll.

Unterhaltsames Experiment: Holen Sie sich Manipulationsdaten für Firefox (für Chrome konnte ich keine Entsprechung finden) und beginnen Sie mit Manipulationen. Öffnen Sie http://slipstation.com/ und bearbeiten Sie den Host:Header in der Anforderung, http://www.zombo.com/ zu sein . Sie sehen eine möglicherweise vertraute Website, auf der alles möglich ist.

Duncan X Simpson
quelle
Tatsächlich verwenden diese Sites die Angabe des Servernamens . Es gibt keine Möglichkeit, die anzuzeigende Site zu bestimmen, wenn beide Sites über HTTPS ohne SNI auf demselben Server gehostet werden, da der Server nicht weiß, welches Zertifikat verwendet werden soll.
Zahnbürste
Oh, interessant. Funktioniert mein Experiment noch?
Duncan X Simpson
Ja, wenn Sie zwei Sites finden, die über HTTP unter derselben IP-Adresse gehostet werden.
Zahnbürste
Aber nicht HTTPS ist das, was ich gefragt habe.
Duncan X Simpson
Nein, es sollte nicht über HTTPS funktionieren. In diesem Fall liegt eine Sicherheitslücke im Webserver vor.
Zahnbürste
5

Der Webserver kann so konfiguriert werden, dass nur Verbindungen zu einer bestimmten Domäne oder Unterdomäne akzeptiert werden. Es können mehrere Domains gehostet werden.

Was der Webserver bei Verwendung einer direkten IP-Adresse tut, ist konfigurierbar. Im Fall von Apache wird standardmäßig der vhost mit dem ersten Namen von den aktivierten Sites aufgerufen, die alphanumerisch sortiert sind.

Dies ist der relevanteste Teil der Apache-Dokumentation, den ich nach einer kurzen Suche gefunden habe:

https://httpd.apache.org/docs/current/vhosts/name-based.html

paradroid
quelle