Cisco AnyConnectでVPN接続中にSplitTunnelingが有効でもインターネットアクセスができなくなった?

Network

 

気付いたときにはアクセスできなくなっていました・・・。原因としては、ズバリDNSでの名前解決ができなかったため。じゃあなぜ名前解決ができなくなったのか?根本的な原因は未だ究明できていないのですが、Cisco AnyConnectを使っている範囲での対応ということでのワークアラウンドを残しておきます。

 

ある日、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サーバ情報を抜くという方法も解決策にはなりませんでした。

まとめると、以下のような感じになります。

AnyConnectのDNS参照仕様
  • Connection ProfileにDNSサーバのIP指定は必須
  • 指定されたDNSサーバのIPはSecured Routesに登録される
  • VPN接続後は、接続前のDNSサーバは参照できなくなる

このことからすると、VPN接続先のネットワーク上でDNSを稼働させる必要性が出てきてしまいました。実は、前回の記事で複数ネットワークごとに異なる情報を返すDNSが欲しくなったのはこのためだったのです。

BINDのViewを使って複数のネットワークごとに見せる情報を変える

 

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経由で参照させたほうが、なんとなくシックリきます。