Administrator
发布于 2025-09-27 / 23 阅读
0
0

服务器跳板之SOCKS5

一、SOCKS5 是什么?(核心原理)

SOCKS5 是一种网络代理协议,允许客户端(如你的本地虚拟机)通过代理服务器(如你的国外云主机)连接到任意目标服务器(如 Docker Hub、GitHub 等)。

1. 与 HTTP 代理的区别

特性

SOCKS5 代理

HTTP 代理

支持协议

TCP、UDP、IPv4/IPv6(通用)

仅 HTTP/HTTPS(应用层限定)

流量处理

不解析应用层数据(透明转发)

需解析 HTTP 头(如 Host)

适用场景

Docker 镜像拉取、游戏联机、SSH 隧道等

网页浏览、下载 HTTP 文件等

2. SOCKS5 的工作流程(以拉取 Docker 镜像为例)

  1. 本地虚拟机(客户端) → 发送请求到 127.0.0.1:1080(SOCKS5 代理端口)。

  2. SOCKS5 代理(云主机,通过 SSH 隧道实现) → 接收请求,加密后转发到目标服务器(如 hub.docker.com)。

  3. 目标服务器(Docker Hub) → 返回响应,经代理转发回本地虚拟机。

二、SSH 动态转发如何实现 SOCKS5?

远程主机:

/etc/ssh/sshd_config 中 AllowTcpForwarding 默认为注释状态(需显式设为 yes),否则 SSH 动态转发会被禁用。
systemctl restart sshd
#OpenSSH 7.4 及以上AllowTcpForwarding是注释状态,默认开启,但是如果是长期使用,还是建议进行相应的安全配置,如果你的服务器安全管理相对较弱,这个配置可能会有一定可控的风险,临时使用则在使用完成后还原配置并重启ssh即可,文章最后会附安全管理修改内容
关闭方式:
sed -i 's/AllowTcpForwarding yes/AllowTcpForwarding no/' /etc/ssh/sshd_config
systemctl restart sshd

可以使用命令放通:
sed -i 's/AllowTcpForwarding no/AllowTcpForwarding yes/' /etc/ssh/sshd_config
systemctl restart sshd

本地主机:

ssh -D 1080 -v  -o ServerAliveInterval=30 -N root@云主机IP  # 前台启动隧道,验证日志,带心跳,每30秒,避免超时假死

增加临时环境变量:只在当前终端生效,所以操作命令需要在开启一个新的本地主机的终端,也可以写入环境变量文件,如追加到~/.bashrc 或 ~/.zshrc中,source ~/.bashrc即可
export ALL_PROXY=socks5://127.0.0.1:1080
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
#注意,不要关闭这个终端,关闭终端回终止隧道

netstat -tulpn | grep 1080  #验证
pkill ssh  # 终止旧隧道

原理:

你配置的 ssh -D 1080 root@云主机IPSSH 动态端口转发,它在本地虚拟机的 127.0.0.1:1080 上创建一个 SOCKS5 代理服务。

参数详解:

  • -D 1080:将本地虚拟机的 1080 端口作为 SOCKS5 代理端口。

  • -f:后台运行 SSH 会话。

  • -C:压缩传输数据(加快速度)。

  • -q:静默模式(减少日志输出)。

  • -N:仅建立连接,不执行远程命令。

原理拆解:

  • 本地端:SSH 客户端在 127.0.0.1:1080 监听,接收所有发往该端口的流量。

  • 传输过程:流量被 SSH 加密后,通过已建立的 SSH 连接(本地 ↔ 云主机)转发到云主机。

  • 云主机端:SSH 服务端解密流量,将其转发到目标服务器(如 Docker Hub),并把响应原路带回。

三、配置本地docker使用socks5

两种方法:
1,配置daemon.json  #仅支持19.03以上版本
新增:
  "proxies": {
    "default": {
      "http": "socks5://127.0.0.1:1080",
      "https": "socks5://127.0.0.1:1080"
    }
  }
重启docker

2,修改服务配置文件,新增环境变量
vi /usr/lib/systemd/system/docker.service
在 [Service] 段落中添加以下两行(在 ExecStart 之前):
[Service]
Environment="HTTP_PROXY=socks5://127.0.0.1:1080"
Environment="HTTPS_PROXY=socks5://127.0.0.1:1080"
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

重启docker
#推荐这种方法,兼容性更高

然后就可以拉取外网的镜像了

#注意,使用完成后,需要进行回退处理,要不然可能会导致docker无法正常拉取国内镜像
#配置修改回去,重新加载系统参数,重启docker
docker info | grep -i proxy   #使用这条命令验证docker是否恢复默认网络,没输出则恢复,有输出就是文件没清理干净

#注意,因为docker是服务,所以需要单独配置,而curl、wget等是系统命令,所以隧道连接后可以直接使用

四、总结:如何稳定使用 SOCKS5 代理?

  1. 服务端配置:确保云主机的 sshd_configAllowTcpForwarding=yes,且 SSH 服务已重启。

  2. 客户端隧道:在本地虚拟机前台启动 SSH 动态转发(ssh -v -o ServerAliveInterval=30 -D 1080 ...),确认日志显示 Local forwarding listening on 127.0.0.1:1080

  3. 测试位置:所有测试命令(curldocker pull 等)必须在本地虚拟机执行,而非云主机。

  4. 环境变量:对需要联网的命令,提前设置 ALL_PROXY(如 export ALL_PROXY=socks5://127.0.0.1:1080)。

通过以上步骤,你就能利用 SOCKS5 + SSH 动态转发,让本地虚拟机 “借道” 国外云主机访问外网资源,解决 Docker 镜像拉取、软件包下载等问题。

五、若长期使用则需要进行如下安全修改,则风险可控

/etc/ssh/sshd_config

PasswordAuthentication no  # 禁用密码登录
PubkeyAuthentication yes   # 启用密钥登录
仅将你的本地虚拟机公钥(~/.ssh/id_rsa.pub)添加到云服务器的 ~/.ssh/authorized_keys 中,避免其他无关公钥混入。

PermitRootLogin no                # 禁止 root 登录
AllowUsers your_username          # 仅允许 "your_username" 登录(替换为你的实际账号)
# 或用 AllowGroups 限制用户组:AllowGroups ssh_admin

AllowTcpForwarding yes
# 仅允许转发到外网目标(禁止转发到内网网段,如 192.168.0.0/16、10.0.0.0/8)
PermitOpen any:80 any:443  # 仅允许转发到 80(HTTP)、443(HTTPS)端口(满足外网访问需求)
# 若需更严格,可指定目标域名对应的 IP 段(如 Docker Hub、GitHub 的 IP),但维护成本高


评论