多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

Windows离线电脑SSH远程连接配置与排障实战指南

Windows离线电脑SSH远程连接配置与排障实战指南 1. 需求拆解与整体方案选型1.1 这个需求到底在解决什么问题先说清楚这个场景。所谓“离线电脑”是指一台不接入互联网、只在局域网内运行的Windows电脑常见于内网开发机、实验室工作站、机房服务器、或者纯粹为了隔离病毒不想联网的测试机。而本地电脑是指你手头日常使用的另一台Windows机器两台电脑在同一个局域网内你想坐在自己的工位上直接操作那台离线的电脑不用来回跑机房。为什么要用SSH因为从Windows 10 1809和Windows Server 2019开始微软官方把OpenSSH Server和OpenSSH Client做成了Windows的可选功能不需要装任何第三方软件就能用。更重要的是SSH不仅适合敲命令配合后续的SCP、SFTP、端口转发还能传文件、连数据库、代理内网服务。这个组合在内网离线场景里非常实用。这里必须先破除一个误区离线电脑的“离线”不等于不能开SSH服务。SSH服务只在局域网内部监听端口根本不需要外网联网。很多人一听“离线”就觉得啥都装不了其实Windows自带的OpenSSH组件就在系统镜像里不依赖在线下载。另一个关键认知是只要两台机器能互相Ping通SSH通路就具备了一半的可行性。另一半取决于三件事——目标机是否安装了SSH服务端、防火墙是否放行22端口、账号是否有登录权限。这三个点正好对应这篇文章的三大章节。1.2 方案选型自带OpenSSH还是第三方工具我在实际给内网机器配SSH时首先考虑的是Windows自带的OpenSSH Server。原因很简单离线机器不能随便连外网下载工具而自带功能是系统组件只要系统版本不低于Windows 10 1809安装起来就是一条命令的事。对比一下常见替代方案第三方SSH服务端比如FreeSSHd、Bitvise SSH Server。功能虽然多但在离线条件下你得先想办法把安装包拷进去而且这类工具通常需要图形界面配置远程操作不方便还有杀毒软件误报问题。Git Bash自带的sshd如果你的离线机器上装了Git for Windows里面确实带了sshd.exe但默认不注册为系统服务每次开机要手动启管理起来比较烦。PowerShell远程会话WinRM这也是一种远程管理方式但它走的是5985端口配置策略比SSH复杂尤其在离线域控环境下WinRM的TrustedHosts设置经常把人折腾到崩溃。所以我最终的选型就是微软原生OpenSSH Server 局域网静态IP 密钥认证。这套方案的好处是组件系统自带、不依赖外网、命令可脚本化、按Windows服务方式托管、开机自启、权限模型清晰。2. 离线电脑上的服务端搭建与配置2.1 安装OpenSSH Server的两种方式先检查目标离线电脑的Windows版本。按下Win R输入winver确认版本号。只要是Windows 10 1809以后的版本或者Windows Server 2019/2022都自带OpenSSH可选功能。Windows 7和Windows 8/8.1则需要用到第三方的Win32-OpenSSH预编译包安装方式不同本文主讲主流方案。方式一图形界面安装进入“设置 → 应用 → 可选功能”点击“添加功能”在列表里找到OpenSSH 服务器OpenSSH Server点击安装。这个过程不需要重启也不需要联网可选功能组件已内置在系统镜像中。方式二PowerShell命令行安装这也是我比较推荐的方式因为可以直接远程执行或者批量操作。以管理员身份打开PowerShell执行Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0执行完可以通过以下命令验证Get-WindowsCapability -Online | Where-Object Name -like OpenSSH*输出里如果显示State : Installed就说明安装成功。这里有两个细节值得注意安装过程如果报“文件无法下载”通常是因为系统更新源被组策略改到了内网更新服务器而不是真的没网。这种情况可以检查组策略里的Windows更新设置指向内网WSUS服务也能完成功能安装。安装功能后默认服务是“手动”启动类型需要改成“自动”否则重启后SSH服务不会随系统起来——这个坑我踩过好几次。2.2 启动服务与开机自启设置安装完成后的第一件事是确认 sshd 服务是否已经在运行。执行Get-Service sshd如果状态是Stopped启动它并设置为自动Start-Service sshd Set-Service -Name sshd -StartupType Automatic这里要特别说明一下。OpenSSH Server在Windows上作为标准Windows服务运行服务名为sshd而不是Linux上的sshd.service。如果之后你想查看它运行是否正常用Get-Service sshd或者打开“服务”管理单元找到OpenSSH SSH Server。还有个很多人会忽略的点Windows防火墙默认会在安装OpenSSH Server时自动创建一条入站规则放行22端口但这条规则仅在“配置文件”处于“公用”和“域”类型时生效。如果你的网络配置文件被识别为公用网络有时候规则没有正确匹配。保险起见手动确认防火墙规则New-NetFirewallRule -Name OpenSSH-Server-In-TCP -DisplayName OpenSSH Server (sshd) -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22注意如果已经存在同名规则执行上面这条命令会报错。可以先用Get-NetFirewallRule -Name OpenSSH-Server-In-TCP检查是否存在存在就跳过不存在再添加。2.3 离线机器的网络配置与IP规划这一步是很多人忽略但影响巨大的环节。既然本地电脑要通过网络连到离线电脑两台机器必须在同一网段否则SSH连不上所有后续操作无从谈起。先确认离线电脑的IP地址。命令行执行ipconfig看到IPv4 地址和子网掩码。比如离线电脑是192.168.1.100 / 255.255.255.0那么你的本地电脑也必须处于192.168.1.x网段。这里有个实操经验内网里如果开了DHCPIP地址可能会变今天连得上明天连不上。所以强烈建议给离线电脑配置静态IP。操作路径是“网络连接 → 以太网 → 属性 → 双击 IPv4 协议 → 选择使用以下IP地址”。一般填法举例IP地址192.168.1.100子网掩码255.255.255.0默认网关192.168.1.1如果这台机器不需要出网网关也可以留空但DNS建议填避免某些服务解析慢如果两台电脑中间隔了交换机或路由器最好先用ping考验物理链路。在本地电脑上执行ping 192.168.1.100 -t能收到回复说明二层三层都通了如果超时检查一下是不是连了不同的交换机VLAN或者Windows防火墙开了“阻止所有传入连接”导致ICMP被丢弃。另外一个容易被忽视的坑离线电脑的网卡可能启用了省电模式系统空闲一段时间后网卡自动休眠网络连接断开。在“设备管理器 → 网络适配器 → 属性 → 电源管理”里把“允许计算机关闭此设备以节约电源”的勾选去掉这是机房机器常见的疑难杂症。3. 本地电脑的SSH客户端配置与连接验证3.1 检查本地OpenSSH客户端并测试基本连接本地电脑通常不需要额外安装SSH客户端。Windows 10/11自带的OpenSSH Client同样是可选功能但默认在大多数版本里已经安装。验证一下ssh -V如果系统提示不是内部或外部命令那么同样进入“可选功能”把OpenSSH 客户端添加上。基础连接命令非常简单。在CMD或PowerShell里执行ssh 用户名192.168.1.100比如离线电脑上有个用户叫admin就执行ssh admin192.168.1.100第一次连接时会出现确认远程主机指纹的提示The authenticity of host 192.168.1.100 (192.168.1.100) cant be established. ECDSA key fingerprint is SHA256:xxxxxx. Are you sure you want to continue connecting (yes/no)?输入yes回车。这里解释一下这个指纹的作用它在核实你连的确实是目标机器防止内网里有人冒充。确认后会要求输入用户密码这是离线电脑上该用户的开机登录密码。注意SSH登录用的密码和该用户的Windows登录密码是同一个且不能是空密码。输密码时屏幕不显示任何字符这是正常现象不是键盘坏了。输完直接回车就行。登录成功后会进入Windows默认Shell通常是PowerShell。你会看到熟悉的Windows命令行界面现在你敲的每一条命令都在远程电脑上执行——比如ipconfig、systeminfo、dir效果和坐在那台电脑面前操作完全一样。3.2 推荐几个顺手的SSH工具以及对比虽然系统自带的命令行SSH足够完成基本操作但我实际工作里发现长时间管理多台离线电脑时命令行工具在体验上还是偏单薄。比如终端的自动补全、复制粘贴、快捷保存多台主机信息这些都是刚需。我自己常用的几个工具Windows Terminal 自带OpenSSH最轻量零安装成本配合Windows Terminal的分页签功能可以同时开好几个SSH窗口。MobaXterm功能非常全面的终端工具内置SFTP文件管理、端口转发、宏录制、多会话保存。离线电脑场景里我通常用它来拖文件因为它的左侧栏直接就是远程目录树拖拽上传下载非常直观。FinalShell国产工具Windows和macOS都支持自带实时资源监控、网络监控看远程电脑的CPU、内存占用很方便。对Windows远程机器它也能呈现系统信息。PuTTY经典老牌极简风格缺点是不支持标签页和多会话保存但胜在体积小、绿色免安装。对于纯命令行用户直接在cmd或PowerShell里敲SSH命令永远是最快的但如果你要管理不止一台离线电脑我真心建议用MobaXterm或FinalShell把主机信息存下来省得每次翻IP和用户名。3.3 部署密钥认证彻底告别每次输密码用密码登录虽然简单但在内网环境里有一个麻烦如果离线电脑的密码策略要求定期改密你的SSH脚本、自动化任务都会受影响。而且密码认证在安全审计上也不好交代。所以我建议给离线电脑部署SSH密钥认证。这个流程在Windows上和在Linux上有细节差异我第一次弄的时候卡了好一阵下面把关键点写清楚。第一步在本地电脑生成密钥对ssh-keygen -t rsa -b 4096执行后一路回车即可。默认会在C:\Users\你的用户名\.ssh\下生成两个文件私钥id_rsa和公钥id_rsa.pub。私钥必须妥善保管不能泄露公钥是放到目标机器上的。这里注意一个细节如果你用的是Windows较新版本ssh-keygen默认使用ED25519生成的公钥以ssh-ed25519开头而老版本默认是RSA。两者都能用但如果离线电脑的OpenSSH版本较旧建议显式指定ssh-keygen -t rsa -b 4096第二步把公钥安装到离线电脑上获取公钥内容type C:\Users\你的用户名\.ssh\id_rsa.pub把输出的整行复制下来然后SSH登录到离线电脑在远程PowerShell里执行cd $env:USERPROFILE\.ssh notepad authorized_keys如果没有.ssh目录先创建mkdir $env:USERPROFILE\.ssh把公钥内容粘贴进authorized_keys文件并保存。文件名必须是authorized_keys不能是authorized_keys.txt否则服务端不识别。如果系统隐藏了扩展名最好在资源管理器里确认一下。第三步修改sshd_config开启密钥认证离线电脑C盘Windows目录下的sshd_config路径是C:\ProgramData\ssh\sshd_config用管理员权限的记事本打开找到这几行# PubkeyAuthentication yes # PasswordAuthentication yes把注释去掉设为PubkeyAuthentication yes PasswordAuthentication yes这里的PasswordAuthentication我建议保留为yes原因是不管密钥认证配得多熟练密码登录始终是排障期的保底方式等全部稳定后再改成no更稳妥。第四步重启sshd服务使配置生效Restart-Service sshd然后回到本地电脑直接执行ssh admin192.168.1.100这次不需要输密码就能直接登录说明密钥认证已经生效。这里就有个经验谈千万不要在sshd_config里把AuthorizedKeysFile设置成Windows用户目录之外的路径Windows版OpenSSH对路径的解析和Linux不一样很容易出现“公钥明明放好了但就是不生效”的情况。默认路径就是相对用户配置目录保持默认最安全。4. 典型连接失败场景排查与远程维护技巧4.1 每次连接都超时或拒绝的常见原因在实际操作中连接失败是最常见的。我把遇到过的案例整理成一张速查表方便你对照排查症状常见原因解决方式连接超时无任何提示卡住不动目标机器没开机、防火墙拦了22端口、IP不在同一网段先ping通再连检查防火墙入站规则确认IP是否规划正确连接拒绝Connection refusedsshd服务没启动Get-Service sshd确认服务状态启动服务认证失败Permission denied用户名写错、密码输错、密码被禁用确认用户名是否正确换个管理账号测试检查sshd_config中PasswordAuthentication值远程主机关闭连接Connection closed by remote host磁盘空间满导致sshd无法写入日志、用户配置文件权限出错查看C:\ProgramData\ssh\logs\sshd.log日志清理磁盘检查authorized_keys权限首次连接指纹提示但后续报HOST KEY变化离线电脑被重新安装过系统公钥变了删除本地known_hosts中的旧记录重新连接其中我最想提醒的是“Connection closed by remote host”这个报错。Windows版OpenSSH在启动时会检查C:\ProgramData\ssh和用户.ssh目录的ACL权限如果权限继承关系乱了sshd会拒绝连接并直接断开。这时候要做的不是反复重连而是检查两个位置C:\ProgramData\ssh\sshd_config所在目录的权限是否允许SYSTEM和Administrators完全控制。用户.ssh\authorized_keys的ACL是否只允许当前用户和SYSTEM访问。修复权限可以用icacls命令icacls C:\Users\admin\.ssh\authorized_keys /inheritance:r /grant admin:F SYSTEM:F这是Windows版OpenSSH特有的坑Linux上没这个问题千万别用Linux的思路硬套。4.2 让远程维护更顺手的几个小技巧一旦SSH通路稳定了你可以做很多事来提升维护体验。技巧一利用计划任务实现“伪远程开机”离线电脑如果配置了Wake-on-LAN远程唤醒你可以在本地电脑上通过发送魔术包的方式在SSH之前唤醒目标机。如果硬件不支持WOL也可以给离线电脑配一个“来电自启”的BIOS选项让它在断电恢复后自动开机。这样你在工位上就能完成从开机到SSH登录的完整链路。技巧二用SCP/SFTP传文件不另开共享目录很多人习惯了网上邻居共享文件夹的方式但离线场景里SMB共享经常会因为凭据问题、防火墙规则连不上。用自带的SCP命令最省心scp C:\测试脚本.ps1 admin192.168.1.100:C:\Users\admin\Desktop\反过来下载日志文件scp admin192.168.1.100:C:\logs\app.log D:\logs\有图形界面需求的直接用MobaXterm的SFTP面板拖拽。技巧三用SSH隧道访问离线电脑的内网服务这是SSH比较进阶的用法但非常实用。假设离线电脑上跑了一个Web管理界面端口是8080但防火墙只放行了22端口。你可以在本地电脑上执行ssh -L 8080:127.0.0.1:8080 admin192.168.1.100然后浏览器访问http://127.0.0.1:8080流量就会通过SSH加密隧道转发到离线电脑的8080端口。这个方案避免了在防火墙上额外开放端口对于安全要求高的离线环境来说非常合适。4.3 关于离线环境独有的安全与稳定性经验文章接近尾声补充几点我在实际维护中总结的经验。第一离线电脑虽然不上外网但SSH服务暴露在内网里依然有被内网其他机器扫描的风险。强烈建议修改默认22端口或者至少配置密钥认证并禁用空密码登录。修改端口的方法是在sshd_config里找到#Port 22行改为Port 2222之类的端口号然后重启服务。本地连接时用ssh -p 2222 admin192.168.1.100。第二Windows自带的OpenSSH日志默认只记录少量信息。遇到疑难问题时可以用debug模式手动运行sshd来观察详细输出sshd -d这会以前台模式运行把调试日志直接打印在屏幕上连不上时看这个输出最直观。注意debug模式运行前先停掉服务否则端口被占用。第三低配离线电脑上sshd的信息加密和解密会消耗一些CPU资源。如果机器性能很差比如工控机、老笔记本把密钥算法的优先级调低一点或者在sshd_config里用Ciphers行限制加密算法为aes128-ctr这类轻量算法能明显改善响应速度。根据我个人经验Windows上的SSH和Linux上的SSH虽然命令长得差不多但排障思路完全不一样。Linux看journalctl日志、改权限、看SElinux上下文Windows上最重要的三句话是服务起没起、端口通不通、权限对不对。把这三点先确认八成的连接问题都能当场解决。这套方法我用了好几年从Win10到Win11从单台离线机器到几十台的内网集群都靠它打底稳得很。
返回列表