最近遇到一个小困扰,以前在家里用内网机器的IP直接访问服务器特别方便,但有时候出门了,只有SSH权限。不过,想了一下,用SSH来搭桥Socks5代理,并通过Clash接管流量,好像是个不错的解决方案。
方案设计
我决定通过SSH来设置一个Socks5代理,给客户端提供一个可以访问家里服务器的通道。然后,使用Clash来智能管理流量,检测Socks5是否生效,来决定是否走代理流量。步骤其实不复杂,来看看嗷。
1. 使用SSH设置Socks5代理
首先,我通过SSH连接到远程服务器,并设置一个Socks5代理。
ssh -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o TCPKeepAlive=yes -o ForwardAgent=no -o ForwardX11=no -N -D 127.0.0.1:8080 -p 221 root@*******.cn
解释一下这个命令的参数:
-D 127.0.0.1:8080:在本地端口8080上启动一个动态端口转发,充当Socks5代理的作用。-o ServerAliveInterval=60:每60秒发送一个空包,保持连接不中断。-o ServerAliveCountMax=3:如果连接没有响应,最多重试3次。-o TCPKeepAlive=yes:开启TCP连接的保活机制。-N:只进行端口转发,不执行远程命令。-p 221:指定SSH连接的端口(如果你的服务器不是默认的22端口,需要指定)。
这样一来,所有通过本地127.0.0.1:8080端口的流量就会被转发到远程服务器。
2. 配置Clash进行流量管理
接下来,我在Clash中设置代理规则,来判断是否走这个Socks5代理。Clash的fallback功能可以帮助我们实现自动切换流量。
节点:
append:
- name: 'SSH Tunnel'
type: 'socks5'
server: '127.0.0.1'
port: 8080
username: ''
password: ''
规则:
prepend:
- 'IP-CIDR,192.168.10.0/24,Proxy-local,no-resolve'
代理组:
prepend:
- type: 'fallback'
name: 'Proxy-local'
interval: 5
timeout: 5000
max-failed-times: 1
lazy: false
proxies:
- 'SSH Tunnel'
- 'DIRECT'
这段配置的意思是:
- 在Clash中定义了一个Socks5代理,指向127.0.0.1:8080。
- 使用
fallback代理组,当检测到Socks5代理有效时,流量会自动走这个代理,否则就直接连接。 - 一定要把 lazy 关掉!字如其名就是懒逼,就是不自动检测是否有效
你希望使用SSH隧道(SSH Tunnel)作为首选代理,当SSH隧道不可用时,流量会自动切换到直连(DIRECT)。通过配置 interval 和 timeout,你可以控制检测的频率和超时的容忍度。
悄悄滴说
这套方案的好处是,出门在外时,我只要保持SSH连接,其他流量就自动走代理,既方便又不耽误工作。而且,Clash的自动切换功能,保证了当代理不可用时,流量也能自动回到直连,不会造成卡顿或连接失败。
对于喜欢折腾技术的我来说,这种“远程办公”的方式无疑让生活和工作变得更加灵活高效。如果你也有类似需求,不妨试试看这个方法吧