WindowsからSSLVPN経由でSSH接続

#WindowsからSSLVPN経由でSSH接続

コロナ禍でリモートワーク等する人が増えたと思いますが、サーバがイントラネット内にあり、外部からアクセスするにはVPNを張って、その後にsshで接続するような人もいると思います。
本記事では、FortiClientなどのソフトウェアを起動して、SSLVPN接続して、SSH接続するといった手間をなるべく楽にする方法の一例を紹介します。
マウスを使いたくない人なんかにドッカンドッカン来ると思います。

### 環境
- クライアント：Windows10
- サーバ：Ubuntu 16.04 LTS
- VPNサーバー：FortinetのSSL-VPN(こちらから弄れない)

## SSL-VPN接続
一番の面倒ポイントだと思います。
FortiClient VPNを起動し、起動したGUI上にパスワードを入力し、接続する作業が必要です。
場合によってはWebからhttpsのプロトコルから叩くと、VPN接続できるページが提供されることもあるかと思いますが、手間はあまり変わりません。
どうせSSH接続するときに黒い画面と対話しないといけないので、いっそのことVPNを張るのもコマンドからしたいというのが人情でしょう。

Fortinetは、Microsoft Storeと呼ばれるWindowsアプリストアに[FortiClient](https://www.microsoft.com/ja-jp/p/forticlient/9wzdncrdh6mc)アプリを公開しています。
レビューはひどいもんですが、こちらはFortiClient VPNアプリと異なり、WIndowsシステムのVPNプロバイダとして機能を提供するものなので、これを起動した画面からGUI上でVPN接続しようという使い方ではありません。
したがって、Windows標準のVPN接続機能を用いて、VPNに接続することになります。

### 接続方法
[先ほどのアプリ](https://www.microsoft.com/ja-jp/p/forticlient/9wzdncrdh6mc)をインストールします。
「設定＞ネットワークとインターネット＞VPN」と行くか、スタートから「VPN」と検索をかけて、VPNの設定画面を開き、「VPN 接続を追加する」と進み、最上部にある「VPN プロバイダー」から「FortiClient」を選びます（出てこないならインストールができていません）。
あとは適当な接続名（下記画像ではmyvpn）と、接続先（下記でsslvpn.myvpn.com）の情報を入力し、保存します。ユーザやパスワードは初回接続時に問われますので空欄のままで（というか入力できませんが）結構です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/317044/5c54b4e4-b927-3d89-fd20-4e10e0882c6f.png)

さて、追加された接続名から、接続を選択すれば、ユーザ認証が行われ、接続が完了します。
タスクバーの右の、ネットワークっぽいアイコン（WiFiとか接続するときに使うところ）から、VPNの接続状況などは確認でき、そこをクリックすることで同じ設定画面が開き、接続・切断ができます。

### コマンドから呼ぶ
当然Windowsは、このVPN接続時に背後で何かしらのソフトウェアが動いておりますから、そいつをコマンドで呼ぶことを考えてしまいます。
マウスをカチカチするのは面倒ですね。

具体的には次のようになります。

```powershell
rasdial [接続名] [ユーザ名] [パスワード]
```
設定から「サインイン情報を保存する」にチェックを入れて接続したことがあれば、ユーザ名とパスワードは省略できますので

```powershell
rasdial [接続名]
```
で接続を開始できます。普通にパスワードを入力するなんて怖いですからこちらの方がいいと思います。
切断には

```powershell
rasdial /disconnect
```

を用います。

これはコマンドプロンプトか、Power Shellから実行するときの話です。
%SYSTEMROOT%\System32\に「rasdial.exe」があり、通常は環境変数PATHが通っているため、このような表記が可能です。
もしあなたがWSL2を用いているなら、rasdialコマンドでは実行できませんが、WSL2は変態でexeファイルを実行できるので、

```powershell
rasdial.exe [接続名]
```
で接続できます。なんとPATHも初めから追加されているので、なかなかの変態具合だと思います。

これでVPN接続めんどくさい問題はある程度解決しました。

## SSH接続
Windows10は、デフォルトではOpenSSHクライアントが入っており、多くの場合

```powershell
%SYSTEMROOT%\System32\OpenSSH\ssh [ユーザ名]@[接続先]
```

などで接続できるかと思います。`ssh-keygen`などもちゃんと動作します。

しかし先ほど少し触れましたが、Windows10には、WSL2(Windwos Subsystems for Linux 2)が搭載されており（最新バージョンならとりあえず入っているはず）、もしサーバがLinuxであるならばWSL2を使う方がコマンドの混同も少なく、私はそちらの方が良いと思います。
WSL2によるLinuxの導入は、様々な方が解説しておりますので、そちらをご覧ください。

なので話は単純で、例えばWSL2 でUbuntu ディストリビューションを用いているならば、

「Windows キー」（スタートが開く）→「ubuntu」と入力・エンターで起動 → `ssh [ユーザ名]@[接続先]`で接続

という手順が、今までの話の中では最短になるかと思います。
スタートから検索しなくても、「Windowsキー + R」の「ファイル名を指定して実行」から「ubuntu」と打っても起動できます。どちらでもいいかと思いますが、「ファイル名を指定して実行」だと履歴が残るので便利な時があるかもしれません。

### 関数を作る
話はここで終わりません。
いつも同じ先にVPN接続して、同じような先にSSH接続するのであれば、世の中の人のおよそ99.9%の人が関数を作りたくなります（私調べ）。

まず、sshについては、もし同じ接続先にしか接続しないようであればエイリアスで

```shell
alias myssh="ssh [ユーザ名]@[接続先]"
# example
alias myssh="ssh shiosaba@123.45.67.89"
```
などとすれば、以後`myssh`コマンドで接続可能となります。
パスワード入力さえ面倒なら公開鍵認証方式に切り替えて、パスフレーズを空にしてみてはいかがでしょうか。私はそうしています。

もし接続先がいくつかあるのであれば、それを引数に受けて関数で実行することになりますので、

```shell
function myssh () {
  command ssh shiosaba@123.45.67.$1
}
```
または公開鍵認証ならば

```shell
function myssh () {
  command ssh -i ~/.ssh/id_rsa shiosaba@123.45.67.$1
}
```
などになります。`command`はなくてもいいかもしれませんが、同名のエイリアスなどある場合などによりつけてください。
以上の関数ならば、`myssh 921`とすれば`123.45.67.921`に接続試行します。

VPN接続もエイリアスで事足りますが、私はオプションで接続と切断を同じコマンドに放り込みたかったので関数にしています。

```shell
function myvpn () {
  if [ $# -eq 0 ]; then
    command rasdial.exe 接続先
  else
    command rasdial.exe /disconnect
  fi
}
```
以上の関数であれば、`myvpn`単体の実行でVPN接続、`myvpn d`など、何か一つ以上の引数で切断になります。
VPNの接続先が複数あることはあまりないような気もしますが、ある場合はオプションなどを用いて接続先も引数で受ければいいかと思います。
面倒なら接続と切断で別エイリアスにすれば、単純になるかと思います。

以上の関数は、~/.bashrcに追記しちゃうのがいいでしょう。
変更した後は一度ログアウトするか、`. ~/.bashrc`または`source ~/.bashrc`で実行しましょう。

以上で、「WSL2(今回はUbuntu)起動 → `myvpn`実行でVPN接続 → `myssh`でSSH接続」という流れになります。
場合によってはVPNの接続成功時にSSH接続までやっちゃえば楽かもしれません。

## 最後に
面倒なVPN接続を簡略化したい一心で、調べた内容をまとめました。
当方はLinux初心者のため、関数が汚いとか、セキュリティ的にどうなの？とかはあるかもしれません。
一応パスワードなどは平文で保存するようなことはしていないと思いますが、各自がセキュリティ意識を持つように願いします。

ぜひ、接続にかかる時間を仕事に使ってください。