概要
WSL2のLinuxマシンをサーバマシンのように、外部のクライアント端末からsshログインして利用できるようにするための設定。
設定方針
この記事での設定方針は以下の通り。
- Windowsホスト上とWLS2上の両方にSSHサーバをインストールする
- クライアント端末からはWindowsホスト経由のトンネリング接続によりWSL2マシンへsshログインを行う
- トンネリング接続の設定はクライアント端末側で設定する
WSL2上へsshログインするための設定にはこれ以外にも方法はあるが、今回この方針とした理由は以下。
- Windowsホスト上へもsshログインできるようにしたいため
- 特別な処理をするスクリプト等が不要で、一般的なssh設定の範囲で実現できるため
- WSL2上で自分の個人作業用のサービスや試験用のサーバを一時的に起動して接続したいため
前提環境
今回の環境は以下の通り。これ以外の環境でも必要に応じて読み替えれば大丈夫のはず。
- Windowsホスト: Windows 11
- WSL2マシン: AlmaLinux-9
- クライアント端末: macOS Ventura (OpenSSH_9.0p1)
設定手順
Windowsホスト上の設定
Windows 11 OpenSSH サービスの有効化
以下の流れで Windows 11上の OpenSSHサービスを有効化する。詳細は Microsoft の公式ドキュメントを参照。
- (1) 「設定」「システム」「オプション機能」から「OpenSSHサーバー」をインストールする
- (2) サービスパネル(
services.msc
)から「OpenSSH SSH Server」を自動起動、開始を設定する - (3) 「セキュリティが強化されたWindows Defender ファイヤウォール」(
wf.msc
)から「受信の規則」「新しい規則」「ポート」「22」を追加する (※)
※標準で「OpenSSH SSH Server (sshd)」という名前のルールが存在するが、これは「プライベート」プロファイルのみの許可であり自分の環境の「パブリック(推奨)」プロファイルでは接続できないため、ここでは専用に個別のルールを追加する方法をとった。
参照URL
- Windows 用 OpenSSH の概要 (Microsoft公式ドキュメント)
- Windows 11 で OpenSSH サーバーをインストールする
- [Microsoft] Windows 11でOpenSSHサーバを動かす & トラブルシュートメモ
- Windows 11にSSHする方法
ssh 鍵認証の設定
管理者権限があるユーザでログインするため、「管理ユーザー」用の設定を行う。
- (1) 接続元クライアント端末から、公開鍵ファイル(
id_ecdsa.pub
)をWindows側へ一旦パスワード認証でコピーする
scp -p ./.ssh/id_ecdsa.pub user@windows:
(パスワード入力で認証)
- (2) Windowsホスト上で管理者権限で PowerShell を開く
- (3) 公開鍵の内容を管理ユーザ用認証キーファイル
administrators_authorized_keys
へ追記する
Add-Content -Force -Path $env:ProgramData\ssh\administrators_authorized_keys -Value (Get-Content -Path .\id_ecdsa.pub)
- (4)
administrators_authorized_keys
のパーミッションを設定する
icacls.exe "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
- (5) 接続元クライアント端末からssh鍵認証でログインできることを確認する
参照URL
- Windows 用 OpenSSH でのキーベースの認証 管理ユーザー (Microsoft公式ドキュメント)
備忘録: パーミッション設定前後の状態確認例
- 設定前の状態
icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(I)(F)
BUILTIN\Administrators:(I)(F)
NT AUTHORITY\Authenticated Users:(I)(RX)
- 設定後の状態
icacls.exe $env:ProgramData\ssh\administrators_authorized_keys
C:\ProgramData\ssh\administrators_authorized_keys NT AUTHORITY\SYSTEM:(F)
BUILTIN\Administrators:(F)
Windowsホスト ssh ログインシェルの変更
Windowsホスト上での作業用に、ssh ログイン時のシェルを powershell.exe へ変更する。
- (1) 管理者権限で PowerShell を開く
- (2)
powershell.exe
のパスの確認
> (Get-Command powershell.exe).Source
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
- (3) レジストリを変更しログインシェルを変更する
New-ItemProperty -Path "HKLM:\SOFTWARE\OpenSSH" -Name DefaultShell -Value (Get-Command powershell.exe).Source -PropertyType String -Force
参照URL
- Windows での OpenSSH 用の既定のシェルの構成 (Microsoft公式ドキュメント)
- https://takuya-1st.hatenablog.jp/entry/2022/03/04/171043
その他の Windows ホストの設定
スリープ状態の抑止
Windows ホストがスリープ状態にならないようにWindows電源設定を行う
WSL2の自動起動
WSL2へ常にsshログインできるようにするため、Windows ホストを起動後、常に WSL2 を起動しておく。
- TODO: 自動起動設定
- 当面は手動でWSL2ターミナルを起動しておく
- 参考情報
WSL2 Linux の設定
WSL2 ssh サービス有効化
AlmaLinux-9 での手順
sudo dnf install openssh-server
sudo systemctl start sshd.service
sshクライアント端末の設定
クライアント端末から、Windows ホストを踏み台として WSL2 マシンへ ssh コマンド一発でログインできるようにするための設定。
設定手順
-
~/.ssh/config
設定(クライアント端末の設定)
Host windows
HostName WindowsマシンIPアドレス
User Windowsユーザ名
IdentityFile ~/.ssh/id_ecdsa
# LocalForward 7860 127.0.0.1:7860 # WSL2内へポートフォワードを行う場合の設定例
Host wsl
HostName localhost
User WSL2ユーザ名
IdentityFile ~/.ssh/id_ecdsa
HostKeyAlias windows-wsl
ProxyJump windows
- 認証鍵の登録(クライアント端末から実行)
ssh-copy-id ~/.ssh/id_ecdsa.pub
(パスワード入力)
- sshログイン (クライアント端末から実行)
ssh wsl
ここまで動作確認できれば設定完了。
補足
- ホスト名
windows
wsl
は任意。適宜変更すること -
HostKeyAlias
はクライアント端末のlocalhost
ホスト鍵との衝突を回避するために必要(設定しないとWSL2マシンのホスト鍵がlocalhost
で登録されてしまう) -
LocalForward
で転送するサービスがIPv4のみの場合はIPアドレス127.0.0.1
で指定する(localhost
と書くとIPv6::1
での接続となる)
注意点: wsl.exe
が起動してないときのエラー
WSL2マシンが起動していないときにクライアント端末から ssh ログインしようとした場合、以下のエラーメッセージとなるので驚かないように注意。落ち着いて Windows ホスト上で wsl.exe
を起動してから再度 ssh ログインすれば良い。
$ ssh wsl
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:XXXXXXXXXXXXXXX.
Please contact your system administrator.
Add correct host key in /Users/XXX/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in /Users/XXX/.ssh/known_hosts:XX
Host key for windows-wsl has changed and you have requested strict checking.
Host key verification failed.
$
WSL2マシンが起動してないと、WindowsホストからWindowsホスト自身のSSHサーバへ接続しようとするためこのようなエラーになる。
WSL2 Linux 追加設定
Windows PATHの有効化
Windows 上から wsl.exe
を起動すると bash の PATH 環境変数には Windows 上の PATH も設定される(appendWindowsPath=true
設定 )が、ssh ログインした場合は設定されない。
ssh ログインしたときも wsl.exe
起動時と同じ PATH を設定するため、以下のファイルを作成する(自分の場合 powershell.exe
や vagrant.exe
などを WSL2から実行する使い方をしたいため)。
/etc/profile.d/wslpath.sh
# enable PATH added by WSL2 appendWindowsPath in other sessions such as SSH
# run only once in a same session
if [ -z "$WSLPATH" ]; then
# check if this session is in wsl.exe
if [ -n "$WSL_INTEROP" ]; then
echo "WSLPATH='${PATH}'; export WSLPATH" > $HOME/.wslpath
[ -r $HOME/.wslpath ] && . $HOME/.wslpath
else
# replace the PATH
[ -r $HOME/.wslpath ] && . $HOME/.wslpath
[ -n "$WSLPATH" ] && PATH="${WSLPATH}"
fi
fi
ファイル作成後一度 wsl.exe
を実行することで以降の ssh ログインセッションの PATH 環境変数に反映される。また Windows側のPATH設定が変更された場合でも再度 wsl.exe
を実行すれば設定が反映される。
参考メモ
他のssh接続方式との比較
WSL2へ ssh ログインできるようにする方法はこの記事で記載した以外にもあるので、違いをメモしておく。
方式として少なくとも以下の方法がある。(方式名は便宜上つけた名前なので一般に使われているわけではない)
- (1) トンネル接続方式 (本記事の方式)
- Windows ホストのSSHサーバを踏み台にしてWSL2へssh接続する方式
- (2) Windowsシェル変更方式
- Windows ホストの SSH ログインシェルを
wsl.exe
にすることでWSL2を利用する方式
- Windows ホストの SSH ログインシェルを
- (3) ポート転送方式
- Windows の
portproxy
機能を利用して WSL2 へssh接続する方式
- Windows の
- (4) ミラーモード方式
- WSL2 の
networkingMode=mirrored
設定を利用する方式
- WSL2 の
それぞれの方式のメリット・デメリットを主観でざっくり書いてみると以下の通り
- (1) トンネル接続方式 (本記事の方式)
- メリット
- 特別なスクリプト等は不要
- 公開ポートは必要最低限(sshポート)のみ
- WSL2内の他のサービスへの接続もトンネル設定で簡単に追加できる
- デメリット
- Windowsホストと WSL2内両方に SSHサーバの設定が必要
- メリット
- (2) Windowsシェル変更方式
- メリット
- WSL2内のSSHサーバ設定が不要
- デメリット
-
scp
が正常に動作しない(詳細理由は未確認) - Windowsホスト上での作業ができない
-
- 参考サイト
- メリット
- (3) ポート転送方式
- メリット
- WindowsホストのSSHサーバ設定が不要
- デメリット
- WSL2のIPアドレスがWindows再起動のたびに変わってしまうため、追従するための特別のスクリプト等が必要になる
- 参考サイト
- メリット
- (4) ミラーモード方式
- メリット
- 設定が最もシンプル
- デメリット
- 比較的新しい機能であり、まだ不具合や制約がある(最新状況では改善できているかも)
- WindowsホストへのSSHログインと同居するにはポート変更等の設定が必要
- 参考サイト
- メリット
今の自分の使い方には(1)が一番合っているためこの方式を使っているが、将来的には(4)を検討しても良いかもしれない。
以上