跳转到内容

SOCKS5 动态代理 -D

动态转发在本机启动 SOCKS5 代理。客户端把“目标地址 + 端口”交给代理,NetShuttle 再通过远端 SSH 服务器建立对应 TCP 连接。

浏览器 / curl → 本地 SOCKS5 → SSH 服务器 → 客户端指定的目标
  • 监听方:本机。
  • 目标连接发起方:远端 SSH 服务器。
  • 目标是否固定:不固定。
  • 适合:多个内网域名、Web 管理、CLI 调试。
Terminal window
ssh -N -D 127.0.0.1:1080 user@ssh.example.com

含义:

部分含义
-D动态 SOCKS5 代理
127.0.0.1本机监听地址
1080SOCKS5 端口
user@ssh.example.com代理出口服务器

NetShuttle 当前支持:

  • SOCKS5。
  • 无认证握手。
  • CONNECT 命令。
  • IPv4、域名和 IPv6 地址类型。
  • 连接建立期间的数据积压和转发。

当前不包含:

  • SOCKS5 用户名 / 密码认证。
  • UDP ASSOCIATE。
  • BIND 命令。
  • HTTP 代理协议。

案例一:浏览器访问多个内网域名

Section titled “案例一:浏览器访问多个内网域名”

配置系统或浏览器代理:

代理类型:SOCKS5
地址:127.0.0.1
端口:1080

之后浏览器可以访问:

http://grafana.internal:3000
https://wiki.corp.example
http://service-a.internal:8080

不需要为每个域名单独创建一个 -L 规则。

建议使用仅浏览器代理,不要把系统代理长期设为全局开启,避免所有流量都经过远端网络。

本机解析目标域名:

Terminal window
curl --socks5 127.0.0.1:1080 http://service.internal:8080

由远端 DNS 解析目标域名:

Terminal window
curl --socks5-hostname 127.0.0.1:1080 http://service.internal:8080

区别很重要:

  • --socks5:本机先解析域名,再把 IP 交给代理。
  • --socks5-hostname:把域名交给 SOCKS5 代理,由远端侧解析。

如果内网域名只存在于远端 DNS,应优先使用 --socks5-hostname。

很多工具支持 HTTPS_PROXY,但 HTTP 代理变量不一定适配 SOCKS5。优先查看工具自己的 SOCKS5 参数,例如:

Terminal window
git -c http.proxy=socks5h://127.0.0.1:1080 clone https://git.internal/team/repo.git

socks5h 表示由代理端解析域名。

  1. 选择能够访问目标网络的 SSH 服务器。
  2. 新建隧道,添加动态转发规则。
  3. 本地地址填写 127.0.0.1。
  4. 本地端口填写 1080 或未占用端口。
  5. 启用规则。
  6. 在浏览器、命令行或应用中选择 SOCKS5 代理。
  • 绑定 127.0.0.1,不要将无认证 SOCKS5 暴露到局域网。
  • 使用完成后关闭代理规则。
  • 不要同时把浏览器全局流量发送到不可信服务器。
  • 远端服务器应只访问预期网络,避免把代理变成开放出口。
  • 对敏感服务继续使用应用层 TLS 和鉴权。

确认选择的是 SOCKS5,不是 HTTP 或 HTTPS。

尝试由远端解析:

Terminal window
curl --socks5-hostname 127.0.0.1:1080 http://service.internal

检查本机监听:

Terminal window
lsof -nP -iTCP:1080 -sTCP:LISTEN

可能是远端 DNS、目标防火墙或目标服务绑定地址问题。逐个使用 curl --socks5-hostname 验证。