フューチャー技術ブログ

MacのVPNをコマンドでスムーズに切り替えよう

はじめに

複数のVPNを切り替える際に、認証情報(Username, Password)を入力することが面倒で、パスワードを間違えると、再度入力しないといけなくなり、わずかでありながらも、仕事する中の小さなストレスだと感じています。

今回は、コマンドでスムーズに複数のVPNを切り替える方法を紹介します。
コマンドを紹介する前に、なぜ複数VPNを使っているかを話します。

切り替えているVPN

筆者は普段から、開発したソースコードをGithubにプッシュしたり、DBにアクセスしたりします。

Githubへのアクセスは社内VPN、DBには別のVPNに接続する必要があります。

社内VPNからDB接続できるようにすればいいじゃないかと思いますが、社内VPNから顧客システムDBに接続できると、関係者以外の社員もアクセスできてしまいますので、まずい話です。

社内VPNはCisco AnyConnectで接続し、DB接続用VPNはMac OS標準のVPN機能を使用しています。

社内VPN (Cisco AnyConnect)

Cisco社のAnyConnectを使用しています。

接続するために、AnyConnectを開き、接続先を選択します。

System keychainのアクセス許可が求められ、Username と Password を入力する必要があります。(面倒)

Screen_Shot_2022-06-19_at_15.33.36_1.png

さらに、Cisco Anyconnect からも Username と Password を求められ、再度入力します。

ここまでできて、やっと社内VPNに繋がります。
1日のはじめに、Mac起動後に1回だけこの作業をやるのであれば、まだ我慢ができます。
ただ、1日に何回もDB接続する場面があったりするので、Cisco AnyConnect も何回も接続/切断する羽目になります。

DB接続用VPN

DB接続用VPNはCisco AnyConnectを使わず、Mac OS標準のVPN機能を使用します。
(System Preferences > Network から設定するVPN)

↑のように、ネットワーク設定画面から接続/切断できますが、
↓のように、ツールバーにVPNアイコン配置して、VPNの接続/切断もできます。

VPNをスムーズに切り替えるコマンド

上で説明したVPN切り替え操作は、コマンドラインからでも実現できます。
下記のコマンドで Cisco VPN に切り替えます。

ciscovpn.sh
# Disconnet VPN
scutil --nc stop ${VPN};

# Connect Cisco AnyConnect
/opt/cisco/anyconnect/bin/vpn -s < ~/.vpn/CISCO_VPN.cre connect ${CISCO_VPN};

また、下記のコマンドで、標準機能VPNに接続できます。

vpn.sh
# Disconnect Cisco AnyConnect
/opt/cisco/anyconnect/bin/vpn -s disconnect;

# Connet VPN
secret=`cat ~/.vpn/vpn`;
scutil --nc start ${VPN} --secret ${secret};
unset secret;

ではここから、それぞれのVPNに切り替えるコマンドを解説します。

Cisco VPN に切り替えるコマンド

標準機能VPNを切断して、Cisco VPNに接続します。

ciscovpn.sh
# Disconnet VPN
scutil --nc stop ${VPN};

# Connect Cisco AnyConnect
/opt/cisco/anyconnect/bin/vpn -s < ~/.vpn/CISCO_VPN.cre connect ${CISCO_VPN};

scutil コマンドを使用して、環境変数 VPN で指定した標準機能VPNを切断します。

scutil --nc stop ${VPN};

次にvpnコマンドを使用して、環境変数CISCO_VPNで指定したCisco VPNに接続します。
Username、Passwordと確認の入力を求められますので、入力します。

$ /opt/cisco/anyconnect/bin/vpn -s connect ${CISCO_VPN};
>> Please enter your username and password.

Username:
Password:
accept? [y/n]: y
>> state: Connecting
...

毎度入力するのが面倒なので、Username、Passwordと確認の入力(Yesの)yが書き込まれているテキストファイルを用意します。

Username
Password
y

リダイレクトを使って標準入力の入力元として、このテキストファイルを指定してあげると、Username、Passwordと確認の入力を手入力しなくて済みます。

/opt/cisco/anyconnect/bin/vpn -s  < ~/.vpn/CISCO_VPN.cre connect ${CISCO_VPN};

アプリケーションAnyConnectを起動している状態で、vpnコマンドを実行すると、怒られます。

$ /opt/cisco/anyconnect/bin/vpn -s  < ~/.vpn/CISCO_VPN.cre connect ${CISCO_VPN};
...
>> error: Connect not available. Another AnyConnect application is running
or this functionality was not requested by this application.
VPN>

アプリケーションAnyconnetを閉じて、再度実行すると、無事に接続できます。

$ /opt/cisco/anyconnect/bin/vpn -s  < ~/.vpn/CISCO_VPN.cre connect ${CISCO_VPN};
...
!!!!!!!!!!! WARNING !!!!!!!!!!!
This is a private system.
Unauthorized access is prohibited by law.
Violators may be prosecuted.
If you are not authorized to access this system,
please disconnect now.

!!!!!!!!!!! NOTICE !!!!!!!!!!!
When browsing the Web via WebProxy,
user authentication is absolutely necessary.
Please enter user ID and password on the authentication
screen without adding "xxxxxx".

>> state: Connecting
>> notice: Establishing VPN session...
>> notice: The AnyConnect Downloader is performing update checks...
>> notice: Checking for profile updates...
>> notice: Checking for product updates...
>> notice: Checking for customization updates...
>> notice: Performing any required updates...
>> notice: The AnyConnect Downloader updates have been completed.
>> state: Connecting
>> notice: Establishing VPN session...
>> notice: Establishing VPN - Initiating connection...
>> notice: Establishing VPN - Examining system...
>> notice: Establishing VPN - Activating VPN adapter...
>> notice: Establishing VPN - Configuring system...
>> notice: Establishing VPN...
>> state: Connected

標準機能VPNに切り替えるコマンド

今度はCisco VPNを切断して、標準機能VPNに接続するので、上記のコマンドと逆のことをやっています。

vpn.sh
# Disconnect Cisco AnyConnect
/opt/cisco/anyconnect/bin/vpn -s disconnect;

# Connet VPN
secret=`cat ~/.vpn/vpn`;
scutil --nc start ${VPN} --secret ${secret};
unset secret;

vpnコマンドで、Cisco VPNを切断します。

$ /opt/cisco/anyconnect/bin/vpn -s disconnect;
Cisco AnyConnect Secure Mobility Client (version 4.10.04071) .

Copyright (c) 2004 - 2021 Cisco Systems, Inc. All Rights Reserved.

>> state: Connected
>> state: Connected
>> registered with local VPN subsystem.
>> state: Disconnecting
>> notice: Disconnect in progress, please wait...
>> state: Connected
>> notice: Connected to XXXXXX.
>> state: Disconnecting
>> notice: Disconnect in progress, please wait...
>> state: Disconnecting
>> state: Disconnected
>> notice: Ready to connect.
VPN>

scutilコマンドを使用して、環境変数VPNで指定した標準機能VPNに接続する際に、事前共有鍵が必要となります。
そのため、鍵情報をテキストファイルに保存して、環境変数secretとして読み込んだ上で、実行します。

secret=`cat ~/.vpn/vpn`;
scutil --nc start ${VPN} --secret ${secret};
unset secret;

VPN切り替えコマンド導入の効果

コマンドを導入したことで、どの程度スムーズに切り替えることができるのか、時刻コマンドで実際の処理時間を測ってみます。
Mac OSだと、標準の時刻コマンド date は秒までしか指定できないので、代わりにナノ秒を指定できる gdate コマンドを使用して、計測します。

+ start=`gdate +%s.%N`

# 計測する処理

+ finish=`gdate +%s.%N`
+ diff=$( echo "$finish - $start" | bc -l )
+ echo 'execution time:' $diff

計測した結果、Cisco AnyConnect に接続する ciscovpn.sh は 約2.3秒

execution time: 2.335424000

VPNに接続する vpn.sh は約 0.8秒となりました。

execution time: .785082000

通常の手動ですと、VPNの切り替えに10秒程度はかかることと比べて、2秒程度で切り替えられることを考えると、VPNをスムーズに切り替えられていると言えます。
また、手動によるパスワードの入力間違いなどもなくなり、小さいながらもストレス軽減に繋がっています。

まとめ

今回はMacでのVPN切り替えコマンドを紹介しましたが、Windowsでも同様にVPNを切り替えることができます。
マウス操作よりもキーボード操作やコマンド操作に移行することで、1つ効率化を図ることができました。
毎日やっている単純作業を自動化することで、より考えることに集中して、知的生産性を高めることができると考えています。