2013年7月5日

DNSをオーバライドする(Windows)

我が家のインターネットファイアウォールはOpenVPNのサーバとして機能する。普段は仕事先のUbuntuのワークステーションから定常的にtunで接続しており、仕事先から家庭内のLANをアクセスしている。更に、WindowsのラップトップにもOpenVPNのクライアントをインストールしてあり、こちらはWindowsの仕様上tapインタフェースだが、旅行中に滞在先のホテルから家庭内のLANをアクセスするのに重宝している。例えば、旅行中に撮影した写真をラップトップにコピーすると、Genieというバックアップデーモンが自動的に我が家のバックアップサーバにバックアップを作成してくれるし、旅行中に使った金の記録もLAN上の家計簿用マシンに直接記録できる。

今フィリピンを旅行中で、最初のホテルではVPNで快適に家庭内LANをアクセスできていたのだが、二軒目のホテルでは最初の1時間ぐらいはよかったものの、突然動作がおかしくなってしまった。さてはWindowsお得意の要リブート状態かとリブートしてみたが復活しない。調べてみると、DNSに問題が発生していた。このホテルのネットワークはDOCOMO interTouchとやらなのだが、こいつのDNSサーバが特異な動作をしていることが分かった。

そもそも、VPNとは既存のTCP・UDPレイヤの上にIPをトンネリングさせる技術だが、通常DNSはベースつまりUDPを提供しているレイヤのDNSに優先権があり、ベースのDNSが解決できないとVPN上のDNSサーバに解決を委ねるようになっているらしい。だからウチのVPN-LANの場合、外からは見えないLAN内のドメインはベースすなわちホテルのLANのDNSサーバには解決できず、VPN上の我が家の内部DNSサーバにお鉢が廻ってLAN上のプライベートドメインが解決できるはずなのだ。

ところが、このDOCOMO interTouchのDNSサーバは、自分が解決できないドメインをすべて自分自身に解決してしまうようになっているらしい。つまり、ありとあらゆる、出鱈目なドメインを含むグローバルインターネット上に見えないドメインはニセのホストに解決されてしまう。理由はよくわからないが、多分マルウェアによる不正なリダイレクトを防ぐためではないかと想像する。この結果、VPN上の我が家のDNSサーバの出番はなくなり、結果的にVPNで接続された我が家のLAN上のドメインは実質解決できなくなってしまう。最初の1時間ほどが上手く行っていたのは、多分前日に宿泊したホテルで正常に解決できていたものがキャッシュに残っていたのだと思う。

このDOCOMO interTouchのDNSサーバの余計な振舞いを阻止するには、Windowsクライアント上に固定のhostsファイルを置くしかない。hostsファイルの在り処はUnix/Linuxなら/etc/hostsだが、Windowsでは%SystemRoot%\system32\drivers\etc\hostsで、通常はC:\Windows\system32\drivers\etc\hostsとなる。Windowsのhostsファイルの文法はUnix/Llinuxのそれとは異なり、「IPアドレス ホスト名」である。

取り敢えず必要なLAN上のホストをhostsファイルに書き込んでみたところ上手く行った。

今後LAN上のDNSに変更があるたびに一々手でWindowsクライアントのhostsファイルをアップデートするわけにもいかないので、cronで定期的に自動アップデートを実行、すなわち我が家のプライベートDNSの解決データをキャッシュするスクリプトを書こうと思ったが、このWindowsラップトップにインストールしてあるCygwinのsshdがdllファイルの一つが足りなくて動作しないことが分かった。Cygwinは個別のパッケージを管理するツールがないようで、setup.exeですべてをインストールし直し(あるいはすべてをアップデート)することになり、ホテルの低速インターネットで明日の朝までに完了するかどうかは分からない。

0 件のコメント:

コメントを投稿