SSH隧道+Clash代理:异地访问公司内网服务的最佳实践

190 阅读3分钟

当我们在异地,想要访问家中或者公司网络中的设备或者服务时,可以怎么做呢?

之前讲到过frp代理和NAT内网穿透的方案

今天讲讲SSH隧道+Clash代理的方案,访问局域网

想象这样一个场景,你在公司又一堆服务,他们在192.168.3.0/24 这个网段上,你希望在外地访问这个在局域网中的服务

就可以利用一个中继服务器,一般是一个可以访问 192.168.3.0/24 这个网段 的带公网IP的服务器

在这个服务器上启动一个 sshd 服务,在本地通过 ssh 建立 socket 隧道,就可以转发本地的 内网请求到 公司的服务上

[你的设备] --SSH客户端--> [VPS上的SSH服务器(sshd)] --> [公司内网]

一般的流程是,将本地的 ssh 公钥放在 中继服务器上

[你的设备]
    ↓ 生成密钥对
[私钥 id_rsa] ← 保密,留在本地
[公钥 id_rsa.pub] ← 放在 VPS 中
    ↓
[负责人]
    ↓ 添加到 VPS
[VPS: /home/tiiny/.ssh/authorized_keys][你连接 VPS]
ssh -N -D 1080 tiiny@101.132.170.158
    ↓
[VPS 验证你的公钥][验证通过,建立 SSH 隧道]

利用 ssh 的动态端口转发技术,就可以访问整个网段

ssh -N -D 1080 net-proxy

ssh 隧道包括

  • 本地端口转发(Local Port Forwarding)
  • 远程端口转发(Remote Port Forwarding)
  • 动态端口转发(Dynamic Port Forwarding)

需要注意的是,ssh 隧道建立的是一个 socket5 协议的代理,在系统中需要特别设置之后,才会起到系统代理的效果

image-20251112233315799

讲到系统代理,就要提到

  • 系统代理
  • 虚拟网卡代理
  • 应用代理

系统代理就是在操作系统级别设置的代理配置,影响所有通过系统网络堆栈的应用程序

虚拟网卡代理是通过注册一个虚拟的网卡,将系统所有流量都通过代理软件进行代理的方式,可以避免有应用程序不遵守系统代理规则

应用代理指的是在程序内部配置的选项,可以选择是否走系统代理,或者单独设置的自己的代理

当我们通过 命令创建一个代理服务时,不太好管理他的开启和关闭,对于我比较习惯使用 docker,因为docker配置化的方式创建容器,同时可以使用可视化 软件管理 docker,就像管理服务一样

ssh -N -D 1080 net-proxy

image-20251112235931724

简单写一个 Dockerfile 或者利用 Agent IDE 帮我创建和配置,可以很轻松的创建一个 docker容器

FROM alpine:3.19

RUN apk add --no-cache openssh-client autossh && \
    mkdir -p /root/.ssh

COPY ssh_config /root/.ssh/config
COPY start-tunnel.sh /start-tunnel.sh
RUN chmod +x /start-tunnel.sh

EXPOSE 1080

CMD ["/start-tunnel.sh"]

image-20251113000114617

通过 docker创建的服务,但是还是有一个问题,这个专门的代理,占用了系统代理,导致我的 clash 无法同时开启,那也很麻烦。

实际上,我们可以手动配置 clash 订阅文件,配置规则让 公司内网网段的请求都走到 专门的规则中,从而也不占用系统代理的通道,实现共存

# 1. 添加代理节点 (Proxies)
proxies:
  # ... 其他节点 ...
  - { name: "公司内网 (SSH)", type: socks5, server: 127.0.0.1, port: 1080, udp: true }

# 2. 添加代理组 (Proxy Groups)
proxy-groups:
  # ... 其他组 ...
  - { name: "内网访问", type: select, proxies: ["公司内网 (SSH)", DIRECT] }

# 3. 添加规则 (Rules)
rules:
  # 将内网IP段和域名的流量指向 "内网访问" 策略组
  - IP-CIDR, 192.168.3.0/24, 内网访问
  # ... 其他规则 ...

image-20251113000457575

到此,我们就实现了通过中继服务的方式,访问某些局域网的方式,这种方式是可控、加密、且兼容性强的,大家可以试试使用这种方式访问自己家中的服务,或者公司的服务

image-20251113001220942