ネットワーキング – ウェブサーバはどのようにして直接IPアドレスアクセスを使用しているかどうかを知ることができますか?

apache-http-server dns http ip networking

一部のウェブサーバでは、IPアドレスを使用してアクセスした場合、直接IPアドレスにアクセスできないというエラーが返されます

以前から不思議に思っていたのですが、これってどうやって動くのでしょうか?というか、ブラウザが常にIPアドレスを解決して接続しているのでは?IPアドレスへの直接アクセス」はDNSをスキップしているだけではないのか?DNSをスキップしたことをリモートサーバーはどうやって知っているのでしょうか?

  65  None  2016-03-13


ベストアンサー

どうやって知っているのかという質問に答えるためには、ブラウザがサーバーに送信するものと関係があります

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

これは私がオンラインで見つけたヘッダーのサンプルで、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アドレスを持つウェブサーバが複数のサイトをホストしていて、それぞれに異なるページを提供している可能性があるからです。誰がどのページを欲しがっているのかをIPアドレスで区別することはできませんが、HTTPヘッダで区別することはできます

91  iAdjunct  2016-03-13


HTTP 1.1 プロトコル (以前の HTTP 1.0 バージョンはかなりの時間が経過しており、最近のどのバージョンのブラウザでも使用される可能性は低いです) では、host ヘッダが導入されました。HTTP 1.1 では、ブラウザが発行しなければならない必須のヘッダ行ですその行には、ブラウザによってドメイン名が含まれています。つまり、ウェブサーバはブラウザがその行からどのウェブサイトにアクセスしたいかを知っているということです。ウェブサーバは何十ものウェブサイトをサポートしているかもしれないので、要求されたページがどのウェブサイトにあるかを判断するために、この行は重要です。例えば、ブラウザがexample.com上のサイトのホームページにアクセスしたいとすると、サーバに接続する際に以下のような行をサーバに発行します

GET / HTTP/1.1

この行は、ブラウザがルートドキュメント、つまりウェブサイトの”/”を取得したいことを指定しています。/somedir/testpage.htmlにアクセスしたい場合、GET /somedir/testpage.htmlは “get “行になります。この行の後には、以下の行が続きます

Host: example.com

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

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

21  moonpoint  2016-03-13


これは、Host:のHTTPヘッダによるものです。これは、同じIPアドレスで複数のサイトをホスティングする場合にかなり便利です。例えば、http://www.k7dxs.net/http://www.philipgrimes.com/はどちらも同じIPアドレス上にあります。しかし、Host:ヘッダのため、2つの異なるサイトを表示することができます

HTTPS の場合、@Toothbrush が指摘したように、ホストヘッダが暗号化されたリクエストの一部であり、これがないとサーバはどの証明書を提供すべきかわからないため、TLS サーバ名表示を使用しています

楽しい実験。Firefox用のTamper Dataを入手して(Chrome用の同等のものを見つけることができませんでした)、改ざんを開始します。http://slipstation.com/ を開き、http://www.zombo.com/ となるようにリクエストの Host: ヘッダを編集する。何でも可能な可能性のある身近なサイトが表示されます

6  Duncan X Simpson  2016-03-14


ウェブサーバーは、特定のドメインまたはサブドメインへの接続のみを受け入れるように設定することができます。複数のドメインをホスティングしている可能性があります

直接の IP アドレスが使われているときにウェブサーバが何をするかは設定可能です。Apache の場合、デフォルトでは、有効になっているサイトの中で最初に名前のついた vhost に移動します

ざっと検索した結果、これが Apache ドキュメントの中で最も関連性の高い部分です

Name-based Virtual Host Support - Apache HTTP Server Version 2.4

5  paradroid  2016-03-13


タイトルとURLをコピーしました