SSH中转代理

最近公司发文,不让员工在办公电脑上使用 Proxy 软件,公司可能会将知名 Proxy 软件加入黑名单,然后定期扫描。而公司提供的所谓「网络加速」实则非常龟速,这让之前一直畅快使用小猫咪的我实在无法忍受。

想到的一种解决方案是:

公司浏览器代理  -> 家里 Nas 开启小猫咪 -> 海外服务器 -> 目标网站

那该如何实现呢?

回想起数月前在内网拜读 EtherDream 大佬新作《借助云厂商 WebShell 实现稳定的 Proxy》的下午,对其中提到关键的步骤是 SSH 端口转发印象十分深刻,本来想直接抄代码试试,结果:
gg

只得一番放狗搜索,最后得到如下代码:

ssh -L 6677:localhost:8899 username@remote.host -p ssh-port

大意是监听本地 6677 端口的 TCP 流量,转发到远程端口 8899,我们需要做如下配置:
1. 本地浏览器设置 http 代理:127.0.0.1:6677
2. 远端启动小猫咪,监听 8899 端口

上面的配置允许局域网连接到 6677 端口,若要仅允许本机连接,需按如下方式绑定到本地 ip:

ssh -L 127.0.0.1:6677:localhost:8899 username@remote.host -p ssh-port

然后本地通过命令查看是否转发成功:

lsof -i -n -P | grep LISTEN | 6677

ssh       19375 user    7u  IPv6 0x53e662d5913a0023      0t0  TCP [::1]:6677 (LISTEN)
ssh       19375 user    8u  IPv4 0x53e662df450fc9db      0t0  TCP 127.0.0.1:6677 (LISTEN)

当我们通过浏览器访问 google.com 时,SSH 会将浏览器的访问数据经由远端服务器的小猫咪转发到 Google 服务器从而实现正常访问。

当然,弊端也是有的:
* 本地解析的 DNS 结果可能已经被污染,但我们不 care,毕竟本地使用小猫咪时也会返回 fake ip,最终还是得到海外服务器解析离目标服务最近的 IP 地址,不过还是会浪费一次 DNS 查询时间
* 无法直接转发 UDP 流量,本地若有依赖 UDP 的需要另寻他法
* 稳定性待测试

最后,记一下踩过的一点坑:
1. 小猫咪并不完全兼容小猫咪 Pro 的配置,需要删除错误提示项
2. rules 下仅保留如下规则即可

rules:
- GEOIP,CN,Domestic
- MATCH,Proxy

参考阅读