外部ドメインを使用しているときに Apache が内部 IP をログに記録するのはなぜですか?

外部ドメインを使用しているときに Apache が内部 IP をログに記録するのはなぜですか?

私は、メインの開発サーバーには置きたくない小規模なテスト プロジェクト用にオフィスで使用している Raspberry Pi を実行しています。Apache を実行しています。DNS は Cloudflare 経由で処理されますが、DNS のみのモードです。現在、テスト中は IP 制限は適用されていません。A レコードはmysite.domain.tld静的 IP アドレスを指しており123.123.123.123、インターネットと Pi の間には標準的なビジネス ファイバー ルーター/モデムのみがあります。

mysite.domain.tld例えば、Wi-Fiのない携帯電話からアクセスすると、携帯電話会社のIPが表示されます。リモートwgetサーバーからアクセスすると、その'IP がログに表示されます。すべてが期待どおりに動作します。

mysite.domain.tldただし、 Pi が配置されているのと同じネットワーク内からアクセスすると、Apache はルーターのゲートウェイ IP をログに記録します192.168.1.1。ドメイン名への接続は Cloudflare 経由でパブリック IP に解決されるため、パブリック IP アドレスが表示されるはずです。しかし、ログにはローカル ネットワーク IP が表示されます。

/etc/hosts(私はmacOSを使用しています)ルーターには何も設定されていません。ポート443からの接続のポート転送のみが、同じポートのRaspberry Piへのルーターで行われ、ドメイン名に関する参照はどこにもありません。pingを実行mysite.domain.tldすると、クラウドフレアIP アドレス、これは予想通りです。

チェーンのどこかで、私の IP アドレスと Pi のパブリック IP アドレスが一致しているため、IP が内部ゲートウェイ IP で上書きされているようです。ここで実際に何が起こっているのでしょうか?私はしません192.168.*本質的には、ファイアウォールで IP 制限を設定するときに、IP が信頼できるという事実に頼ることができることを確認したいだけです。

注: CF-Connecting-IPや同様のヘッダーはここではCloudflareから送信されません。これはDNS Onlyモードではない場合にのみ発生すると思われます。思われるPi が使用しているのと同じネットワーク接続を使用する場合にのみ有効になります。

答え1

ルーターは Linux を実行しており、この動作は標準の Linux ディストリビューションであれば簡単に実装できます。このように動作させるには、ルーターのファイアウォールにどのようなルールが存在している必要があるか推測できます。ただし、これは単なる推測であり、実際のルールが正確にどのようになっているかはわかりません。

ポートを Web サーバーに転送すると、次のような特定の DNAT ルールが追加されます。

iptables -t nat -A PREROUTING -p tcp -d <your-external-address> --dport 443 -j DNAT --to-destination <raspberry-pi-address>

言葉で言えば、これは「このパケットがデバイス宛てなのか、転送する必要があるのか​​を判断する前に、パケットの宛先アドレスが外部アドレスであり、宛先ポートが 443 であるかどうかを確認します。一致する場合は、宛先アドレスを Raspberry Pi の LAN アドレスに変更します」という意味です。このルールはインターフェースによってフィルタリングされないことに注意してください。

また、SNAT タイプのルール (LAN にインターネットへのアクセスを提供する) も確実に存在します。おそらく次のようになります。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE

つまり、ルータはパケットの送信先を決定した後、パケットを送信する前に、送信元アドレスを、送信インターフェイスのアドレスに変更します (パケットが LAN から送信された場合)。ここでも、インターフェイスによってフィルタリングされるものはありません。

ここで、HTTPS 接続について考えてみましょう。ブラウザでホスト名を指定していますよね? ルーターの外部アドレスに解決されるように設定し、それが宛先アドレスになります。送信元アドレスは LAN 内にあります。したがって、接続のパケットにはこれらのルールが両方とも適用されるようです。

ルーターは、これらを処理する際に、まず DNAT ルールに遭遇し、宛先アドレスとポートをチェックして、宛先アドレスを Raspberry Pi のものに変更することを決定します。次に、パケットが送信されるべきインターフェースが LAN のものであると判断されます。次に、部分的に変換されたパケットを 2 番目のルールと照合して、送信元アドレスが LAN からのものであると判断されます。そこで、パケットの送信元アドレスを LAN インターフェースのアドレス 192.168.1.1 に置き換えます。これが Raspberry Pi に表示されるものです。

NAT 操作はステートフルです。つまり、どのパケットが何に置き換えられたか、後続の転送パケットと応答パケットをどのように検出するかを示すテーブル レコードも保持するため、すべてを正しく変換できます。そうです、Linux は同じストリーム内で同時に DNAT と SNAT を実行できることがわかりました。

この動作を信頼できますか? わかりません。ルーターのファームウェアがオープンソースであれば、確認する機会がありました。ソースがなければ、確信は持てません。これは、ソースがクローズドである場合に常に当てはまることであり、セキュリティを懸念する場合はクローズドソース製品を避ける必要があるのはそのためです。

関連情報