リモートWindowsへSSH接続
Table of Contents
Pingの確認
まず、クライアントからリモートWindowsのIPアドレスに対してPingを送信して、ネットワーク接続が確立されているか確認します。
リモートのPC名が
# Windows同士の場合
ping <hostname>
# mDNSを使う場合(macOS/Linux/WSLなど)
ping <hostname>.local
リモートのIPアドレスでも確認できます:
# リモートで `ipconfig` でIPアドレスを確認した後
ping <ip-address>
.localの有無による使い分け
.local はmDNS(Multicast DNS、RFC 6762)で使われる特別なドメインで、LAN内でDNSサーバーを介さずに名前解決ができます。クライアントの環境によって使い分けます。
ping <hostname>(.localなし)を使う場面:
- クライアントがWindowsで、リモートもWindows(同じLAN内)
- NetBIOS over TCP/IPまたはLLMNRで解決される
- 社内DNSサーバーにPC名が登録されている環境(ドメイン参加PCなど)
- DNSサフィックス(例:
corp.example.com)が設定済みで、<hostname>だけでFQDNに補完される
ping <hostname>.local を使う場面:
- クライアントが macOS / Linux / iOS / Android からWindowsを探す
- Bonjour (macOS) / Avahi (Linux) が mDNSで解決
- DNSサーバーが無い家庭LAN / 小規模オフィス
- NetBIOS / LLMNRが無効化されているセキュリティ強化環境
- IoT / Raspberry PiなどmDNSが標準の機器と混在
早見表:
| クライアント → リモート | 推奨 |
|---|---|
| Windows → Windows(家庭LAN) | どちらでも可。まず.localなし |
| Windows → Windows(社内ドメイン) | .localなし |
| macOS / Linux → Windows | .localあり |
| WSL → ホストWindows | .localあり(または$(hostname).local) |
なお、Windows側で.localを使うにはBonjour Print ServicesまたはWindows 10 1803以降の組み込みmDNSが必要です。古いWindowsだと.localが効かないケースもあります。
Pingが通らない場合
ファイアウォールの確認
リモートでWindowsのファイアウォールがICMP(Ping)をブロックしている可能性があります。以下の手順で確認します。
- リモートWindowsで「セキュリティが強化されたWindows Defenderファイアウォール」を開く。
- 左側の「受信の規則」をクリック。
- 「ファイルとプリンターの共有(エコー要求 - ICMPv4-In)」を探す。
- 状態が「有効」かつ「許可」になっていることを確認。
- もし無効やブロックされている場合は、右クリックして「規則の有効化」を選択。
- 同様に「ファイルとプリンターの共有(エコー要求 - ICMPv6-In)」も確認(IPv6環境の場合)。
ルーターの確認
家庭やオフィスのルーターがICMPをブロックしている可能性もあります。ルーターの管理画面にアクセスして、ファイアウォール設定やセキュリティ設定を確認してください。特に「Ping応答を許可する」などのオプションがある場合は有効にします。
ウイルス対策ソフトの確認
一部のウイルス対策ソフトやセキュリティソフトがICMPをブロックすることがあります。リモートWindowsにインストールされているセキュリティソフトの設定を確認し、必要に応じてICMPを許可してください。
SSHサーバの設定
Pingが通ることを確認したら、リモート側でSSHサーバを設定します。Windows 10以降では、OpenSSHサーバが組み込まれているため、以下の手順で有効化できます。
- 「設定」→「アプリ」→「オプション機能」を開く。
- 「機能の追加」をクリック。
- 「OpenSSHサーバ」を検索して選択し、「インストール」をクリック。
もしくはPowerShellを管理者権限で開いて、以下のコマンドを実行してインストールします。
# OpenSSHサーバのインストール状況の確認
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Server*'
結果の判定:
State : Installedと表示された場合:インストール済み。そのまま設定進む。State : NotPresentと表示された場合:未インストール。
インストールする場合:
Add-WindowsCapability -Online -Name "OpenSSH.Server~~~~0.0.1.0"
インストール完了後、以下の設定を行います。
# サービスを自動起動に設定
Set-Service -Name sshd -StartupType 'Automatic'
# 今すぐサービスを開始
Start-Service sshd
# ステータス確認
Get-Service -Name sshd
ステータス確認で Status: Running になっていれば、リモートPC側でのSSHサーバーの立ち上げは完了です。
クライアントからSSH接続
クライアントからリモートWindowsにSSH接続するには、以下のコマンドを使用します。
ssh <username>@<hostname> # または <username>@<hostname>.local
ユーザー名はリモートWindowsのアカウント名を指定します。接続が成功すると、リモートWindowsのコマンドプロンプトやPowerShellにアクセスできます。
ただし、初回接続時にはホストキーの確認が求められるため、表示される指紋を確認してから「yes」と入力してください。
また、この状態では毎回の接続でパスワードを入力する必要があります。パスワードなしで接続したい場合は、SSHキーを生成してリモートWindowsに公開鍵を配置します。
以下、クライアント側でSSHキーを生成する例です。
# クライアント側でSSHキーを生成
ssh-keygen -t ed25519
これにより、~/.ssh/id_ed25519(秘密鍵)と~/.ssh/id_ed25519.pub(公開鍵)が生成されます。公開鍵の内容をリモートWindowsのユーザープロファイルの.ssh/authorized_keysに追加することで、パスワードなしでSSH接続が可能になります。
# 公開鍵をリモートWindowsにコピー
type ~/.ssh/id_ed25519.pub | ssh <username>@<hostname> "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
もしくは以下のコマンドで直接コピーすることもできます。
# リモートへssh接続
ssh <username>@<hostname>
# リモート側に「.ssh」フォルダ作成
New-Item -ItemType Directory -Path "$HOME\.ssh" -Force
# ローカルの公開鍵をリモートのauthorized_keysに貼り付け
Set-Content -Path "$HOME\.ssh\authorized_keys" -Value "ここにコピーした公開鍵を貼り付け"
最後に、リモート側で公開鍵の権限を適切に設定します。
# 公開鍵の権限を設定(WindowsのACLで管理者とユーザーにフルコントロールを付与)
icacls "$HOME\.ssh\authorized_keys" /inheritance:r /grant:r "Administrators:F" /grant:r "${env:USERNAME}:F"
リモートへ管理者としてSSH接続する場合
リモートのアカウント設定によっては、SSH接続後に自動で管理者権限になることがあります。
その場合、公開鍵は管理者アカウントのホームディレクトリの.ssh/authorized_keysに配置する必要があります。
# システム共通の公開鍵保存フォルダを作成
New-Item -ItemType Directory -Path "$env:ProgramData\ssh" -Force
# 管理者用の公開鍵ファイルにコピーした公開鍵を貼り付け
Set-Content -Path "$env:ProgramData\ssh\administrators_authorized_keys" -Value "ここにコピーした公開鍵を貼り付け"
# 公開鍵の権限を設定(管理者とSYSTEMにフルコントロールを付与)
icacls "$env:ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant:r "Administrators:F" /grant:r "SYSTEM:F"
クライアントのSSH設定
クライアント側でSSH接続を簡略化するために、~/.ssh/configファイルにリモートWindowsの設定を追加することができます。
Host remote-win
HostName <hostname> # または <hostname>.local or <ip-address>
User <username>
これにより、以下のコマンドで簡単にSSH接続できるようになります。
# ssh <username>@<hostname> の代わりに以下で接続可能
ssh remote-win