Windows 11 OpenSSH服务器持续报错‘port 22: No route to host’及相关连接问题求助
Windows 11 OpenSSH服务器持续报错‘port 22: No route to host’及相关连接问题求助
我完全理解你折腾了几个月的痛苦——Windows上的OpenSSH确实容易踩各种隐蔽的坑,咱们一步步拆解你的问题,从最基础的环节开始排查:
1. 先确认Windows本地OpenSSH服务是否真的在正常监听端口
先排除服务本身的配置失效问题:
- 打开管理员权限的PowerShell,检查服务运行状态:
确保Get-Service sshdStatus显示为Running,StartType是Automatic。如果不是,执行以下命令修复:Set-Service -Name sshd -StartupType 'Automatic' Start-Service sshd - 验证端口监听情况(以你修改后的1100端口为例):
你需要看到状态为netstat -ano | findstr :1100LISTENING的条目,且对应的PID能在任务管理器中匹配到sshd.exe进程。如果没有结果,说明sshd_config的端口设置未生效:- 打开
C:\ProgramData\ssh\sshd_config(注意是ProgramData目录,不是Program Files),确认Port 1100这一行没有被#注释,然后重启服务:Restart-Service sshd
- 打开
2. 排查本地网络的拦截(不止Windows防火墙)
你关闭了Windows防火墙,但还有其他可能的拦截点:
- 第三方安全软件:比如Windows Defender高级威胁防护(WDATP)、360安全卫士、McAfee等,这类软件自带的防火墙规则可能会独立拦截sshd的入站连接。需要手动添加规则,允许
sshd.exe通过指定端口(1100)的TCP入站请求。 - 网络类型设置:如果你的Windows机器连接的是「公共网络」,Windows会默认拦截几乎所有入站请求。可以改成「专用网络」试试:
打开设置 > 网络和互联网 > 以太网/Wi-Fi > 属性,将「网络配置文件」切换为「专用」。
3. 公网访问的核心问题:路由器端口转发未配置
你提到同网络的Linux机器能正常scp,但公网端口检测显示关闭——这几乎可以确定是路由器未设置端口转发!
- 内网内的机器可以直接访问Windows的OpenSSH端口,但公网的远程主机需要路由器将公网端口的请求转发到Windows的内网IP:
- 先获取Windows的内网IPv4地址:执行
ipconfig,找到当前网络适配器的IPv4 Address(比如192.168.1.105) - 登录路由器管理后台(通常是
192.168.1.1或192.168.0.1,具体看路由器底部的标签),找到「端口转发」/「虚拟服务器」选项 - 添加一条规则:
- 外部端口:1100
- 内部端口:1100
- 协议:TCP(SSH基于TCP协议)
- 内部IP地址:你的Windows机器内网IP
- 保存规则后,再用公网端口检测工具测试,或让外网的朋友用
ssh osbor@你的公网IP -p 1100验证
- 先获取Windows的内网IPv4地址:执行
4. 解决Host key verification failed错误
这个错误和「无路由」是两个独立问题,本质是远程Linux主机的known_hosts文件记录的Windows主机密钥冲突了:
- 登录远程Linux主机,编辑
~/.ssh/known_hosts,删除包含你Windows公网IP的那一行(可以用grep 你的公网IP ~/.ssh/known_hosts快速定位) - 重新执行
ssh osbor@你的公网IP -p 1100,会提示你接受新的主机密钥,输入yes即可 - 另外,你之前的scp命令存在路径错误:
destinationuser@localhost:/Desktop中的localhost指的是远程Linux主机本身,不是你的Windows机器!正确的命令应该是:
(注意:Windows路径在OpenSSH环境中需要写成scp sourceuser@server:~/file osbor@你的公网IP:/c/Users/osbor/Desktop/c/Users/xxx/Desktop这种正斜杠格式)
5. 排除ISP的CGNAT问题
如果配置了端口转发还是无效,要确认你的ISP是否使用了运营商级NAT(CGNAT)——这种情况下你的Windows机器没有独立的公网IP,多个用户共享一个公网IP,公网端口转发会直接失效。
- 你可以对比Windows和同网络Linux机器的公网IP:在Windows上用浏览器搜索「我的公网IP」,在Linux上执行
curl ifconfig.me,如果两个IP不一致,说明Windows在CGNAT后面。这种情况可以考虑用反向SSH隧道或内网穿透工具(比如frp)绕开。
最后建议:先从内网测试缩小范围
先抛开公网,用同网络的另一台机器(比如手机开热点连接的电脑)测试:
ssh osbor@Windows的内网IP -p 1100
如果内网能正常连接,说明问题出在公网层面(端口转发/CGNAT);如果内网都连不上,那还是Windows本地的配置或安全软件拦截问题。
如果还是卡壳,可以把你的sshd_config内容、netstat -ano | findstr :1100的输出贴出来,我再帮你精准排查!
备注:内容来源于stack exchange,提问作者chasekosborne




