WSL2からIBM CloudにSSL VPN接続する

# 背景
Windowsユーザーのエンジニアの皆さんの中にはWSL環境で開発を行っている方も多いと思います。私もその一人です。

先日WSL環境で開発中、WindowsにインストールしたVPNクライアントからIBM CloudにSSL VPN接続してもWSLからアクセスできず困ったため、備忘録を兼ねて記事にしました。

# WSL2からIBM CloudにSSL VPN接続する
タイトルの通りです。本記事で使うSSL VPNクライアントのMotion Proは公式ではWSL非対応としており、動作が不安定な部分もあります。もっといい方法があればコメントにてご教示ください。

### 環境
Ubuntu 20.04 LTS on WSL2 on Windows11

## 事前準備
初めて接続する際に必要です。すでに別環境から接続できる方は飛ばしてください。

1. IBM Cloud ダッシュボード中の「ユーザー・アクセス」→「ユーザーの管理」から自分のユーザー名を選び、VPNパスワードを設定しておく
![スクリーンショット 2022-12-12 090853.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036083/48e5b580-96ce-a31d-0d8c-3a8bbdf8e7f2.png)

2. タブ「クラシック・インフラストラクチャー」内のタブ「VPNサブネット」に移動し、次の設定をして、保存する
    - 「SSL VPNアクセスを有効にする」にチェック (*必須)
    - (自動割り当て「オフ」)
    - (接続したいサブネットにチェック)
![スクリーンショット 2022-12-12 091353.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036083/e0484c4b-ac56-ca71-6c4b-bb631f4c0b62.png)

## VPNクライアント(MotionPro)のインストール

IBM Cloud公式ドキュメントの「Linux スタンドアロン・クライアント」を参考にインストールします。

https://cloud.ibm.com/docs/iaas-vpn?topic=iaas-vpn-standalone-vpn-clients&locale=ja

#### 1\. ダウンロード
Array Network公式ページ(https://support.arraynetworks.net/prx/001/http/supportportal.arraynetworks.net/downloads/downloads.html) より、最新版のMotionProのリンクをコピーしてwgetします。
 ```:コマンド
wget --no-check-certificate https://support.arraynetworks.net/prx/001/http/supportportal.arraynetworks.net/downloads/pkg_9_4_0_461/MP_Linux_1.2.15/MotionPro_Linux_Ubuntu_x64_build-22.sh
```
#### 2\. 実行権限付与
```:コマンド
chmod +x MotionPro_Linux_Ubuntu_x64_build-22.sh
```
#### 3\. インストールスクリプト実行 
```:コマンド
sudo ./MotionPro_Linux_Ubuntu_x64_build-22.sh
```

インストール直後のプロセスを見ると、"vpnd"および"MotionProHttpd"の2つのプロセスが起動しています。
![スクリーンショット 2022-12-12 104357.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3036083/0f19c462-792e-b2ab-02b4-c5825a62d6ef.png)
このうち"vpnd"について、WSL環境だと自動起動が設定されないため、Windowsを起動する都度vpndの起動が必要になります。
面倒なので起動を自動化します。

## vpnd自動起動の設定

#### 1\. systemdの有効化
自動起動を設定するため、まずWSL2でsystemdを使えるようにします。

```:コマンド
sudo nano /etc/wsl.conf
```
以下の内容を追記
```:/etc/wsl.conf
[boot]
systemd=true
```

#### 2\. vpndインストール先の確認
```:コマンド
which vpnd
```
```:結果
/usr/bin/vpnd
```
#### 3\. Unit定義ファイルの作成
```:コマンド
sudo nano /etc/systemd/system/vpnd.service
```
以下の内容を入力 (ExecStart=のパスは先ほど確認したパスを指定)
```: /etc/systemd/system/vpnd.service
[Unit]
Description = vpnd-service
After = local-fs.target network-online.target

[Service]
ExecStart = sudo /usr/bin/vpnd
Restart = no
Type = oneshot
RemainAfterExit = yes

[Install]
WantedBy = multi-user.target
```
#### 4\. 自動起動登録
```: コマンド
sudo systemctl enable vpnd
```
#### 5\. wslの再起動
systemdの有効化のため、wslを再起動します。
WSLのシェルを閉じてWindows側でPowershellを開き、以下のコマンドを入力します。
```:コマンド(PowerShell)
 wsl --shutdown
```
#### 6\. 起動確認
再度WSLのシェルを開き、自動起動が設定できたことを確認します。
```:コマンド
sudo ps -A | grep vpnd
```
```:結果
 373 ?        00:00:00 vpnd
```

### <font color="tomato">2023/08/08 追記</font>
systemdの有効化後、WSLからWindowsの.exeファイルを直接開けなくなる事象があるようです(Exec format error)。
以下コマンドで修正できます。
```
$ echo ":WSLInterop:M::MZ::/init:PF" | sudo tee /usr/lib/binfmt.d/WSLInterop.conf
$ sudo systemctl restart systemd-binfmt
```


## VPN接続
準備が終わったので、VPN接続をします。
```:コマンド
sudo /opt/MotionPro/vpn_cmdline -h '[接続先]' -u '[VPN接続ユーザー名]' -p '[VPN接続パスワード]'
```
- 接続先
    接続するVPNエンドポイントを指定します。（以下リンクに一覧）
    https://cloud.ibm.com/docs/iaas-vpn?topic=iaas-vpn-available-vpn-endpoints&locale=ja
- VPN接続ユーザー名
    事前準備-1.に表示されているユーザー名
- VPN接続パスワード
    事前準備-1.で設定したパスワード

```:結果
failed to open file /sys/class/net/bonding_masters/flags, error 20
failed to open file /sys/class/net/bonding_masters/address, error 20
login successfully!
starting vpn...
current status:0
current status:0
current status:0
current status:0
Connect successfully!
Vpn is connected!
```
エラーメッセージが出ますが、VPN接続は完了しています。

切断は以下のコマンドで行います。
```:コマンド
sudo /opt/MotionPro/vpn_cmdline -s
```
```:結果
stop connection successfully!
```


## 補足
この記事の内容とは直接関係ないですが、長時間スリープ復帰後などにWSLのシステム時刻がずれて名前解決できず、接続できなくなるエラーが発生することがあります。以下コマンドで対応できます。
```: コマンド
$ sudo hwclock --hctosys
```

## 参考文献
以下の記事を参考にさせていただきました。著者の皆さまに感謝いたします。

https://qiita.com/toryuneko/items/406effaeea1c9b72cbce

https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff

https://qiita.com/a_yasui/items/f2d8b57aa616e523ede4