Mac・Windows・Linux を SSH で相互接続する ― 鍵だけで、どこからでも「ssh 名前」の一言でつなぐ
家の Mac 3台・Windows 3台・Linux サーバー2台を、どれからでも ssh 名前 の一言で相互にログインできるようにしました。パスワードでのログインは禁止し、鍵だけで入る形です。前回の「ターミナルを WezTerm に統一した話」の続きとして、SSH の部分をまとめます。
どういう状態を目指したか

- どの端末からでも
ssh mac2やssh win1のように、短い名前でつなげる - ログインは鍵だけ。パスワードでのログインは禁止
- 秘密鍵はそれぞれの端末から出さない。相手に渡すのは公開鍵だけ
- 家の外からは、ルーターの VPN でつないでから同じ名前で使う(SSH の入口をインターネットに直接は開けない)
SSH の鍵の基本
SSH の鍵は「秘密鍵」と「公開鍵」の2つで1組です。秘密鍵は自分の端末にだけ置き、公開鍵を接続先の決まったファイル(~/.ssh/authorized_keys)に登録しておくと、パスワードなしで安全にログインできます。鍵の種類は、短くて速い ED25519 を使いました。
ssh-keygen -t ed25519 -C "自分の名前@端末名"
-C は鍵に付けるメモです。あとで authorized_keys を見たときに「どの端末の鍵か」がすぐ分かるよう、端末名を入れておくのがおすすめです。
1. Mac で SSH を受け付ける
Mac は「システム設定 → 一般 → 共有 → リモートログイン」をオンにするだけで SSH を受け付けます(Apple の説明)。相手の公開鍵を登録するには、相手の Mac から次のコマンドを1回だけ実行します。
ssh-copy-id -i ~/.ssh/id_ed25519.pub ユーザー名@相手のMac.local
2. Windows で SSH を受け付ける
Windows 11 には OpenSSH のサーバーが「オプション機能」として用意されています(Microsoft の導入手順)。
# 管理者の PowerShell で
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Set-Service sshd -StartupType Automatic
Start-Service sshd
Windows ならではの注意点が2つあります。
- 管理者のユーザーは、公開鍵の置き場所が違う:管理者グループのユーザーは、自分のフォルダではなく
C:ProgramDatasshadministrators_authorized_keysに登録します(鍵の管理の説明)。ファイルの権限も Administrators と SYSTEM だけにする必要があります - ファイアウォールの規則は「家の中から」に絞る:標準の規則は「プライベート」ネットワーク用です。あとでドメイン(社内ネットワーク)に参加させたら規則が効かなくなり、つながらなくなりました。家の中のアドレス範囲だけを許可する規則を、全部のネットワークの種類向けに作り直して解決しました
3. Windows からつなぐときは WSL の ssh を使う
Windows 側では、ターミナル(WezTerm)で WSL の Ubuntu を開き、その中の ssh で相手につなぎます。こうすると、Mac と同じ ~/.ssh/config の書き方・同じコマンドで使えます。ただし、WSL の Ubuntu は Windows とは別の環境なので、鍵も接続名も Ubuntu の中に別に用意する必要があります。最初はこれに気づかず、「Windows から ssh mac1 が使えない」と悩みました。
4. ~/.ssh/config に接続名を書く
毎回 ssh -i 鍵 -p ポート ユーザー@アドレス と打つのは大変なので、~/.ssh/config に名前を付けて登録します(書き方の詳細)。
Host mac2
HostName 192.168.x.x
User ユーザー名
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
Host home-server
HostName 192.168.x.x
Port XXXX
User ユーザー名
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
IdentitiesOnly yes:指定した鍵だけを使う。鍵が増えたときに、関係ない鍵を次々に試して接続を断られるのを防げる- アドレスは、ルーターの DHCP 予約で機器ごとに固定しておくと、ずっと同じ設定で使える
- Mac 同士は
名前.localでもつながるが、VPN 経由では引けないことがあるので、IP アドレスで書いておくのが確実
5. サーバーはパスワードでのログインを禁止する
全員の鍵の登録が終わったら、サーバー側でパスワードでのログインと root でのログインを禁止します。
# /etc/ssh/sshd_config.d/00-auth.conf
PasswordAuthentication no
PermitRootLogin no
設定を変えたら、今つないでいる画面は閉じずに、別の画面から新しくログインできるか試すのが鉄則です。失敗したときに、元の画面から直せます。
なお、禁止した後に新しい端末を増やすときは、その端末から ssh-copy-id が使えません。すでに入れる端末から公開鍵を追記するか、短い時間だけパスワードでのログインを許可して登録し、すぐ禁止に戻します。
6. 接続できたか、総当たりで確かめる
Mac 3台・Windows 3台・サーバー2台で、ユーザーも複数あるので、組み合わせはかなりの数になります。各端末から全部の接続名を順に試す簡単なループで、漏れがないか確認しました。
for h in mac1 mac2 mac3 win1 win2 win3 home-server; do
printf '%-12s ' "$h"; ssh -o BatchMode=yes -o ConnectTimeout=5 "$h" true && echo OK || echo NG
done
BatchMode=yes を付けると、パスワードを聞かれる状態(=鍵が登録されていない)ならすぐ失敗するので、確認に向いています。初めてつなぐ相手では「ホスト鍵(相手の身元)を信用するか」を聞かれるので、相手の端末で表示した指紋と一致するかを確かめてから登録しました。
つまずいたところ
- サーバーの
authorized_keysに、秘密鍵が貼られていた:以前の自分の作業ミス。鍵としては無効でしたが、その秘密鍵は使うのをやめ、新しい鍵に作り直しました。公開鍵(.pub)と秘密鍵を取り違えないよう注意 - ドメインのユーザーで Windows に SSH できない:Samba で作った AD のユーザーだと、Windows の SSH のログイン処理が失敗しました。原因は未確定で、今は Windows のローカルのユーザーでつないでいます
- Windows がスリープして応答しない:ノート PC は「画面を消す」タイミングで省電力の待機状態(モダンスタンバイ)に入り、SSH に応答しなくなりました。電源につないでいるときは画面を消さない設定にして解決
- Mac で
logコマンドが何も表示しない:zsh の組み込みのlogが先に動くため。SSH 越しにログを見るときは/usr/bin/logと書く
まとめ
鍵の作成・公開鍵の登録・接続名の設定の3つをそろえるだけで、家の中のどの端末からでも一言で相手に入れるようになりました。パスワードを打つ場面がなくなり、パスワードでのログインも禁止できたので、便利さと安全さの両方が上がっています。次の記事では、SSH では足りない「画面ごと操作したい」場面の、画面共有についてまとめます。
