Vida Curiosa

IT、音楽、ラテン生活

WSL2(Debian) + Windows TerminalでSSH接続をする

記念すべき初回投稿! 忘れそうなので、WSL2でのSSH接続セットアップについてメモを残しておこう🤔

※本記事は2023.04.21現在時点のものです。詳しくは各公式ドキュメントを参照ください。

今回の構成

  • Windows 11 Pro (22H2)
  • WSL2 - Debian 11.6

前提条件

  • WSL2 と Debianがインストールされていること
  • cp,scp,標準入出力,リダイレクトを理解していること

1. SSHサーバのインストール - WSL2 (Debian)側

Debianインストール時にSSHサーバをインストールしてなければ、Debian(Linux)で以下コマンド実行する

$ sudo apt -y install ssh

ちゃんとインストールできたか?念のため確認

$ sudo apt list --installed | grep openssh-server

インストールできていれば、下記のように表示されるはず openssh-server/stable,now 1:8.4p1-5+deb11u1 amd64 [installed]

2. SSHサービスの状態を確認

Windows Terminal上でSSH接続[username]@[ipアドレス]しようとして、接続拒否エラー(connection refused)が出たら、サーバのSSHが非アクティブ状態なので、以下のコマンドを実行する

$ sudo service ssh status

もし、sshd is runningでなかったら、下記コマンドで起動する

$ sudo service ssh start

リスタート(再起動)でもOK

$ sudo service ssh restart
まだ接続拒否エラーが続く場合
SSHのリスニングポートを確認してみる

以下コマンドで、netstatをインストール

$ sudo apt -y install net-tools

インストール後、下記コマンドでOpenSSHサーバがどのポートをリッスンしているか確認する

$ sudo netstat -ltnp | grep sshd

↓結果 (下記は、Port番号に[9999を設定した場合])

tcp        0      0 0.0.0.0:9999            0.0.0.0:*               LISTEN      845/sshd: /usr/sbin
tcp6       0      0 :::9999                 :::*                    LISTEN      845/sshd: /usr/sbin

2. PowerShell(Windows Terminal)側の設定

PowerShellを使用してOpenSSHをインストール

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

インストールしたら、とにかく起動

# SSHサービス起動!
> Start-Service sshd

DebianのOpenSSHサーバーに接続!

> ssh username@servername 
# servernameはLinuxのIPアドレス <= Debian側で `$ ip a` でIPアドレスは確認できる。

※【参考】Debianで$ ip aを入力した結果(一部)

# ip a 入力後、いっぱい画面に出てくるが、eth0のinet = IPv4にIPアドレスがある。
6: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:00:0x:xx:x0:00 brd ff:ff:ff:ff:ff:ff
    inet xxx.xx.xxx.xxx/00 brd xxx.xx.xxx.xxx scope global eth0
       valid_lft forever preferred_lft forever
    inet6 xx00::000:0xxx:xxxx:x000/00 scope link
       valid_lft forever preferred_lft forever

> ssh username@servernameで接続したら、下記メッセージ。yesを入力する。

The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?

3. キーを作る(Windows側)

公式マニュアルの「キーベースの認証」を見ながら行う。

Windows側のSSHサービスを再起動ごとに自動開始

Get-Service -Name sshd | Set-Service -StartupType Automatic

キーを作る

一言一句、公式マニュアル - ユーザー キーの生成 通りに進める。

公開鍵をサーバーにコピーする

PowerShellから公開鍵をサーバへコピーする

> type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh ubichinon@xxx.x.x.xx "cat >> .ssh/authorized_keys"

WSL2でLinux~Windows間のファイルのやり取りができるから、Debian(Linux)からコピーするのでもいいと思う🤔

# これで大丈夫か?
$ cat /mnt/c/Users/ubichinon/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys

指定ファイルがミスってたら上書きされるの嫌なので、[>>] 直前に「新しいLinuxの教科書 - p.323 リダイレクトによる上書き」読んでおいてよかった😺 日本語のWindows公式ドキュメントはちょっと古いのでしょうか? 英語版ではscp以外の$ remotePowershellが紹介されてました。やってみましたが、こっちのほうが簡単でした Microsoft公式ドキュメント英語版 - Deploying the public key


4. SSH設定ファイルの編集

# configファイル設定
$ sudo vim /etc/ssh/sshd_config
- #Port 22
+ Port 10122                         # <= 適当に変更

# rootユーザーでのログインはno
PermitRootLogin no

# PubkeyAuthenticationはyesへ
PubkeyAuthentication yes

# パスワード認証を拒否
PasswordAuthentication no

# チャレンジレスポンス認証を拒否
ChallengeResponseAuthentication no

# PAMを使用する
UsePAM yes

:::