dns – サーバーは1つのウェブサイトのみを保持していますか?

dns ip webserver

私の理解では、DNSはドメイン名とウェブサイトが保存されているサーバーのIPアドレスをリンクしていますが、それは各サーバーが1つのウェブサイトしか保持できないということですか?もしそうでない場合、同じサーバーにたくさんのウェブサイトがある場合、サーバーのIPアドレスを呼び出すことで、どのウェブサイトが欲しいかを知ることができるのでしょうか?

  81  user3407319  2016-06-18


ベストアンサー

基本的には、ブラウザはHTTPリクエストにドメイン名を含むので、ウェブサーバはどのドメインがリクエストされたかを知っていて、それに応じて応答することができます


HTTP requests

ここでは、典型的な HTTP リクエストがどのように発生するかを説明します

  1. ユーザーはURLをhttp://host:port/pathの形式で提供します

  2. ブラウザはURLのホスト(ドメイン)部分を抽出し、必要に応じてIPアドレスに変換します。この変換はDNSを介して行うことができますが、その必要はありません(例えば、一般的なOSのローカルのhostsファイルはDNSをバイパスしています)

  3. ブラウザは、指定されたポートへのTCP接続を開くか、そのIPアドレス上のポート80にデフォルトで接続します

  4. ブラウザはHTTPリクエストを送信します。HTTP/1.1の場合は、以下のようになります

    GET /path HTTP/1.1
    Host: example.com
    

    (HostヘッダはHTTP/1.1では標準で必須です。HTTP/1.0 の仕様では指定されていませんでしたが、一部のサーバではいずれにせよサポートされています)

ここから、ウェブサーバはレスポンスを決定するために使用できるいくつかの情報を持っています。1つのウェブサーバが複数のIPアドレスにバインドされる可能性があることに注意してください

  • TCP ソケットから要求された IP アドレス
    • クライアントのIPアドレスも利用できますが、これはほとんど使われません
  • TCP ソケットから要求されたポート
  • 要求されたホスト名は、HTTP リクエストでブラウザが Host ヘッダーで指定したものです
  • 要求されたパス
  • その他のヘッダ(クッキーなど)

あなたが気づいたように見えるように、最も一般的な共有ホスティングのセットアップは、これらの日は、単一のIPアドレス上の複数のウェブサイトを置きます:ポートの組み合わせは、ウェブサイトを区別するためにちょうどHostを残して

これは Apache の世界では 名前ベースのバーチャルホスト として知られていますが、Nginx では サーバーブロック内のサーバー名 と呼ばれ、IIS では バーチャルサーバー と呼ばれています


HTTPSはどうなの?

HTTPS は少し違います。TCP 接続の確立まではすべて同じですが、その後は暗号化された TLS トンネルを確立しなければなりません。目的は、リクエストに関する情報を漏らさないことです

サーバーがこのドメインを実際に所有していることを確認するために、サーバーは信頼できる第三者によって署名された証明書を送信する必要があります。ブラウザはこの証明書を要求されたドメインと比較します

これは問題を提示しています。HTTP リクエストを受信する前にこれを行う必要がある場合、サーバはどのホスト (ウェブサイト) の証明書を送信するかをどのようにして知ることができるのでしょうか?

従来は、HTTPS を必要とするすべてのウェブサイトに専用の IP アドレス(またはポート)を設定することで解決していました。明らかに、IPv4 アドレスが不足し始めると、これは問題になります

SNI (サーバ名表示) を入力します。ブラウザは TLS の交渉中にホスト名を渡すようになったので、サーバは正しい証明書を送るためにこの情報を早い段階で持っています。サーバ側では、設定は HTTP バーチャルホストの設定方法と非常に似ています

不都合な点は、ホスト名が暗号化の前にプレーンテキストとして渡され、本質的に漏洩情報となることです。これは通常、ホスト名がDNSクエリで公開されることを考えると、許容できるトレードオフと考えられています


IPアドレスだけでサイトを依頼する場合は?

リクエストされた特定のホストがわからない場合にサーバが何をするかは、サーバの実装と設定に依存します。一般的に、ホストを明示的に指定していないすべてのリクエストに応答を提供する “default”、”catchall”、”fallback” サイトが指定されています

このデフォルトのサイトは、独立したサイトにすることもできますし (エラーメッセージが表示されることもあります)、 サーバー管理者の好みに応じて、サーバー上の他のサイトにすることもできます

149  Bob  2016-06-18


ノンテクの人にはこんな説明をしています

ジャック、ジル、ジョーは寮に住んでいて、携帯電話を持っていない

電話帳には同じ番号で記載されています。(Aレコード)に記載されています

番号をダイヤルして、誰かが電話に出て、「ジルと話したい」と言って、彼女に電話をかける

電話帳のAレコード(A電話番号/IPアドレス)の代わりに、「寮X」と書かれている場合がありますが、これはCNAMEレコードです

ジルがいない場合は、手に入るかもしれません

  • 404 ジルはいません
  • 410 ジルは死んだ
  • 301 ジルがピーターと同居する
  • 302 ジルがピーターに会いに行ってる 代わりに電話しろ

  • 400 お前のことが理解できない

  • 401 あなたは誰ですか?パスワードは何ですか? または22時以降は男性の方のご利用はお断りしております
  • 402 支払い要(ジルが本名なのは間違いないのか 😉
  • 403 いや、それは正しいパスワードではありません
  • 418 ジルはティーポット 🙂
  • 429 ジルはもう電話に出られない
  • 451 あなたは接近禁止命令に違反しています

  • 500 電話システムが故障しました

91  Lenne  2016-06-18


私が理解している限りでは、DNSはウェブサイトが保存されているサーバーのIPアドレスとドメイン名をリンクしていますが、それは各サーバーが1つのウェブサイトしか保持できないということでしょうか?

まず、ここにはいくつかの明確な概念があることを理解する必要があります

  • Webサイト、まとまりのある全体を形成するWebページのグループ
  • IPアドレス。インターネットプロトコルでトラフィックの送信元または送信先として使用される数値アドレス(IPv4では32ビット、IPv6では128ビット)
  • サーバ、クライアントからのリクエストに応えるのが仕事のマシン
  • ホスト名、DNSでマシンを識別するために使用される名前(例:”www.example.com “や “en.wikipedia.org”)

これらの間には一対一の関係はありません。1つのサーバが複数のIPアドレスを持つことができ、複数のホスト名が1つのIPアドレスを指すことができ、1つのホスト名が複数のIPアドレスを指すことができます。複数のウェブサイトは、同じホスト名の下にあることができます。1つのウェブサイトは、複数のホスト名にまたがって広がることができます

そうでない場合、同じサーバーにたくさんのサイトがある場合、サーバーのIPアドレスを呼び出すことで、どのサイトが欲しいのかがわかるのでしょうか?

昔(HTTP 1.0以前)は、サーバが別のホスト名を扱いたい場合、それぞれが独自のIPアドレスを持たなければなりませんでした。これはかなり無駄なことでした

HTTP 1.1 では、HTTP リクエストの必須フィールドとして Host“ヘッダが追加されました (IRCでは、いくつかのベンダが以前に拡張機能としてこれをサポートしていました)。これはどのホスト名がリクエストされたかをサーバに伝え、同じ IP アドレス上の異なるホスト名に対して異なるコンテンツを提供することを可能にしました。クライアントの HTTP 1.1 のサポートは現在ユビキタスになっています

残念なことに、SSL (後の TLS) にはしわ寄せが来ています。SSL/TLS セッションを確立するには、サーバは要求されたホスト名をカバーする証明書をクライアントに提示する必要がありますが、HTTP リクエストは SSL/TLS セッションが確立されるまで届きません

SubjectAltNameフィールドの使用やCommonNameフィールドのワイルドカードの使用により、一つの証明書で複数のホスト名をカバーすることが可能です。しかし、特に関係するホスト名が異なるドメインの下にある場合には、管理上の問題が生じます

そこで、TLS は “server name indication” (SNI) 拡張を導入しました。この拡張機能を使うと、クライアントは TLS のハンドシェイク手順の間に、要求されたホスト名をサーバに送信します。サーバは適切な証明書を提示することができます。残念ながら、すべての主要な SSL/TLS 実装の現在のバージョンは SNI をサポートしていますが、古いバージョンでは使用できなくなるまでに長い時間がかかりました

6  plugwash  2016-06-19


答えは、いくつかの答えよりも少し複雑です。DNS検索を実行する際には、IPアドレスを取得しなければなりません(IPv4ではAレコード、IPv6ではAAAAレコード)。通信するためにはTCP/IP上でソケットを開くことができなければなりません。このアドレスはサーバを表しているかもしれませんし、ロードバランサを表しているかもしれません。プロキシを表している可能性もあります。例えば、ホストがCloudFlareの背後にある場合、取得したアドレスはCloudFlareサーバのものです。本当のサーバは別の場所にあります。これにより、ホストはサービス妨害攻撃のような問題を回避することができます

バーチャルホスティングあなたが尋ねているものです(他の質問のいくつかは、これに触れたが、任意の詳細ではありません)。仮想ホスティングは、Webリクエストを取り、提供するウェブサイトを決定するために、ホスト名(すなわち、domain.com)を見ています。だからApache HTTPウェブサーバーでは、このような設定になります

<VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com

DocumentRoot /var/www/domain.com
</virtualHost>

これは例として単純化されています。そこで、任意の IP のポート 80 を listen するように Apache に伝えています (最近の仮想マシンのホスティングでは、マシンの IP は実際の IP とは異なるかもしれません)。そして、これが domain.com のウェブサイトであり、そのウェブサイトがどのディレクトリの下に住んでいるかを伝えます。このブロックを何度も繰り返すことで、Apache に異なるウェブサイトを扱うように指示することができます。どのウェブサーバもこのタイプのシステムをサポートしています

これを処理する別の方法としては、ウェブサーバーにすべてのウェブトラフィックを1つのプログラミングスクリプト(PHP、ASP.NETなど)に誘導し、その1つのスクリプトがどのウェブサイトとページを表示するかを決定するように指示するという方法があります

3  Machavity  2016-06-20


DNS を使用すると、個々の IP アドレスに好きなだけ名前を割り当てることができます (hosts ファイル では、例えば、各名前を単にスペースで区切っても構いません)。DNSサーバを使用すると、1つの名前に複数のIPアドレスを割り当てることもできます一対一の関係に限定されるものではありません

ウェブサーバは、要求されたURLを調べることで、どのサイトにサービスを提供すべきかを知っています。どのドメインが要求されたか、要求されたポート、そしてどのプロトコルが使用されたかを調べます。これはDNSとは何の関係もなく、HTTPプロトコルによって処理されます

1  krowe  2016-06-18


Web サーバにはホストコンテナという概念があります (こちらには Tomcat のドキュメントがあります。)複数のホストコンテナを同じボックス/IPアドレスに設定して、複数のドメインにサービスを提供することができます。コンテナには、独立した作業ディレクトリ、認証領域、ログディレクトリなどがあります

サーバーは、新しい要求のための関連するコンテナを見つける ドメインの名前は、このHTTPリクエストの一部である購入します

完全に異なるウェブサーバインスタンスが異なるポートで実行されている場合、同じIPアドレスを共有することができます。これは、本番サーバが任意のポートで実行できないため、ドメイン名が利用できない可能性がある様々な開発・テスト環境で主に使用されます

最後に、ウェブサイトに厳密に固有のIPアドレスが必要な場合でも、サーバーボックスには複数のネットワークアダプタが搭載されていることが多いので、複数のIPアドレスを使用するように設定されています

0  h22  2016-06-20


あなたのサーバーのIPアドレスは、同時に多くの異なるドメイン名を保持することができます

あなたがウェブサイトにアクセスすると、あなたのブラウザは、その中にドメイン名を含むHTTPリクエストを送信し、サーバーは、それが戻ってあなたに送信する必要がありますどのウェブサイトのデータを見つけることができます

バーチャルホストと呼ばれているので、簡単に言うと 🙂

DNS とバーチャルホストの詳細については、こちらをご覧ください

0  Tim Connor  2016-07-23


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