背景
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
事前準備
初めて接続する際に必要です。すでに別環境から接続できる方は飛ばしてください。
-
IBM Cloud ダッシュボード中の「ユーザー・アクセス」→「ユーザーの管理」から自分のユーザー名を選び、VPNパスワードを設定しておく
-
タブ「クラシック・インフラストラクチャー」内のタブ「VPNサブネット」に移動し、次の設定をして、保存する
VPNクライアント(MotionPro)のインストール
IBM Cloud公式ドキュメントの「Linux スタンドアロン・クライアント」を参考にインストールします。
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つのプロセスが起動しています。
このうち"vpnd"について、WSL環境だと自動起動が設定されないため、Windowsを起動する都度vpndの起動が必要になります。
面倒なので起動を自動化します。
vpnd自動起動の設定
1. systemdの有効化
自動起動を設定するため、まずWSL2でsystemdを使えるようにします。
sudo nano /etc/wsl.conf
以下の内容を追記
[boot]
systemd=true
2. vpndインストール先の確認
which vpnd
/usr/bin/vpnd
3. Unit定義ファイルの作成
sudo nano /etc/systemd/system/vpnd.service
以下の内容を入力 (ExecStart=のパスは先ほど確認したパスを指定)
[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を開き、以下のコマンドを入力します。
wsl --shutdown
6. 起動確認
再度WSLのシェルを開き、自動起動が設定できたことを確認します。
sudo ps -A | grep vpnd
373 ? 00:00:00 vpnd
2023/08/08 追記
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
参考文献
以下の記事を参考にさせていただきました。著者の皆さまに感謝いたします。