Windows 浏览器访问不可达网段:SSH SOCKS5 与 SwitchyOmega 配置
一个常见的环境限制:本机(Windows)无法直接访问目标 IP,但能连上一台跳板机,跳板机可以访问目标。如果需求只是浏览器访问目标上的 Web 服务,不必给系统装全局代理客户端——用 SSH 自带的 SOCKS5 动态转发,配合浏览器插件的分流规则和 NSSM 服务化,可以做到"浏览器里直接输入目标原始地址,只有目标网段走代理,其余流量不受影响",并支持开机自启与断线自动重连。本文给出完整配置步骤与几种替代方案的对比。
方案构成
三个组件各司其职:SSH -D 在本机开 SOCKS5 端口;SwitchyOmega 决定哪些地址进这个端口;NSSM 把 SSH 进程注册成 Windows 服务,负责开机自启与崩溃重启。
第一步:建立 SSH SOCKS5 隧道
ssh -D 1080 user@跳板机IP -N -D 1080:在本机 1080 端口开启 SOCKS5 动态转发;-N:不执行远程命令,只维持转发;- 跳板机需允许 SSH 密钥登录(服务化后无人交互,密码登录不可行)。
验证隧道是否工作:
curl.exe --socks5 127.0.0.1:1080 http://目标IP/ 能返回目标服务的响应即隧道可用。
第二步:SwitchyOmega 分流
在 Chrome 应用商店安装 SwitchyOmega,配置两层:
- 新建代理服务器情景模式:协议 SOCKS5,服务器
127.0.0.1,端口1080; - 新建自动切换情景模式:
- 规则列表添加一条:条件类型选 IP 通配符,IP 填目标网段(示例
10.0.*,按实际填写),情景模式选上面的 SOCKS5 代理; - 默认情景模式选直接连接。
- 规则列表添加一条:条件类型选 IP 通配符,IP 填目标网段(示例
最后把插件切换到自动切换模式。效果:访问目标网段时自动走 SSH 隧道,其余网站保持直连,浏览器地址栏始终使用目标的原始 IP,无需改成 localhost:某端口。
第三步:NSSM 注册开机自启服务
命令行 SSH 会话随终端关闭而断开,用 NSSM(Non-Sucking Service Manager)把它注册为 Windows 服务。以下命令均在管理员 PowerShell下执行。
先确认 SSH 的完整路径:
where.exe ssh
# 通常为 C:\Windows\System32\OpenSSH\ssh.exe 注册服务:
nssm install ssh-proxy GUI 中填写:
| 字段 | 值 |
|---|---|
| Path | C:\Windows\System32\OpenSSH\ssh.exe |
| Arguments | -D 1080 -N user@跳板机IP |
| Startup directory | C:\Windows\System32 |
I/O 标签页把 stdout/stderr 指到日志文件(如 C:\ssh-proxy.log),便于排查。然后设置自启并启动:
nssm set ssh-proxy Start SERVICE_AUTO_START
nssm start ssh-proxy 密钥路径是这里最常见的坑:Windows 服务默认以 SYSTEM 账户运行,它读取的是 C:\Windows\System32\config\systemprofile\.ssh,而不是你用户目录下的密钥。两种解法任选其一:
# 解法一:让服务以你的账户运行
nssm set ssh-proxy ObjectName .\你的用户名 你的密码
nssm restart ssh-proxy
# 解法二:把密钥复制给 SYSTEM 账户
Copy-Item -Recurse C:\Users\你的用户名\.ssh C:\Windows\System32\config\systemprofile\.ssh 服务运行后,SSH 断线时 NSSM 会按退出码自动重启进程,起到断线重连的效果。日常管理:
nssm start ssh-proxy # 启动
nssm stop ssh-proxy # 停止
nssm restart ssh-proxy # 重启
nssm status ssh-proxy # 状态
nssm edit ssh-proxy # 编辑配置(GUI)
nssm remove ssh-proxy # 删除服务 注意本机防火墙不需额外放行 1080(仅本机访问);若其他程序也要使用这个代理端口,再按需放行。
方案对比
| 方案 | 访问地址 | 覆盖范围 | 额外软件 |
|---|---|---|---|
SSH -L 端口转发 | localhost:映射端口 | 仅指定端口 | 无 |
SSH -D + SwitchyOmega | 目标原始 IP | 仅浏览器 | 浏览器插件 |
SSH -D + Proxifier | 目标原始 IP | 全系统 | Proxifier(付费) |
单端口转发最简单但地址会变;浏览器级分流对"访问 Web 服务"这一需求刚好够用且免费;只有当命令行工具等其他程序也需要走代理时,才需要全系统级的方案。
小结
SSH SOCKS5 动态转发 + SwitchyOmega 按网段分流 + NSSM 服务化,三个免费组件组合起来,可以在不改目标服务、不装代理客户端的前提下,让浏览器透明访问不可达网段。配置的关键点只有两处:SwitchyOmega 的 IP 通配符规则决定分流边界;服务化后注意 SYSTEM 账户的 SSH 密钥路径。