Cisco AnyConnectが使いづらいので,代替としてOpenConnectを使う

大学のVPN

大学のVPNで色々と問題があったけれど,なんとか解決できたっぽい.
officialな方法だと使わされるAnyConnectが悪いのかはわからない.
少なくともルーティングの設定などが(そもそも出来るのかしらんけど)分かりにくいのは確か.

問題点

今回の方法で解決できるのは以下の2つの問題.

原因

  • なんでQiitaとかのサイトに繋がらないかはわからん
  • 大学側行きの通信だけ,大学側のゲートウェイに流したいけど,AnyConnectだと設定が弄れなさそう(よくわからん)

解決法(セキュリティ的に問題があったらゴメン)

  1. AnyConnectの代わりにOpenConnect使う
  2. OpenConnectの設定ファイルをいじってルーティングを設定する

以下で手順を解説していく.

手順

OpenConnectのインストール

OpenConnectは

OpenConnect is an SSL VPN client initially created to support Cisco's AnyConnect SSL VPN.

らしい.

こんな感じの画面が開きます.
自分の場合は設定済みなのでServerにTMU-VPNって出てるけど気にしないでください.

f:id:goldfish-man:20201110220651p:plain
GUI画面

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だったらtracerouteWindowsだったらtracert)