ローカルからドメイン名でアクセス出来ない!
意外とはまるところです
|
ローカルからはドメイン名でアクセスできない?
|
|
自宅で公開サーバーを持つ方のほとんどは、何らかの形でドメイン名で自分のサーバーにアクセスさせているでしょう。おそらく一番多いパターンは、固定IPアドレス+独自ドメインもしくは変動IPアドレス+Dynamic DNSでしょう。これらの実現方法については数々のサイトでその方法が公開されており、特に問題なく実現する方が多いかと思います。 しかし、意外と多くの方がローカルからドメイン名で公開Webサーバーにアクセスしようとすると、ルーターの設定画面が出てきてしまう、という現象で悩まれているようです。 フレッツISDN/ADSLを利用してサーバーを公開されている方の中でも、TAやADSLモデムに公開サーバーマシンを直接接続して、公開サーバーマシン自体がルーターの機能をも果たしている場合にはこのような事態は発生しません。しかし、ダイヤルアップルーターやブロードバンドルーターなどがADSLモデムに接続されており、そのNAT機能の中の静的NATを利用してサーバーを公開されている方は、かなりの確率でこの問題に遭遇することになるかと思います。そこで、ここではその原理と解決方法について解説したいと思います。 |
|
グローバルIPアドレスを持っているのは誰だ?
|
|
本題に入る前に、ここで一度Internet側からWebサーバーが見える原理を復習しておきましょう。 ここでは前提条件の例としてフレッツISDN時代の私の自宅ネットワークを例に取ります。簡単な構成を以下に示します。基本的にはフレッツISDN以外の常時接続系のサービスであっても、ネットワーク構成が同じであれば同じことが言えるはずです。
Internetである特定のホスト(の上で稼動しているサービス)にアクセスする際には、必ずホストが持つグローバルIPアドレスに対してアクセスを行います。独自ドメインを取得していたとしても、DNSを利用して名前を解決した後にIPアドレスでアクセスを行うので、アクセス手段がIPアドレスであろうが独自ドメインであろうがDynamic DNSであろうが同じです。 しかし、実際にグローバルアドレスを持っているホスト(厳密に言えばNetwork Interface Card=NIC)は、フレッツISDN/ADSL+ダイヤルアップルーターの場合はルーター(のInternet側のNIC)になります。このため、グローバルアドレスでアクセスした際の最終到達点は、基本的に公開サーバーではなくルーターそのものになります。ちなみに、ダイヤルアップルーターの物理的なWAN側のインターフェースは基本的にTAもしくはモジュラージャックへの接続口になりますが、論理的にはNICがあると考えて下さい。 それではなぜグローバルIPアドレスを持たない内部のホストに対してグローバルIPでアクセスすることが出来るのでしょうか?これにはダイヤルアップルーターの多くが持つNATという機能の中の、"静的NAT"という機能が深く関わってきます。 |
|
IPマスカレードとは
|
|
ここで静的NATの説明を、といきたいところですが、静的NATを理解するためには、まずIPマスカレード(IP Masquerade)を理解する必要があります。ここではNATについては説明はしませんが、IPマスカレードの例外が静的NATになるからです。 複数マシンをダイヤルアップルーターの下に接続して1つのグローバルIPアドレスでInternetへの接続を行う場合、まず間違いなくダイヤルアップルーターのIPマスカレード機能を利用しています。簡単にIPマスカレードの仕組みを以下に示します。
この仕組みは、ルーターの下に接続されてる複数台の端末から同時にInternetへのアクセスがあっても機能します。上記の図での192.168.0.2:XXXXと210.130.0.111:YYYYの組み合わせが複数になるだけの話です。XXXXとYYYYは1024-65535(特定サービスで利用される予約済みポート番号を含む)までで任意の番号を利用できますので、事実上無制限の台数を同時に接続できると言えます。ルーター内部にグローバルIPアドレス<->プライベートIPアドレスの変換のテーブルを持つNATの場合、接続する端末の数だけグローバルIPアドレスが必要ですが、IPマスカレードの場合は一つのグローバルアドレスで何百台でもインターネットに同時に接続することが可能です。 しかし、冷静に考えれば分かりますが、この仕組みを利用していると外部から内部のホストに対してアクセスすることが出来ません。それは、外部から内部のアクセスする際に内部のどのホストに対して接続を行えばいいのかがルーター側で判断することが出来ないからです。何も設定を行わないまま外部からルーターに割り当てられているIPアドレスに対して接続を行おうとするとルーターの設定画面が出てくるのは、ルーターが割り当てIPに対する接続を自分に対する接続だと理解するためです。 |
|
静的NATとは
|
|
NATに出来てIPマスカレードに出来ないこと、内部ホストの外部への公開が出来ないと言うIPマスカレードの弱点を克服するために考えられたのが静的NATという仕組みです。静的NATの原理は非常に単純です。それは、内部から外部に接続する際の仕組みはそのままにして、外部から内部への接続を特定のホストに転送する、というものです。 例えば、"ポート番号80番に対する外部からのアクセスは、192.168.0.100に転送する"であるとか、"ポート番号6699番に対する外部からのアクセスは、192.168.0.2に転送する"というようなルールをあらかじめルーターに設定しておき、外部からアクセスがあった際にルーターがそのルールに従ってアクセスを振り分ける、と言うことになります。MN128ですと、以下のように記述します。 ip nat 2 192.168.0.100/tcp/www ipcp remote * このルールの意味は、"割り当てIPアドレス(ipcp)に対してTCPプロトコル(tcp)でポート番号80番(www)にアクセスがあったら、192.168.0.100に転送する"と言うことになります。"remote"はこのルールが適用される接続先を意味します。本来はremote+数字で接続先番号を指定するのですが、ここでは"*"で全ての接続先をルールの適用先として指定しています。 最近のダイヤルアップルーターやブロードバンドルーターであれば、ほぼ間違いなくこの機能を持っているはずです。逆にこの静的NAT以外の機能を利用して外部から内部の接続を行う仕組みを提供するダイヤルアップルーターやブロードバンドルーターはないはずです。 |
|
なぜローカルからドメイン名でアクセスできないのか?
|
|
さて、ここで本題にようやく入ります。なぜローカルからドメイン名でアクセスできないのでしょうか?以下にローカルからドメイン名で公開サーバーにアクセスする際に取られる手続きの順番を示します。
ここで重要なのが⑤です。静的IPNATは、外部からのアクセスに対しては適用されますが、内部からのアクセスに対しては適用されません。先ほどのルールを改めてみてみます。 ip nat 2 192.168.0.100/tcp/www ipcp remote * 適用対象なのは、"remote *からのアクセスに対して"なのです。つまり、ローカルからのアクセスに対しては、このルールは適用されないのです。ちなみに、MN128では、IPフィルタでローカルからのアクセスをルールの適用先として指定する場合に利用されるパラメーターとして"local"があるので、それでは ip nat 2 192.168.0.100/tcp/www ipcp local このようなルールを書けばいいじゃないか、と思う方もいらっしゃるかもしれませんが、IP NATのルールでは"local"は指定することが出来ません。指定しようとするとエラーが出ます。もともと静的NATが外部から内部のアクセスに対してターゲットを絞った機能であるわけですから、あたりまえと言えばあたりまえですね。 |
|
それではどうすればいい?
|
|
後ろ向きな解決方法というか、本来の方法と言うか、一番ポピュラーな解決方法としては、そのマシンが持つローカルIPアドレスを利用してアクセスする方法です。先ほどのwww.bflets.dyndns.orgですと、ローカルIPアドレスは192.168.0.100を持っているわけですから、こちらを利用します。この場合は名前を利用してのアクセスをあきらめるということになります。 家庭内LAN的解決方法としては、ローカルドメイン向けのDNSサーバーを立ててしまうという手もあります。そして、ローカルネットワーク上の全てのマシンのDNSサーバーとしてローカルドメイン向けDNSサーバーを指定してしまうのです。もちろんローカルドメイン向けDNSサーバーは、www.bflets.dyndns.orgという名前に対応するIPアドレスとして192.168.0.100を登録しておきます。私はこの手段を利用しています。 第三の手段として、hostsファイルを利用して静的に名前解決を行うと言う手段もありますが、わざわざこれをやるくらいならば、ローカルIPアドレスを利用したほうがいいでしょう。 さらに第四の手段として、"プロバイダなどインターネット側で公開されているプロキシ経由でアクセスする"という手もあります。これが一番お手軽かつ間違いない方法かもしれませんね。 ただし、私のようにガチガチにルーターでフィルタリングするような設定をしている場合には、外部のプロキシサーバーを利用するための設定を加えてやる必要がある場合もあります。実際、私が利用しているプロバイダIIJ4Uのプロキシは、利用しようとするとプロキシから端末に接続要求をかけてきたので、そのままでは利用できませんでした。 |