これはヘアピンNATの標準的な質問に引き上げられたので、おそらく現在受け入れられているものよりも一般的に有効な回答が必要だと思いました(FreeBSDに特に関連しています)。
この質問は、ゲートウェイで宛先NAT(DNAT)を導入することで外部ユーザーが利用できるRFC1918アドレスのIPv4ネットワーク上のサーバーによって提供されるサービスに適用されます。内部ユーザーは、外部アドレスを介してこれらのサービスにアクセスしようとします。パケットはクライアントからゲートウェイデバイスに送信されます。ゲートウェイデバイスは宛先アドレスを書き換え、すぐに内部ネットワークに送り返します。ヘアピンターンとの類推により、パケットがゲートウェイでヘアピンNATという名前を生み出すのは、この急激なターンです。
この問題は、ゲートウェイデバイスが送信元アドレスではなく宛先アドレスを書き換えたときに発生します。サーバーは、内部の宛先アドレス(自身のアドレス)と内部の送信元アドレス(クライアントのアドレス)を持つパケットを受信します。そのようなアドレスに直接返信できることを知っているので、そうします。その応答は直接であるため、ゲートウェイを経由しないため、戻りパケットの送信元アドレスを書き換えることによって、初期パケットに対する着信宛先NATの効果のバランスを取る機会がありません。
したがって、クライアントは外部 IPアドレスにパケットを送信しますが、内部 IPアドレスから応答を取得します。2つのパケットが同じ会話の一部であることがわからないため、会話は発生しません。
解決策は、そのような宛先NATを必要とし、内部ネットワークからゲートウェイに到達するパケットの場合、通常は送信元アドレスをゲートウェイのアドレスに書き換えることにより、着信パケットに対してソースNAT(SNAT)を実行することです。サーバーは、クライアントがゲートウェイ自体であると判断し、直接応答します。これにより、ゲートウェイは、リターンパケットの送信元アドレスと宛先アドレスの両方を書き換えることにより、インバウンドパケットに対するDNATとSNATの両方の効果のバランスを取ることができます。
クライアントは、外部サーバーと通信していると考えています。サーバーは、ゲートウェイデバイスと通信していると見なします。すべての関係者は幸せです。この時点で図が役立つ場合があります。
一部のコンシューマゲートウェイデバイスは、2番目のNATステップが必要なパケットを認識するのに十分な明るさであり、ヘアピンNATシナリオではすぐに動作します。他の人はそうではないので、そうすることはできません。サーバーフォールトのトピック外のコンシューマグレードデバイスの議論。
通常、適切なネットワークデバイスは動作するように指示されますが、管理者を再推測するビジネスではないため、そうするように指示する必要があります。Linuxはiptables
DNATを次のように使用します。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.3.11
これにより、HTTPポートの単純なDNATが有効になり、上の内部サーバーに接続され192.168.3.11
ます。ただし、ヘアピンNATを有効にするには、次のようなルールも必要です。
iptables -t nat -A POSTROUTING -d 192.168.3.11 -p tcp --dport 80 -j MASQUERADE
このようなルールは、適切に機能するために関連するチェーンの適切な場所に配置する必要があり、filter
チェーンの設定によっては、NATされたトラフィックのフローを許可するために追加のルールが必要になる場合があります。このような議論はすべてこの回答の範囲外です。
しかし、他の人が言ったように、適切にヘアピンNATを有効にすることは、問題を処理する最良の方法ではありません。最適なのはスプリットホライズンDNSです。組織は、内部ユーザーと外部ユーザーに対して異なる物理サーバーを使用するか、DNSサーバーを構成して、要求クライアントの場所に応じて、元のルックアップに対して異なる回答を提供します。要求元クライアントのアドレス。