気付いたときにはアクセスできなくなっていました・・・。原因としては、ズバリDNSでの名前解決ができなかったため。じゃあなぜ名前解決ができなくなったのか?根本的な原因は未だ究明できていないのですが、Cisco AnyConnectを使っている範囲での対応ということでのワークアラウンドを残しておきます。
Contents
ある日、DNSサーバ参照ができなくなっていたことに気付く
最近はリモートワークで社内LANにアクセスすることもある一方で、別のLANにもリモートアクセスすることが多々ありました。アクセスするごとに切り替えを行うのは面倒だったので、どちらにもアクセスできるようにしていました(もちろんセキュリティが担保されている前提です)。
が、社内のLANにCisco AnyConnectを使ってVPN接続を行うと、ブラウザでインターネット上のWebサイトにアクセスできないことに気が付きました。もともと、別のリモートアクセスLANにはIPベースで接続していたのでそちらは問題ありませんでした。結果的にはDNSが参照できなかったためなのですが、なぜ突然できなくなったのかは不明でした。
図にすると上のような感じです。
元々、Cisco AnyConnectのデフォルト仕様では、リモートアクセスVPN接続の際にはローカルネット(インターネット直接を含む)アクセスができないようになっています。ただしそれだとインターネットでWebを参照して調べごとをする際などに不便だったので、Split Tunneling(スプリットトンネリング)機能を使ってローカルアクセスも許可する設定にしていました。
つまり、社内LAN(172.24.12.0/24)へのルートだけはセキュアトンネルを通り、それ以外のアクセスはそのままデフォルトゲートウェイを経由してインターネットに出ていくという、ルートを分割(Split)するものです。
AnyConnect接続時に設定されるDNSが参照できなくなる
AnyConnect(根本を言えばCisco ASA)の設定は今まで変更していなかったので、クライアントであるWindows10のVPN関連モジュールのセキュリティ仕様が変わったのではないかと疑っています。確証があるわけではないのですが、おなじくAnyConnectを使った接続でも、Android端末では全くそのような問題は出ていないので・・・。いずれにせよ何とかしてDNSを参照させてやる必要があります。
そこでまず、AnyConnectでVPN接続された際のDNSの参照先がどのように設定されるかを確認してみました。
検証①:非接続時
VPN接続がされていない時は、ノートPCにDHCPで指定されたDNS(私の場合はモバイルルータがデフォルトGW兼DNSサーバ)を参照します。
検証②:VPN接続時
AnyConnectでVPN接続されると、ノートPCには1つ仮想ネットワークインタフェースが追加され、そこにVPN接続先ネットワークに所属するIPが割り振られると同時に、ASAのConnection Profileに設定したDNSを優先的かつ排他的に参照するようになります。つまり、この時点でモバイルルータのDNSはどうあっても参照できなくなります(Split Tunnelingを有効にしているのに、この仕組みがよくわからない・・・)。
しかも、Connection Profileによって指定されたDNSサーバのIPは、AnyConnectの「Secured Routes」として登録されてしまいます。つまり、参照するDNSサーバはVPNトンネルの向こう側にあると認識されてしまいます。私は今まで、Google Public DNSである8.8.8.8をDNSサーバとしてConnection Profileに登録していたのですが、VPNで保護するのはあくまで172.24.12.0/24のネットワークだけなので、当然8.8.8.8へのアクセスはできず、名前解決ができなくなってWeb参照エラーとなったのです。
結論:Connection ProfileのDNSサーバ情報は必須
なので今度は、Connection ProfileからDNSサーバ情報を抜いたらどうなるのだろう?と思って試してみたのですが、そうするといずれのDNSも参照してくれませんでした(モバイルルータのDNSも参照してくれない)。というわけで、Connection ProfileからDNSサーバ情報を抜くという方法も解決策にはなりませんでした。
まとめると、以下のような感じになります。
- Connection ProfileにDNSサーバのIP指定は必須
- 指定されたDNSサーバのIPはSecured Routesに登録される
- VPN接続後は、接続前のDNSサーバは参照できなくなる
このことからすると、VPN接続先のネットワーク上でDNSを稼働させる必要性が出てきてしまいました。実は、前回の記事で複数ネットワークごとに異なる情報を返すDNSが欲しくなったのはこのためだったのです。
Cisco ASA5505 設定
Split Tunnelingおさらい
いちおう、Split Tunnelingの設定をおさらいしておきます。
ASDMのグループポリシー設定にて、左側のペインで[Advanced] – [Split Tunneling]を選択します。Network Listに、ここでは「Split-Tunneling-List」とありますが、これがVPN通信で保護する対象のネットワークリストになります。これは右側のManageから追加することができます。
ACL Managerの内容。ここに「inside-network/24」というのが登録されていますが、これはデフォルトで定義されている「内部ネットワーク」の定義です。実際は「+Add」をクリックして追加します。ここでは内容確認のため「Edit」をクリックしています。
ここで、inside-networkが172.24.12.0だということを確認できます。
Connection ProfileでのDNS設定
忘れやすいので念のためですが、Connection Profileのに指定するDNS設定です。
今までは、上記のようにGoogle Public DNSを設定していました。これを・・・
上記のように、VPN接続先のLAN上にあるDNSサーバに変更します。
設定としてはこれでOKです。
AnyConnectでの確認
最後に、VPNクライアント上で正しくDNS設定がされ、かつ参照できてインターネットへのWebアクセスができることも確認します。
上記が接続後の「Route Details」タブの内容です。Split-TunnelingにてVPN通信対象となったネットワーク「172.24.12.0/24」と、Connection Profileに指定した「172.12.147/32」がSecured Routesに登録されています。
まとめ
なぜ突然?ということを考えてしまうと非常に気持ちが悪いのですが、本来的にはDNSクエリがセキュアネットワークを経由するのはむしろアリだと思っています。
例えばですが、VPN接続先のリソース(Webサーバ等)の参照においては、外部からも内部からも同じFQDNだったりしますが、それをわざわざインターネット経由で参照させるよりは、VPN経由で参照させたほうが、なんとなくシックリきます。