用 SSH 动态端口转发 + PAC 实现按域名分流的轻量代理
【摘要】 用 SSH 动态端口转发 + PAC 实现按域名分流的轻量代理在日常开发中,经常遇到这样的场景:某台机器访问特定网站(例如云服务控制台)不稳定,但又不希望所有流量都绕道代理。本文介绍一种零额外软件的方案:利用一台云服务器(如华为云 ECS)的 SSH,配合浏览器 PAC 脚本,实现“只有指定域名走代理”。 一、原理ssh -D 会在本地开启一个 SOCKS5 代理端口,所有经过该端口的连接...
用 SSH 动态端口转发 + PAC 实现按域名分流的轻量代理
在日常开发中,经常遇到这样的场景:某台机器访问特定网站(例如云服务控制台)不稳定,但又不希望所有流量都绕道代理。本文介绍一种零额外软件的方案:利用一台云服务器(如华为云 ECS)的 SSH,配合浏览器 PAC 脚本,实现“只有指定域名走代理”。
一、原理
ssh -D会在本地开启一个 SOCKS5 代理端口,所有经过该端口的连接都由远端服务器发起。- PAC(Proxy Auto-Config)脚本是一段 JavaScript 函数
FindProxyForURL(url, host),浏览器每次请求前调用它,决定直连还是走代理。 - 两者结合,就能做到按域名分流。
二、服务器端准备
ECS 只需要正常运行 sshd,安全组放行 22 端口即可,无需安装任何软件。建议使用密钥登录:
ssh-keygen -t ed25519 -f ~/.ssh/id_ecs -N ""
ssh-copy-id -i ~/.ssh/id_ecs.pub root@<ECS公网IP>
完成后建议关闭密码登录(PasswordAuthentication no),提升安全性。
三、客户端建立隧道并自动重连
#!/bin/bash
while true; do
ssh -N -D 127.0.0.1:1080 -i ~/.ssh/id_ecs \
-o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-o ExitOnForwardFailure=yes root@<ECS公网IP>
sleep 5
done
ServerAliveInterval 用于检测断线,外层循环保证 ssh 退出后 5 秒自动重连。没有 systemd 的环境用 nohup setsid 后台运行即可;有 systemd 的话可以写成 service 并设置 Restart=always。
验证:
curl --socks5-hostname 127.0.0.1:1080 https://ifconfig.me
返回 ECS 的公网 IP 即说明隧道正常。注意要用 --socks5-hostname,让 DNS 解析也在远端完成,避免本地解析失败。
四、PAC 按域名分流
function FindProxyForURL(url, host) {
var d = ["example-cloud.com", "cdn.example-cloud.cn"];
for (var i = 0; i < d.length; i++) {
if (host == d[i] || dnsDomainIs(host, "." + d[i]))
return "SOCKS5 127.0.0.1:1080";
}
return "DIRECT";
}
Chrome 可通过企业策略 ProxySettings(ProxyMode: pac_script)下发,修改后在 chrome://policy 点击“重新加载策略”即可生效。
五、踩坑记录
- 静态资源域名遗漏:主站域名走了代理,但 JS/CSS 放在另一个 CDN 域名上,页面会一片空白。排查方法是打开开发者工具 Network 面板,查看
ERR_NAME_NOT_RESOLVED的请求域名并加入 PAC 列表。 - DNS 泄漏:SOCKS5 模式下浏览器会把域名交给代理解析;命令行工具则要显式使用
socks5h/--socks5-hostname。 - 临时隧道地址变化:早期我用过内网穿透的临时域名,机器休眠后地址就变了;改为直连 ECS 的 SSH 后稳定很多。
六、总结
一台常驻的云服务器 + SSH + PAC,就能得到一个安全(密钥认证、加密传输)、轻量(零额外安装)、可控(按域名分流)的代理方案,适合个人开发环境使用。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)