OpenSSH в Windows 10/11 не работает — как установить, включить и починить (2025)
SSH нужен, чтобы подключаться к серверам и удалённо администрировать систему. В Windows 10/11 клиент и сервер OpenSSH встроены, но часто не установлены, не запущены или их блокирует брандмауэр. Ниже — понятный план: поставим нужные компоненты, поднимем службы, откроем порт 22, создадим ключи и проверим соединение. Из «магии» только чёткие шаги и проверяемые команды.
Коротко: что проверить сразу
- Компоненты OpenSSH Client и OpenSSH Server установлены.
- Службы
sshdиssh-agentзапущены и в автозапуске. - В Брандмауэре Windows открыт вход по TCP 22 для «Частной» сети.
- Антивирус не перехватывает порт, а роутер не режет NAT/UPnP, если подключаетесь извне.
1) Установка OpenSSH: через Параметры или PowerShell
Проще всего — через «Дополнительные компоненты». Но надёжнее — PowerShell с правами администратора.
PowerShell (Администратор) — выполнять по одной:
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*' | Select-Object Name, State
Если последняя команда показывает State = Installed — отлично. Идём дальше.
2) Службы: включаем и настраиваем sshd и ssh-agent
Нам нужно, чтобы сервер принимал входящие подключения, а агент умел хранить ключи.
PowerShell (Администратор) — выполнять по одной:
Set-Service -Name sshd -StartupType Automatic
Set-Service -Name ssh-agent -StartupType Automatic
Start-Service sshd
Start-Service ssh-agent
Get-Service sshd,ssh-agent
Если sshd не стартует — смотрим журнал и файл конфигурации.
PowerShell (Администратор) — выполнять по одной:
Get-WinEvent -LogName Application -Max 200 | Where-Object {$_.ProviderName -like '*sshd*'} | Select TimeCreated, Id, LevelDisplayName, Message
notepad $env:ProgramData\ssh\sshd_config
В конфиге по умолчанию уже включены логин/пароль и ключи. Для домашней сети этого достаточно.
3) Брандмауэр: открываем порт 22
Без этого к вам не зайти даже в локалке.
PowerShell (Администратор) — вставить целиком:
$rule = Get-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -ErrorAction SilentlyContinue
if(-not $rule) { New-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Direction Inbound -Protocol TCP -LocalPort 22 -Action Allow -Profile Private }
else { Set-NetFirewallRule -DisplayName "OpenSSH Server (sshd)" -Enabled True -Profile Private }
Если меняли порт — замените -LocalPort на свой и не забудьте пробросить его на роутере для внешних подключений.
4) Ключи: создаём и подключаем
Для клиента создаём пару ключей и добавляем публичный в authorized_keys на целевом ПК. Так вход будет без пароля.
PowerShell (пользователь) — выполнять по одной:
ssh-keygen -t ed25519 -C "home-pc"
type $env:USERPROFILE\.ssh\id_ed25519.pub
# Скопируйте вывод в файл %USERPROFILE%\.ssh\authorized_keys на целевом ПК
icacls $env:USERPROFILE\.ssh /inheritance:r
icacls $env:USERPROFILE\.ssh /grant:r "$($env:USERNAME):(OI)(CI)F"
icacls $env:USERPROFILE\.ssh\authorized_keys /inheritance:r
icacls $env:USERPROFILE\.ssh\authorized_keys /grant:r "$($env:USERNAME):F"
Права на папку и файл должны быть только у владельца, иначе sshd может игнорировать ключи.
5) Тест: подключаемся локально и с соседнего ПК
Сначала проверим на самом компьютере, затем — из сети по имени или IP.
Командная строка (или PowerShell) — выполнять по одной:
ssh localhost
whoami
exit
ssh user@192.168.1.50
# Если имя ПК в локалке не находится:
ping -4 имя-ПК
nslookup имя-ПК
arp -a
6) Частые причины, почему OpenSSH «не работает»
- Компонент не установлен — поставьте Client/Server через PowerShell.
- Служба sshd не запускается — читайте журнал, проверьте конфиг и права на %ProgramData%\ssh.
- Брандмауэр закрывает порт — создайте правило входящего TCP 22 для профиля «Частный».
- Ключи не принимаются — проверьте права на .ssh и формат ключей.
- DNS/имя ПК не резолвится — используйте IP или настройте локальный DNS/NBNS.
7) Диагностика: что говорит система
PowerShell (Администратор) — выполнять по одной:
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
Get-Service sshd,ssh-agent | Select Status, StartType, Name
Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq 22} | Select LocalPort, Protocol
Get-WinEvent -LogName "Microsoft-Windows-OpenSSH/Operational" -Max 100 | Select TimeCreated, Id, LevelDisplayName, Message