2016年12月02日の日記です


Windows で、二つのネットワークにまたがる VPN 設定を行う  2016-12-02 17:31:30  コンピュータ

仕事で VPN が必要になった。


VPN 、Virtual Private Network 、の略だ。

今まで使う必要はなかったのだけど、インターネットではよく使われる技術で、Windows8 以降では、システムに標準で組み込まれている。


インターネットというのは、そもそも「ネットワーク」を相互 (inter-) 接続したものだ。

それぞれのネットワークは独立していて、状況によっては、接続しているにもかかわらず閉じている。


会社なんかで「社内ネットワーク」という言葉を聞いたことがある人も多いだろう。

社内のネットワークは、社内からはアクセスできるけど、外部からは守られている。

そうしないと、社外秘の情報とかが外部にダダ漏れになるかもしれないからね。


会社の社内ネットワークにありながら、外部に開かれている「WEB サーバー」などもある。

こうしたサーバーは、「社内」を囲む壁にまたがるように設置されている。だから、どちらからも見ることができる。


ただまたがっているだけじゃない。

サーバーは社内と社外を区別する。社内からはページの書き換えもできるけど、社外からは見るだけで、それ以外の動作は一切できない、というような設定が行われている。



つまり、ある場所に作られた「ネットワーク」は、基本的に閉じた系を作っている。

閉じた壁の上に置かれたサーバーは、外部からも見えるのだけど、内部と外部を見分ける能力がある。


本当は細かな技術とかいろいろあるのだけど、ざっくりいえばこんな感じ。




じゃぁ、WEB サーバーのページを更新しようと思ったら、必ず会社内まで物理的に移動しないといけないのか。


いや、そんなことはない。ここで VPN が登場する。

社内…つまり Private な Network を、仮想的 Virtual に実現するのだ。



WEB サーバーのように「壁」にまたがる形で、VPN サーバーを作っておく。

VPN クライアントが VPN サーバーに接続すると、VPN サーバーはクライアントを代理し、「社内ネットワークに新たなマシンが接続された」ように振る舞う。


たぶん、社内には DHCP サーバーがあり、新しいマシンが接続されると社内用の IP アドレスを払い出す。

クライアントは、もともとの IP アドレスに加え、新たな IP アドレスも得る。


これでクライアントは、社内 LAN に接続した状態になった。

…のか?




一応、VPN の設定としては上の通りで正しい。


お使いのマシンには二つの IP アドレスが割り振られ、社内 LAN に接続されたマシンとしての IP アドレスも使える状態になっている。

でも、優先されるのはもともと持っていた IP アドレスだ。

今まで通り社外のマシンとしてインターネットに接続し、会社のサーバーにアクセスしようとしても、できない。


元々の IP アドレスよりも VPN の IP アドレスを優先させる、という設定は可能だ。

でも、これをやった場合は、今度は完全に社内 LAN に組み込まれた状態になり、通常使用していた IP アドレスを使わなくなる。


今回の場合がそうだったのだけど、家庭内 LAN に組み込まれたマシンで VPN に接続すると、家庭内のサーバーが見えなくなる。

これは不便だ。



Windows に限らず、ネットワークには「ルーティング」という概念がある。

通信時に使う経路… route を決める作業だから、routing だ。

VPN を使うことで、マシンには二つの「道」がつながっている。先に書いた通り、VPN の経路が優先されてしまうが、そうならないようにルーティング規則を書いてやればよい。


この規則は、VPN に接続を行ったときと、切断した時に書き換えられる必要がある。


すでにそのためのスクリプトが作られていて、参考にさせてもらった。


リンク先を見てもらえばわかるが、スクリプトは自分の接続する VPN 環境に応じて、少し書き換える必要がある。


ここで重要なのは、ルーティングの際には「接続先 IP アドレス」を参考にして、マシンが持っている2つの IP アドレスのどちらを使うか決定する、という点だ。


先のスクリプトに登録した IP アドレス(上位3バイトによる範囲指定)は、VPN 経由となる。

それ以外のすべては、家庭内 LAN を使う。


さぁ、これで正しい設定か?




いや、実はまだ正しい設定にはなっていない。

マシンに設定された DNS サーバーアドレスは、今までのままなのだ。


社内サービスのサーバーにも、おそらく名前がついているだろう。

そのサーバー名に応えてくれるのは、おそらくは社内 LAN に置かれた DNS サーバーだけだ。


だから、DNS サーバー名を書き換えなくてはならない。

先のスクリプトを改造しよう。


たとえば、社内 LAN の DNS サーバーが 172.16.0.1 と 172.16.0.2 に置かれていたとしよう。

WindowsPowerShell では、DNS サーバーの設定は Set-DnsClientServerAddress で行う。


マシンは複数のネットワークに接続した状態になっているけど、これらのネットワークには名前がついている。

おそらく、Windows 10 の日本語版なら「イーサネット」が標準ネットワークだ。この DNS を書き換える。


Set-DnsClientServerAddress -InterfaceAlias "イーサネット" -ServerAddresses "172.16.0.1","172.16.0.2"


スクリプトでは、VPN 接続に成功すると、プログラムが最後まで走りきる。

だから、この1行を一番最後に追加しよう。


もう一つ、VPN 切断時に、家庭内 LAN の DNS に戻す必要があるだろう。

こちらは、プログラム中ほどの if 文…if ブロック内に exit; が入っている上に入れる。

VPN 接続がなかった場合は、この if 文によって終了しているためだ。




これで、VPN 接続すると、VPN 接続先の IP アドレスだけは VPN に流すようにルーティング設定し、VPN 接続先の DNS を使用する状態になる。

切断すれば元に戻る。


…そう、気づいた人も多いだろうけど、VPN 接続中は家庭内 LAN の DNS が使えない。



DNS は解決できない時のための「代替サーバー」を置くことができる。

これを使えば解決できそうだけど、実はうまくいかない。


理由は、WEB サーバーなどには社内アクセス用と公開用で、違うアドレスがついているのが普通だからだ。

家庭内 LAN の DNS が社内 WEB サーバーの名前解決をしてしまうと、その時点で社外からのアクセスとなってしまい、VPN 経由のアクセスとならない。


#実際には、Windows は名前解決手段として、ありとあらゆる手法を駆使することも問題ともなる。

 名前解決手段が多数あるのは便利なのだけど、混乱も引き起こす。そこに違う内容の DNS サーバーを「代替」として混ぜると、破綻を招く結果となる。

 たとえ上のような「2つのアドレス」の問題がない場合でも、やってはならない設定だ。



仕方がないので、VPN 接続中に困らないように、最低限の家庭内 LAN のホスト名を hosts ファイルに書くことになる。

原始的な方法だけど、原始的だから信頼ができ、応用が利くのだ。


windows の hosts ファイルは C:/Windows/System32/drivers/etc/hosts にある。




家庭内 LAN 全体を VPN 接続してしまえば、上手く解決できるかもしれない。


DNS サーバーは、問い合わせられたドメイン名ごとに、問い合わせ先 DNS を振り分け(フォワード)する仕組みを持つ。

だから、社内 LAN で使いたい名前だけ、社内 LAN DNS に問い合わせるよう設定すればいい。


でもそれは、家庭内 LAN 全体を、ここに書いたような不安定さを含む問題のある VPN に巻き込むことになる。

それは嫌なので、今回はそこまで踏み込まず、Windows 1台だけを VPN 接続することにした。


Windows 自体に、ドメイン名ごとに DNS サーバーを切り替える機能があればいいのだけど、調べてもそのような機能は無いように思う。




最後に、ネットワークが正しく設定できか、確認方法を書いておこう。

コマンドプロンプトを使う。

(先ほどのスクリプトは PowerShell 用だったが、以下のコマンドはコマンドプロンプト用なので注意)


マシンにつけられた IP アドレスは、以下のコマンドで見ることができる。

(途中で書いたが、普段使う IP アドレスが「イーサネット」と名付けられていることも、ここで確認できる)


netsh interface ip show address


現在の DNS サーバーは、以下のコマンドで調べることができる。


netsh interface ip show dnsservers


ルーティング設定は以下のコマンドで見ることができる。


route print


DNS サーバーに接続し、問い合わせを行った結果を表示するには、以下のコマンドを使う。

(途中で書いたが、Windows は複数の問い合わせ方法を持つ。

 このコマンドは DNS のみを扱うので、実際の処理と異なる場合がある)


nslookup host.domain


実際にパケットが通過する経路を調べるには、以下のコマンドを使う。


tracert host.domain



コマンド名は示したので、使い方の詳細などは検索すれば簡単に見つかるだろう。


これで、VPN 側でアクセスしたいサーバーへの通信が正しく VPN に流れ、それ以外の通信は VPN に流れないことを確認できれば、ネットワーク設定は完了だ。




同じテーマの日記(最近の一覧)

コンピュータ

関連ページ

テレワーク【日記 20/04/09】

別年同日の日記

04年 誕生日プレゼント


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

0000

-- follow --




- Reverse Link -