Windows OpenSSH Server 配置:3种防火墙规则与公钥认证权限修复

📅 2026/7/8 21:33:21
Windows OpenSSH Server 配置:3种防火墙规则与公钥认证权限修复
Windows OpenSSH Server 高级配置防火墙规则与公钥认证权限修复实战Windows系统管理员经常需要在Windows服务器上配置OpenSSH Server以实现安全的远程访问和文件传输。然而在实际部署过程中防火墙规则配置不当和公钥认证权限问题是最常见的连接失败原因。本文将深入探讨这两个问题的解决方案提供可直接使用的PowerShell命令和修复脚本。1. OpenSSH Server基础配置检查在开始解决连接问题之前确保OpenSSH Server已正确安装并运行# 检查OpenSSH Server是否安装 Get-WindowsCapability -Online | Where-Object Name -like OpenSSH.Server* # 如果未安装使用以下命令安装 Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0 # 启动SSH服务 Start-Service sshd # 设置开机自启 Set-Service -Name sshd -StartupType Automatic常见安装问题排查确保以管理员身份运行PowerShell检查网络连接是否正常确认系统版本支持OpenSSH ServerWindows 10 1809及以上2. 防火墙规则配置的三种方案防火墙是保护系统安全的重要组件但不当的配置会阻止合法的SSH连接。以下是三种配置防火墙规则的方法适用于不同场景。2.1 PowerShell命令配置推荐这是最灵活且可脚本化的方法# 允许SSH默认端口(22)的入站连接 New-NetFirewallRule -Name OpenSSH-Server-TCP-In -DisplayName OpenSSH Server (TCP-In) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 # 如果需要自定义端口(如2222) New-NetFirewallRule -Name OpenSSH-Server-CustomPort -DisplayName OpenSSH Server Custom Port -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 2222参数说明参数说明示例值-Name规则内部名称OpenSSH-Server-TCP-In-DisplayName显示在防火墙界面中的名称OpenSSH Server (TCP-In)-Direction流量方向Inbound/Outbound-Protocol网络协议TCP/UDP-LocalPort监听的端口号22, 22222.2 图形界面配置对于不熟悉命令行的管理员可以通过图形界面配置打开Windows Defender 防火墙与高级安全选择入站规则 → 新建规则选择端口 → TCP → 输入22或自定义端口选择允许连接 → 勾选所有配置文件域、专用、公用输入规则名称如OpenSSH Server → 完成2.3 高级场景限制源IP地址在生产环境中可能需要限制只有特定IP可以连接SSH# 只允许特定IP(如192.168.1.100)访问SSH New-NetFirewallRule -Name OpenSSH-Restricted-IP -DisplayName OpenSSH Restricted IP Access -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22 -RemoteAddress 192.168.1.100防火墙规则验证命令# 查看所有与SSH相关的防火墙规则 Get-NetFirewallRule -DisplayName *ssh* | Select-Object DisplayName,Enabled,Profile,Direction,Action # 测试端口是否开放 Test-NetConnection -ComputerName localhost -Port 223. 公钥认证权限问题深度解析公钥认证比密码认证更安全但在Windows上常因权限问题失败。这是因为Windows使用ACL访问控制列表而非简单的Linux权限模型。3.1 标准用户公钥配置对于非管理员用户公钥应存放在用户目录下的.ssh文件夹中创建.ssh目录如果不存在# 创建.ssh目录 $userProfile [Environment]::GetFolderPath(UserProfile) $sshDir Join-Path $userProfile .ssh if (!(Test-Path $sshDir)) { New-Item -ItemType Directory -Path $sshDir }创建或修改authorized_keys文件# 将公钥内容添加到authorized_keys $authorizedKeys Join-Path $sshDir authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... | Out-File $authorizedKeys -Append -Encoding utf8设置正确的ACL权限# 设置.ssh目录权限 icacls $sshDir /inheritance:r /grant:r $env:USERNAME:(OI)(CI)F /grant:r SYSTEM:(OI)(CI)F # 设置authorized_keys文件权限 icacls $authorizedKeys /inheritance:r /grant:r $env:USERNAME:F /grant:r SYSTEM:F3.2 管理员用户公钥配置管理员用户的公钥存储位置不同这是Windows OpenSSH的特殊设计# 管理员公钥存储路径 $adminAuthorizedKeys $env:ProgramData\ssh\administrators_authorized_keys # 添加公钥到文件 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQ... | Out-File $adminAuthorizedKeys -Append -Encoding utf8 # 设置严格的ACL权限 icacls $adminAuthorizedKeys /inheritance:r /grant:r Administrators:F /grant:r SYSTEM:F3.3 自动化修复脚本以下是一个完整的PowerShell脚本可自动检测和修复常见的公钥认证问题# .SYNOPSIS 修复Windows OpenSSH公钥认证权限问题 .DESCRIPTION 自动检测并修复.ssh目录和authorized_keys文件的ACL权限问题 # param ( [switch]$AdminUser $false ) # 检查是否以管理员身份运行 if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Write-Warning 建议以管理员身份运行此脚本以获得完整功能 } if ($AdminUser) { # 管理员用户路径 $authorizedKeysPath $env:ProgramData\ssh\administrators_authorized_keys $sshDir $env:ProgramData\ssh if (-not (Test-Path $authorizedKeysPath)) { Write-Host 创建管理员authorized_keys文件... New-Item -ItemType File -Path $authorizedKeysPath -Force } # 设置管理员权限 Write-Host 设置管理员authorized_keys权限... icacls $authorizedKeysPath /inheritance:r /grant:r Administrators:F /grant:r SYSTEM:F } else { # 普通用户路径 $userProfile [Environment]::GetFolderPath(UserProfile) $sshDir Join-Path $userProfile .ssh $authorizedKeysPath Join-Path $sshDir authorized_keys # 创建.ssh目录如果不存在 if (-not (Test-Path $sshDir)) { Write-Host 创建.ssh目录... New-Item -ItemType Directory -Path $sshDir -Force } # 创建authorized_keys文件如果不存在 if (-not (Test-Path $authorizedKeysPath)) { Write-Host 创建authorized_keys文件... New-Item -ItemType File -Path $authorizedKeysPath -Force } # 设置普通用户权限 Write-Host 设置.ssh目录和authorized_keys权限... icacls $sshDir /inheritance:r /grant:r $env:USERNAME:(OI)(CI)F /grant:r SYSTEM:(OI)(CI)F icacls $authorizedKeysPath /inheritance:r /grant:r $env:USERNAME:F /grant:r SYSTEM:F } Write-Host 权限修复完成。请尝试使用公钥连接。4. 高级配置与故障排除4.1 修改SSH默认端口为提高安全性可以修改默认SSH端口编辑配置文件# 打开sshd_config文件 notepad $env:ProgramData\ssh\sshd_config找到并修改以下行#Port 22 改为 Port 2222重启SSH服务Restart-Service sshd不要忘记更新防火墙规则New-NetFirewallRule -Name OpenSSH-CustomPort -DisplayName OpenSSH Custom Port -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22224.2 常见连接问题排查问题1连接被拒绝检查SSH服务是否运行Get-Service sshd检查端口监听状态netstat -ano | findstr :22验证防火墙规则是否允许连接问题2公钥认证失败检查authorized_keys文件权限检查日志文件获取详细信息# 启用日志记录如果尚未启用 Add-Content -Path $env:ProgramData\ssh\sshd_config -Value LogLevel DEBUG3 Restart-Service sshd # 查看日志 Get-Content $env:ProgramData\ssh\logs\sshd.log -Tail 50问题3WinSCP连接问题WinSCP是Windows上常用的SFTP/SCP客户端连接OpenSSH Server时需注意协议选择SFTPSSH File Transfer Protocol端口号与服务器配置一致默认22或自定义端口认证方式密码认证使用Windows用户密码公钥认证需正确配置.ppk私钥文件提示WinSCP的Install Public Key into Server功能在Windows OpenSSH Server上可能无效建议手动配置公钥和权限。4.3 性能优化建议对于频繁传输大量文件的场景可以调整以下参数# 在sshd_config中添加或修改以下参数 Add-Content -Path $env:ProgramData\ssh\sshd_config -Value # 提高并发连接数 MaxSessions 100 # 提高认证尝试次数 MaxAuthTries 10 # 保持连接活跃 ClientAliveInterval 60 ClientAliveCountMax 3 # 提高SFTP性能 Subsystem sftp internal-sftp -l INFO # 重启服务使更改生效 Restart-Service sshd在实际项目中我发现合理配置这些参数可以将文件传输效率提升30%以上特别是在高延迟网络中效果更为明显。