質問: ### 質問内容 一般に同一セグメントに存在するサーバーに対して,ドメイン名でアクセスする場合, hostsファイルに書き込む等の対応が必要となりますが,なぜ必要なのでしょうか? 例として以下の環境が存在します。 * ルーター ( WAN:128.100.100.100 / LAN:192.168.1.1 ) * ルーターには TCP80 を 192.168.1.2 にフォワードするように設定 * 128.100.100.100 に対して domain.com というドメインを取得 * WEBサーバ ( LAN:192.168.1.2 ) * クライアントPC ( LAN:192.168.1.3 ) * クライアントPCに domain.com に関する hosts は設定していない この時,クライアントから domain.com:80 にアクセスしたときに,以下のような経路のイメージを持っているので hosts 等の設定は不要なように思えるのですが,実際はアクセスできないと思います。 内部からドメイン名でアクセスする方法はいろんなサイトで説明されていますが,そもそもなぜアクセスできないのかは,調べても分からなかったのでご教授いただけると幸いです。 1. domain.com の名前解決が行われ 128.100.100.100 が返却される 2. クライアントは 128.100.100.100 の TCP80 に対してリクエストを行う 3. ルータは TCP80 を見て 192.168.1.2 にフォワードを行う 4. WEBサーバはクライアント( 192.168.1.3 )に対してコンテンツをレスポンスする
回答: ルータのコア部分は、文字通りルーティングする機能、つまり受け取ったパケットを適切なインターフェースに引き渡す機能しかないものであり、ネットワークフィルタやNAT等の機能は、インターフェース側にくっついているものだ、と考えるとわかりやすいでしょう。 要するに、LAN側インターフェースから宛先が128.100.100.100なパケットを受け取ったルータコアは、その時点で自分宛の通信であると判断し、WAN側のインターフェースには引き渡さず、ルータ自身へのアクセスとして対応するのです。結果、WAN側インターフェースに設定されたポートフォワーディング設定に引っかからないので、ポートフォワード動作は行われないというわけです。 この問題をクライアント側でhostsを書かずに防ぐには、2つの方向性があります。 一つは既出の、ヘアピンNAT/NATループバックなりの設定を行い、LAN側からWAN側インターフェースのアドレスにアクセスした場合には、WAN側インターフェースから入ってきたように処理するよう設定する方向性です。 もう一つは、ローカルクライアント専用のDNSサーバを用意し、DHCPによるIP配布時にそのDNSを利用するように指定しておいて、そのDNSサーバでは、ローカルにサーバがあるドメインについてのみ、独自にzoneを設定して対応する(他は普通のDNSサーバに聞きに行く)、つまりそのDNSに「domain.com」を名前解決させると「192.168.1.2」だと答えを返すように設定する方向性です。 後者の手段をとった場合、証明書がWAN側IPで設定されるhttpsは正常に動作しない点に注意が必要です。