TCP / IPプロトコルスタックのレイヤー間、具体的にはDNSとアプリケーションレイヤープロトコルの間で情報がどのように流れるかについて考えることに戸惑っています。
パブリックIPアドレスが1つあります。DNSは確かに両方mail.example.com
を解決できexample.com
、同じパブリックIPアドレスに解決できます。
一般に、ファイアウォールの外部インターフェイスによって受信されるパブリックIPアドレスへの要求を含むIPデータグラムには、リモートクライアントがアクセスを試みているホストの名前は含まれていません。ファイアウォールは、両方のホスト名が同じIPアドレスに解決されるため、リモートクライアントが解決したホスト名を魔法のように「知る」ことはできません。IP層は、アプリケーション層で使用されるホスト名を認識しません。
TCPおよびUDPプロトコルは、ポート番号を使用してホストが提供する特定のサービスを区別します。この例の場合、NATファイアウォールのポート転送(ポートアドレス変換、またはPATとも呼ばれます)機能を使用して、TCPポート80(HTTP)への着信要求をWebサーバーに送信し、着信TCPポートを送信できる場合があります。メールサーバーへの25(SMTP)。
ただし、両方のマシンで同じサービスをホストする場合は、この戦略が問題になります。Webサーバー上の安全なWebサイト(顧客アクセス用)と電子メールサーバー上の安全なWebサイト(Webメール用)の両方をホストするとします。NATファイアウォールのパブリックIPアドレスからTCPポート443(HTTPS)に送られる要求は、どちらかのサーバーにのみルーティングできます。
この状況に対する一般的な解決策は、パブリックIPアドレスを増やすことです。IPv4アドレスが不足しているため、これも問題になる可能性があります。
最終的に、アプリケーション層の一部のプロトコルでパブリックIPアドレスが不足する問題を回避します。たとえば、HTTP / 1.1はHost:
ヘッダーを追加して、Webサーバーが同じパブリックIPアドレスで複数のWebサイトをホストできるようにします。TLSは、サーバー名表示(SNI)拡張機能を追加して、リモートクライアントが入力したホスト名に基づいて適切な証明書を選択できるようにします。
アプリケーション層でこの種の回避策を実行すると、すべてのアプリケーション層プロトコルに独自の「修正」が必要になります(そして、すべてのサーバーおよびクライアントソフトウェアがその「修正」を実装する必要があります)。それは大変な注文です。
アプリケーション層プロトコルを変更する代わりに、一部のプロトコルは、要求を「ルーティング」できるソフトウェアを使用して、複数のホスト間で「多重化」されやすくなります。これは、パケットをアプリケーション層で検査する必要があるため、単純なNATファイアウォールの能力を超える可能性があります。nginxのようなリバースプロキシを使用することは、HTTPプロトコルのこの種の「多重化」(またはMicrosoft環境のForefront TMGまたはISA ServerでのWeb公開ルール)の良い例です。理論的には、どのプロトコルもリバースプロキシを介して多重化できますが、プロトコルが難解であるほど、カスタムコードを記述することについて話している可能性が高くなります。
単一のパブリックIPアドレス上の2つの異なるホストから同じサービスを提供する必要がある場合、ホストの1つを非標準ポートに移動するオプションが常にあります。ただし、これにはクライアントが非標準ポートを認識する必要があります。HTTP(S)の場合、これにより、http://example.com:XXX
表記のURLが生成されます(ここXXX
で、非標準のポート番号です)。これがあなたの状況で問題になるかどうかは、あなただけが決めることができるものです。(私の経験では、エンドユーザーが:XXX
手入力しなければならないURLのポート表記を処理できることはほとんどないことが示されています。)