Cisco AnyConnectが使いづらいので,代替としてOpenConnectを使う
大学のVPN
大学のVPNで色々と問題があったけれど,なんとか解決できたっぽい.
officialな方法だと使わされるAnyConnectが悪いのかはわからない.
少なくともルーティングの設定などが(そもそも出来るのかしらんけど)分かりにくいのは確か.
問題点
今回の方法で解決できるのは以下の2つの問題.
原因
- なんでQiitaとかのサイトに繋がらないかはわからん
- 大学側行きの通信だけ,大学側のゲートウェイに流したいけど,AnyConnectだと設定が弄れなさそう(よくわからん)
解決法(セキュリティ的に問題があったらゴメン)
- AnyConnectの代わりにOpenConnect使う
- OpenConnectの設定ファイルをいじってルーティングを設定する
以下で手順を解説していく.
手順
OpenConnectのインストール
OpenConnectは
OpenConnect is an SSL VPN client initially created to support Cisco's AnyConnect SSL VPN.
らしい.
- 公式サイト?はココ (https://www.infradead.org/openconnect/index.html)
- 最終の更新が2018年で嫌だけど,自分はGUIのほうを使いました (https://github.com/openconnect/openconnect-gui/releases)
こんな感じの画面が開きます.
自分の場合は設定済みなのでServerにTMU-VPNって出てるけど気にしないでください.
OpenConnectの接続設定
File -> Profiles -> New profile
から大学のGatewayを入力.
入力したら,Save&Connect押して,そもそも接続できるか試しとくと良いかも.
ルーティング設定
OpenConnectのルーティングの設定はvpnc-script.js
を弄れば良いらしい.
vpnc-script.js
はexeファイルと同じ階層にあった.
25行目のコメントを読むと-1を設定すれば上書きされなさそうなので,
// How to add the default internal route // -1 - Do not touch default route (but do other necessary route setups) // 0 - As interface gateway when setting properties // 1 - As a 0.0.0.0/0 route with a lower metric than the default route // 2 - As 0.0.0.0/1 + 128.0.0.0/1 routes (override the default route cleanly)
このコメントのすぐ下のコードの0の部分を-1に書き換える.
# 編集前 if (env("REDIRECT_GATEWAY_METHOD")) { var REDIRECT_GATEWAY_METHOD = env("REDIRECT_GATEWAY_METHOD"); } else { var REDIRECT_GATEWAY_METHOD = 0; } # 編集後 if (env("REDIRECT_GATEWAY_METHOD")) { var REDIRECT_GATEWAY_METHOD = env("REDIRECT_GATEWAY_METHOD"); } else { var REDIRECT_GATEWAY_METHOD = -1; }
ぱっとみ環境変数を使った方がお行儀が良いかも.
次に-1の場合のルーティングを書き加える.
163行目以降の// Add internal network routes
から始まるブロックを参考にしつつ,その下に-1のパターンを追記.
IPアドレスとマスクの部分は各自置き換えてください.
// Add internal network routes echo("Configuring Legacy IP networks:"); if (env("CISCO_SPLIT_INC")) { // Waiting for the interface to be configured before to add routes if (!waitForInterface()) { echo("Interface does not seem to be up."); } for (var i = 0 ; i < parseInt(env("CISCO_SPLIT_INC")); i++) { var network = env("CISCO_SPLIT_INC_" + i + "_ADDR"); var netmask = env("CISCO_SPLIT_INC_" + i + "_MASK"); var netmasklen = env("CISCO_SPLIT_INC_" + i + "_MASKLEN"); exec("route add " + network + " mask " + netmask + " " + internal_gw); } } else if (REDIRECT_GATEWAY_METHOD > 0) { // Waiting for the interface to be configured before to add routes if (!waitForInterface()) { echo("Interface does not seem to be up."); } if (REDIRECT_GATEWAY_METHOD == 1) { exec("route add 0.0.0.0 mask 0.0.0.0 " + internal_gw + " metric 1"); } else { exec("route add 0.0.0.0 mask 128.0.0.0 " + internal_gw); exec("route add 128.0.0.0 mask 128.0.0.0 " + internal_gw); } } echo("Route configuration done."); // --------------------------------------追記した部分-------------------------------------- if (REDIRECT_GATEWAY_METHOD == -1) { // Waiting for the interface to be configured before to add routes if (!waitForInterface()) { echo("Interface does not seem to be up."); } exec("route add 大学のIPアドレス mask 大学のマスク " + internal_gw + " metric 1"); } // --------------------------------------追記終わり-------------------------------------- if (env("INTERNAL_IP6_ADDRESS")) { echo("Configuring " + env("TUNIDX") + " interface for IPv6..."); exec("netsh interface ipv6 set address " + env("TUNIDX") + " " + env("INTERNAL_IP6_ADDRESS") + " store=active"); echo("done.");
これで,大学行きの通信だけそっちのゲートウェイを使ってくれそう.
設定前と設定後のVPN接続時の,tracert www.youtube.com
の結果とか見て,ちゃんとルーティング出来てるか確認してみてください.
(Linuxだったらtraceroute
,Windowsだったらtracert
)