LAN内から自宅公開Webサーバーにアクセスする方法

Web Stationの設定~DiskStation DS218j】からの続きの記事です。

自宅内にあるサーバーをWebサーバーなどで外部公開する場合、

  1. 自宅サーバーに固定のローカルIPアドレスを割り当てる。
  2. ルーターを使ってルーターのグローバルIPアドレスから自宅サーバーのローカルIPアドレスに変換して外部からのアクセス要求を受け付けられるようにする。
  3. DNSサーバーでルーターのグローバルIPアドレスに対して正引きのホスト名を設定【SynologyのDDNS設定~DiskStation DS218j】し、ホスト名でルーターのグローバルIPアドレスにアクセスできるようにする。

という形をとるのが普通ですね。そこで問題になるのが、

  1. パブリックなDNSサーバーは、公開に必要なホスト名をグローバルIPアドレスにしか名前解決しない。
  2. LANの内部の端末から自宅内の公開サーバーにアクセスするにはローカルIPアドレスでアクセスしなければならないのに、端末が参照しているDNSサーバーはグローバルIPアドレスしか返してくれない。

という現象によって、例えばNOMI宅内のパソコンやスマホから、LAN経由で同じくNOMI宅内にあるDS218jのWebサイトを見ようとしてDDNSホスト名”wwq.myDS.me”をブラウズしてもアクセスできない、ということになります。

環境によってはDS218jではなくルーターの管理画面へのアクセスが行われることがあります。ちょっと怖い。

対象がメールサーバーやFTPサーバーなら、ローカルIPアドレス”192.168.100.201″と直打ちで設定すれば良いのですが、DS218jに限らずほとんどのWebサーバーは名前ベースのバーチャルホスト機能でサイトを公開しているので、サイトを閲覧するにはホスト名とIPアドレスをセットで要求しなければならず、うまくいかない、というわけです。

もちろん、いくつか解決方法はあります。

端末の”hosts”ファイルに正引き情報を記述する

多くの端末には、参照DNSサーバーやルーターのDNSキャッシュ、端末内部のDNSキャッシュなどの情報よりも優先して名前解決をやってくれる仕組みとして通称”hosts”ファイルがあります。

hosts

hosts(ホスツ)とは、TCP/IPを利用するコンピュータにおけるホスト名のデータベースで、IPアドレスとホスト名の対応を記述したテキストファイルである。hosts のフォーマットは、4.2BSDで登場した。インターネットの初期には、集中的に管理されている hosts ファイルをコピー(ダウンロード)して、各ノードで使用する、といった単純な運用が行われていた時代もあったが、DNSが一般的になった以後は、hosts ファイルには各ノードでローカルに必要な最低限の対応のみ記述し、外部へのアクセスに必要な名前解決はもっぱらDNSで行う、という運用が普通となっている。

出典:ウィキペディア

例えばWindows10の場合、

  1. 「メモ帳」を「管理者として実行」する(hostsファイルは管理者にしか書き換えられません)。
  2. 「メモ帳」で”c:\Windows\System32\drivers\etc”(正確には”%windir%\System32\drivers\etc”)の中にあるテキストファイル”hosts”を開く。
  3. ファイル内のどこかに先頭から、[ローカルIPアドレス][半角スペースまたはタブ][ホスト名]と記述して保存する。

Windowsのhostsファイル設定例

と設定すれば”wwq.myDS.me”で自宅内のDS218j上のWebサイトを見ることができるようになります。

ただしこの方法にはいくつか問題があります。

  • 使えないOSがある

“hosts”ファイルはWindows系だけではなく、UNIX系のOS、例えばMacintoshやその派生のiOS、Androidなど多くの端末用OSにすべからく存在しますが、不正なアプリなどで勝手に書き換えられないように、書き換えには管理者の権限が必要になります。そのため、ユーザーに管理者権限が与えられていないiOSでは修正不可ですし、Androidではrootをとるかadbコマンドを使えるようにするとかしない限り修正できません。

  • 切り替えが面倒

せっかく”hosts”ファイルを修正してローカル環境からWebサイトを見れるようになっても、その端末を外に持ち出して外部インターネット環境からアクセスするには”hosts”ファイルの設定を無効にしなければなりません。自宅に置きっぱなしのパソコンなら問題ありませんが、モバイルの場合は面倒ですね。