还在为异地访问公司内网发愁?教你用SSH隧道+Clash代理实现安全高效的内网穿透,支持Docker容器化部署,与现有代理服务完美共存!
当我们在异地,想要访问家中或者公司网络中的设备或者服务时,可以怎么做呢?
之前讲到过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 隧道包括
需要注意的是,ssh 隧道建立的是一个 socket5 协议的代理,在系统中需要特别设置之后,才会起到系统代理的效果

讲到系统代理,就要提到
系统代理就是在操作系统级别设置的代理配置,影响所有通过系统网络堆栈的应用程序
虚拟网卡代理是通过注册一个虚拟的网卡,将系统所有流量都通过代理软件进行代理的方式,可以避免有应用程序不遵守系统代理规则
应用代理指的是在程序内部配置的选项,可以选择是否走系统代理,或者单独设置的自己的代理
当我们通过 命令创建一个代理服务时,不太好管理他的开启和关闭,对于我比较习惯使用 docker,因为docker配置化的方式创建容器,同时可以使用可视化 软件管理 docker,就像管理服务一样
ssh -N -D 1080 net-proxy

简单写一个 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"]

通过 docker创建的服务,但是还是有一个问题,这个专门的代理,占用了系统代理,导致我的 clash 无法同时开启,那也很麻烦。
实际上,我们可以手动配置 clash 订阅文件,配置规则让 公司内网网段的请求都走到 专门的规则中,从而也不占用系统代理的通道,实现共存
yaml# 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, 内网访问
# ... 其他规则 ...

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



本文作者:pepedd864
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!