NAT の背後にある Web サーバー、パブリック IP アドレスをリッスンする方法

NAT の背後にある Web サーバー、パブリック IP アドレスをリッスンする方法

NAT を使用したファイアウォールの背後で実行されている Debian Web サーバー (nginx) があります。Web サーバーは、SSL と独自の IP アドレスを必要とする複数のサイトをホストしています。SSL サイトが特定の IP アドレスのみをリッスンし、共有サイトが共有 IP のみをリッスンするようにしたいと思います。

現在、すべてのドメインに対してワイルドカード * をリッスンしています。これは、単一の LAN アドレスをリッスンし、IP アドレスではなくホスト名に基づいてサイト コンテンツを提供していることを意味していると思います。これを修正したいと思います。

適切な対処方法は何でしょうか? 各 IP アドレスに対して 1:1 NAT を作成し、リッスンするネットワーク インターフェイスに LAN IP を追加して、その LAN IP を特定のドメインに割り当てるのでしょうか? それとも、もっと良い方法があるのでしょうか? パブリック IP を渡して、それに基づいてアクションを実行する方法はありますか? よろしくお願いします。

答え1

いいえ、NAT を実行した後、少なくとも直接的には、元の宛先 IP アドレスを通過させることはできません。

外部 IP ブロックとして 192.0.2.0/24 を使用し、内部 IP ブロックとして 198.51.100.0/24 を使用します (RFC5737 を参照)。

実行できることとしては、次のようなものがあります。

  • 各外部 IP のターゲット ポートを、内部 IP の異なるポート セットに NAT します。たとえば、192.0.2.1:80 と 192.0.2.1:443 を 198.51.100.1:80 と 198.51.100.1:443 に NAT し、次に 192.0.2.2:80 と 192.0.2.2:443 を 198.51.100.1:81 と 198.51.100.1:444 に NAT します。Web サーバーを構成して、適切なサービスに対して区別されたポートをリッスンします。他の用途に使用されていないポートを選択し、ファイアウォールの設定を確認してください。
  • Web サーバーに追加の内部 IP を割り当てます。たとえば、Web サーバーに 198.51.100.1 と 198.51.100.2 を割り当てます。適切な外部 IP/ポート ペアを対応する内部 IP/ポート ペアに NAT します (例: 192.0.2.1 を 198.51.100.1 に、192.0.2.2 を 198.51.100.2 に)。適切なサービスを適切な内部 IP にバインドするように nginx に指示します。

後者のソリューションを選択した場合、通常とは異なるポート番号やポート変換を扱わなくて済むため、環境はよりシンプルになり、より標準に準拠したものになりますが、各 Web サーバーに複数の内部 IP を割り当てる必要があります (1 つだけだと思います)。また、後者のソリューションを使用する場合は、1:1 NAT を使用できます。

そうは言っても、Web サーバーを NAT の背後に配置する理由がまったくない場合 (NAT はファイアウォールではありません)、外部 IP をリッスンするだけです (これを行うには、トポロジの変更も必要になります)。

答え2

各サイトに異なるパブリック IP アドレスが必要なようですね。つまり、ファイアウォールは異なるパブリック IP アドレスを提示する必要があります。ファイアウォールは、異なる IP アドレスへのリクエストを nginx サーバーに転送したり、同じ IP アドレスの異なるポートにリクエストを転送したりできます。その後、nginx サーバーがそれに応じて応答するようにできます。

具体的な設定方法はファイアウォールによって異なります。たとえば、iptables を使用する場合、スクリプトで次のような操作を実行できます。

KINCAID=192.168.1.112
EXTIPJMN=50.60.70.80
iptables -t nat -A PREROUTING -d $EXTIPJMN -p tcp -i $EXT --dport 8081 -j DNAT --to-destination $KINCAID:8080

これにより、IPアドレスEXTIPJMN(50.60.70.80)とポート8081に届いたリクエストが、IPアドレスKINCAID(192.168.1.112)とポート8080の内部サーバーにルーティングされます。

https 経由でも同じ IP アドレスから異なるサイトを提供することができ、これはほとんどの最新クライアントでサポートされていますが、すべてではありません。

関連情報