Webサーバーは、直接IPアドレスアクセスを使用しているかどうかをどのように知るのですか?


64

一部のWebサーバーは、IPアドレスを使用してアクセスすると、直接IPアドレスアクセスが許可されていないというエラーを返します。

私はこれがどのように機能するのかしばらく疑問に思っていました。つまり、ブラウザは常にIPアドレスを解決してそれに接続するとは限りませんか?「直接IPアドレスアクセス」はDNSをスキップするだけではありませんか?リモートサーバーは、DNSをスキップしたことをどのように認識しますか?


2
私が思い出すように彼が本当に求めていたのは、同じ実ホスト上で仮想サーバーを提供するために、非常に早い段階でhttpプロトコルに追加されたものです。
JDługosz

3
単一のサーバーが異なる仮想ホストを区別できるようにするのは、基本的に同じプロセスです。実サーバーは、URLをその仮想ホストの1つにマップします。多くのサーバーには、設計上またはデフォルトのいずれかで、マップされていないURLのフォールバックがありません。
マンゴ

DNSをスキップできますが、問題のドメイン名のホストファイルにエントリを作成する場合、このエラーを回避できます。ブラウザはドメイン名を検索し、Host:ヘッダーに含めますが、hostsファイルエントリのためにDNSクエリは行われません。
モンティハーダー

これらの種類の質問への答えは、あなたが彼らに言ったからです
トーマス

回答:


91

それがどのようにわかっているかというあなたの質問に答えるには、あなたのブラウザがサーバーに送るものと関係があります。

システムは常にそれをIPアドレスに解決しますが、ブラウザーはアクセスしようとしたURLをHTTPヘッダーで送信します。

これは、WindowsでFirefoxを使用apple.comしてアドレスバーに入力したように見えるように修正された、オンラインで見つけたサンプルヘッダーです。

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

IPアドレスを使用した場合、ヘッダーは次のようになります。

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

これらは両方ともソケットを介して同じIPアドレスに送信されますが、ブラウザはアクセスしたものをサーバーに通知します。

どうして?同じIPアドレスを持つWebサーバーは複数のサイトをホストし、それぞれに異なるページを提供する可能性があるためです。それらはすべて同じページであるため、誰がどのページを望むかをIPアドレスで区別できませんが、HTTPヘッダーで区別できます。


7
ああ、今はもっと意味があります!したがって、基本的に、ブラウザはIPまたはドメインのいずれかを含むヘッダーをIPに送信し、サイトはそのことを前提とします。本当に、これらの制限は簡単に回避できますか?
ジョセフA.

7
それはあなたが迂回しているという制限ではなく、単にあなたがボールをプレーしておらず、いくつかの奇妙な結果が得られるということです。
-iAdjunct

これらのHTTPリクエストは、プロキシを使用している場合に得られるものです。プロキシがない場合、情報はhostヘッダーに含まれます。この例を参照してください。
0xFE

2
bytec0de:これの他の部分は、Webサーバー構成がホスト名に基づいてセットアップされることが多いということです。IPパケットはIPアドレスを指定し、TCPセグメントはポート番号を指定し、HTTPヘッダーはホスト名を指定します。そのため、通常、サーバーは「クライアント/ブラウザがexample.comを要求した場合、これを提供する」と言うように設定されています。IPアドレスまたはワイルドカード(すべてに対応)に応答するように設定することもできますが、多くの人は例をコピーするだけであり、既存の多くの例はブラウザが提供するドメイン名に基づいています。
-TOOGAM

14
@ bytec0de 制限ではありません。正しい電話番号を使用するのと似ていますが、内線番号が間違っています-適切な建物ではなく、適切な人に電話しました。また、導入の理由も電話の場合とほとんど同じです。同じIPアドレス(およびTCPポート)で複数の個別のサイトをホストできます。たとえば、当社の開発サーバーは同時に数百の個別のWebサイトをホストし、多くのWebホスティングソリューションは同じアプローチを使用します(「ドメインを登録し、IPアドレスを指定し、残りは処理します」) 。
ルアーン

21

HTTP 1.1プロトコル(以前のHTTP 1.0バージョンはかなり長い間廃止されているため、ブラウザの最近のバージョンで使用される可能性は低い)で、hostヘッダーが導入されました。ブラウザによって発行されなければならない必要なヘッダ行であるHTTP 1.1。ドメイン名は、ブラウザによってその行に含まれます(例:)Host: example.com。そのため、Webサーバーは、ブラウザーがその行からアクセスしたいWebサイトを認識します。Webサーバーは多数のWebサイトをサポートしている可能性があるため、要求されたページが存在するWebサイトを判別するために、その行は重要です。ブラウザがexample.comのサイトのホームページにアクセスしたい場合、サーバーに接続するときにサーバーに次の行を発行します。

GET / HTTP/1.1

この行は、ブラウザがルートドキュメント、つまりWebサイトの「/」を取得したいことを指定します。あなたがアクセスしたい場合は/somedir/testpage.htmlGET /somedir/testpage.html「取得」の行になります。行の後には次の行が続きます。

Host: example.com

そのため、Webサーバーがexample.com、someothersite.com、yetanothersite.orgなどのWebサイトをサポートしている場合、example.comのメインページを返す必要があることがわかります。その行を取得できない場合、またはその行にドメイン名がリストされHostていない場合、どのWebサイトのホームページが返されるべきかはわかりません。そのため、代わりにエラーメッセージを返すか、サーバーの「デフォルト」サイトのホームページを返す場合があります。

LinuxシェルプロンプトやApple OS X ターミナルウィンドウなど、telnetプロトコルを使用してブラウザーが発行する同じコマンドを発行して、デフォルトのHTTPポートであるポート80に接続できます - 手順については、PuTTY使用したWebサイトへのアクセスのテストを参照してくださいWindowsシステムでPuTTYを使用してこれを行うには。telnet example.com 80


3
注:ホストヘッダーはHTTP 1.0でも使用されていたため、必須ではありませんでした。HTTP 1.1はこのフィールドを必須にしました。実際には、ブラウザーがホストヘッダーを送信しないと(多くの上記の理由により)、多くのHTTP 1.0サーバーは単に機能しなかったため、ほとんどのブラウザーはホストヘッダーを送信しました。
ルアーン

6

これは、Host:HTTPヘッダーが原因です。これは、同じIPアドレスで複数のサイトをホストする場合に非常に便利です。たとえば、http://www.k7dxs.net/http://www.philipgrimes.com/は両方とも同じIPアドレスにあります。ただし、Host:ヘッダーのため、2つの異なるサイトを表示できます。

HTTPSの場合、@ Toothbrushが指摘したように、ホストヘッダーは暗号化された要求の一部であり、サーバーはこれがないとどの証明書を提供するかわからないため、TLS Server Name Indicationを使用します。

楽しい実験:Firefoxの改ざんデータを取得し(Chromeに相当するものを見つけることができませんでした)、改ざんを開始します。http://slipstation.com/を開きHost:、リクエストのヘッダーを編集してhttp://www.zombo.com/にします。なにかおなじみのウェブサイトが表示されます。


実際、これらのサイトはServer Name Indicationを使用しています。サーバーは使用する証明書を知らないため、両方のサイトがSNIなしでHTTPSを介して同じサーバーでホストされている場合、どのサイトを表示するかを指示する方法はありません。
歯ブラシ

ああ、面白い。実験は引き続き機能しますか?
ダンカンXシンプソン

はい、HTTP経由で同じIPアドレスでホストされている2つのサイトを見つけた場合。
歯ブラシ

しかし、私が求めていたのはHTTPSではありません。
ダンカンXシンプソン

いいえ、HTTPSでは機能しません。存在する場合、Webサーバーにセキュリティの脆弱性があります。
歯ブラシ

5

Webサーバーは、特定のドメインまたはサブドメインへの接続のみを受け入れるように構成できます。複数のドメインをホストしている可能性があります。

直接IPアドレスが使用されるときにWebサーバーが行うことは構成可能です。Apacheの場合、デフォルトでは、有効なサイトのうち最初に名前が付けられたvhostに移動します。これらのサイトは英数字順にソートされます。

これは、クイック検索の結果、私が見つけたApacheドキュメントの最も重要な部分です。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.