LAN内のローカルIPサーバにグローバルアドレスでアクセスする


※この記事はbellmega.com(旧サイト)で2011/10/17に公開したものです(一部修正)。なお、現在の天さんちの環境はこの記事のものと大きく異なっており、そもそもドメインが変わっている上に、自宅ネットワークを名前で公開していません。

LAN内のサーバにグローバルなURLでアクセスしたいってなお話。

下図にうちのネットワーク構成を簡単に示します。うちの環境はダイナミックDNSでインターネットから参照されていて、ルータが80ポートのリクエストを受け取ったときにだけやよいサーバへリクエストを投げるようなしくみになっています。ところがこの構成には大きな弱点ががが。

天さんちネットワーク図LAN内の作業端末からサーバへHTTPリクエストを送る際、外部公開しているグローバルなドメインを使うことができません。なぜかというと、(これはルータ製品の仕様にも依るかもですが)ルータは「外部からの80ポートアクセス」をサーバへ送るのであって、内側からのアクセスは自分自身のIPへのアクセスとみなして処理してしまうからです。実際、LAN内の端末からbellmega.comを叩くと、ルータの設定ログイン画面が表示されてしまいます。

ルータがWAN IPへのリクエストをLANに戻すことができればいいのですが、ルータは本来NAT動作を行うべきですので、ローカルからローカルへのアクセスができないというのは致し方ない問題と言えます。この問題はうちのルータが機能的に足りない子だからというわけではないでしょう。

したがって、この問題を解決するには「端末からサーバへのリクエストがグローバルドメインでありつつローカルIPアドレスで通信」しなければならないということになります。つまり、LAN内の端末に、本来の名前解決とは異なるLAN内のみの名前解決を強制的に指定してやればいいわけです。こういう場合、Linuxの場合は/etc/hostsを書き換えますが、Windowsにもhostsファイルはちゃんとあります。C:\Windows\System32\drivers\etc\hostsファイルを書き換えましょう。分かりにくいところにあるなあ。下記の例のIPアドレスは伏せているだけですので、サーバのローカルIPを普通に書けばOKです。

# Copyright (c) 1993-2009 Microsoft Corp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP for Windows.
#
# This file contains the mappings of IP addresses to host names. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#	127.0.0.1       localhost
#	::1             localhost
192.168.x.y	bellmega.com

この解決方法の欠点は、なんといっても端末全てにhostsの変更を入れなければならないことです。この欠点を避けるにはNAT変換以外の方法で外部/内部リクエストを処理する構成が必要でしょう。具体的にはローカルDNSを立てて名前解決をすることですが、個人レベルでそこまでやる必要性は薄いでしょうねえ。

とか言ってますけど、結局3年後にDNS立てちゃいましたね

samba4が出たのが大きかったよね~


コメント投稿フォーム