Windows 下 SSH 连接优雅走代理的几种姿势

在日常折腾服务器或者进行开发工作时,咱们经常会遇到一个让人头秃的问题:手里这台 Windows 电脑没法直接连上那台位于国外的 VPS,或者连接速度感人。但是,咱们本地通常都会开着代理(Clash、V2RayN 之类的)。

这时候,怎么让 SSH 命令也聪明地通过代理出去呢?今天就给大伙儿梳理几种常用的姿势,从原生支持到曲线救国,总有一款适合你。

方法一:OpenSSH 原生 ProxyJump(最推荐)

如果你用的是 Windows 10 或 11,系统自带了 OpenSSH 客户端。这其实是个大杀器,因为它原生支持通过跳板机(Jump Host)连接,而我们的代理软件在本地开启的 SOCKS5 端口,实际上就是一个现成的跳板。

1. 找到你的本地代理端口

首先,确保你的代理软件正在运行,并且开启了“允许来自局域网的连接”。假设你有如下设置:

  • HTTP 代理端口:7890
  • SOCKS5 代理端口:7891

2. 编辑 SSH 配置文件

打开你的用户目录下的 .ssh 文件夹(路径通常是 C:\Users\你的用户名\.ssh),如果没有就新建一个。在里面创建或编辑 config 文件(注意没有后缀名)。

添加如下配置:

Host jump
    HostName 127.0.0.1
    Port 7891
    # 注意:这里使用 nc 作为 ProxyCommand 的桥梁
    ProxyCommand C:\Windows\System32\connect.exe -H 127.0.0.1:7891 %h %p

Host your-server-name
    HostName 你的服务器IP
    User root
    # 通过上面的 jump 跳转
    ProxyJump jump

注意:Windows 自带的 SSH 客户端有时候配置 ProxyCommand 需要借助 connect.exe 或者直接使用 -o 参数。更现代的一种写法是直接利用 SSH 8.x 版本后内置的 ProxyJump 对于 SOCKS 的支持,但在 Windows 上配置 nc 可能会比较麻烦。其实,更简单的原生写法是下面这种:

更简化的原生写法

如果你的 OpenSSH 版本较新,可以直接使用 -J 参数,或者在配置文件里这样写(假设你的代理是 HTTP 类型,SOCKS5 稍有不同):

Host *
    # 如果你的是 HTTP 代理
    # ProxyCommand powershell -Command "& { $client = New-Object System.Net.Sockets.TcpClient('127.0.0.1', 7890); $stream = $client.GetStream(); $writer = New-Object System.IO.StreamWriter($stream); $reader = New-Object System.IO.StreamReader($stream); $writer.WriteLine('CONNECT %h:%p HTTP/1.0'); $writer.WriteLine(); $writer.Flush(); $line = $reader.ReadLine(); $client.SendTimeout = 10000; $client.GetStream().CopyTo([System.Console]::OpenStandardOutput()) }"

    # 如果你用的是 SOCKS5 代理(如 Clash 默认),这是最通用的 Unix 风格配置,但在 Win 下可能需要 Git Bash 的 nc 支持。
    # 推荐看方法二的 Git Bash 方式,或者直接用命令行参数。

最靠谱的命令行临时方案(无需改配置文件): 打开 cmd 或 PowerShell,直接敲:

ssh -o ProxyCommand="C:\Windows\System32\connect.exe -S 127.0.0.1:7891 %h %p" user@yourserverip

(注:如果你的系统里没有 connect.exe,这个方法会报错,请往下看方法二)

方法二:Git Bash / Cygwin 中的 SSH(超顺滑)

很多开发者的电脑上都装了 Git for Windows。它自带了一个很好的环境,里面预装了 nc (netcat) 工具。这让配置变得异常简单,和 Linux 下的体验一模一样。

打开 Git Bash,编辑 ~/.ssh/config,写入:

Host proxy-ssh
    HostName %h
    Port %p
    ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p
    # -X 5 表示使用 SOCKS5 协议
    # -x 后面接你的代理地址和端口

Host my-vps
    HostName 1.2.3.4
    User root
    # 继承上面的配置,或者直接写 ProxyCommand
    ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p

保存后,在 Git Bash 里直接 ssh my-vps 就能连上了。这是我最推荐的方式,配置量少,且逻辑清晰。

方法三:PuTTY 图形化配置(适合不爱敲命令的)

如果你习惯用 PuTTY 这种图形化工具,配置代理也是分分钟的事,而且支持得很完美。

  1. 打开 PuTTY,输入你的服务器 IP。
  2. 在左侧菜单树中,展开 Connection -> SSH,找到 Tunnels。但这主要做转发,我们要找的是代理设置。
  3. 实际上,应该在 Connection -> Proxy 里:
    • Proxy Type: 选择 SOCKS version 5(或者 HTTP,视你的代理软件类型而定)。
    • Proxy Hostname: 填 127.0.0.1
    • Port: 填你的代理端口(如 7891)。
  4. 回到 Session 页面,保存一下配置。
  5. 点击 Open,你会发现连接成功通过代理绕过了墙的限制。

常见问题 & 避坑指南

Q: 提示 Bad owner or permissions on xxx/config 是怎么回事? A: 在 Windows 下,SSH 对配置文件的权限很敏感。请确保 .ssh 目录和 config 文件只有当前用户有写入权限,或者尝试右键属性 -> 安全 -> 高级 -> 禁用继承,删除其他用户权限。

Q: 还是不行,连接超时。 A: 重点检查代理软件是否开启了“允许局域网连接”。很多软件默认只监听 127.0.0.1,但如果你的 SSH 通过 WSL 或者虚拟器访问,可能需要确认下防火墙或者监听地址。

Q: 我想只对特定域名走代理,其他直连怎么办? A: 这就是 ~/.ssh/config 强大的地方。你只在针对某些国外服务器的 Host 块里添加 ProxyCommand,其他的 Host 保持默认即可。SSH 是按顺序匹配配置的。

总结

在 Windows 上折腾 SSH 代理,核心痛点在于缺少 Linux 下顺手的 nc 命令。

  • 如果你追求原生体验,且不折腾第三方工具,尝试使用 Git Bash 里的 SSH 配合 nc 命令成功率最高。
  • 如果只是临时用一次,直接 PuTTY 配置最快。
  • 如果你非要在 PowerShell 里硬刚,可能需要寻找第三方的 connect.exe 或者用 PowerShell 脚本写 ProxyCommand,稍微有点硬核。

希望这篇笔记能帮大家在被拒绝连接的时候,多一条路走!

标签: none

AI Skills Smart Station on Nick Launches

评论已关闭