一、SOCKS5 是什么?(核心原理)
SOCKS5 是一种网络代理协议,允许客户端(如你的本地虚拟机)通过代理服务器(如你的国外云主机)连接到任意目标服务器(如 Docker Hub、GitHub 等)。
1. 与 HTTP 代理的区别
2. SOCKS5 的工作流程(以拉取 Docker 镜像为例)
本地虚拟机(客户端) → 发送请求到
127.0.0.1:1080(SOCKS5 代理端口)。SOCKS5 代理(云主机,通过 SSH 隧道实现) → 接收请求,加密后转发到目标服务器(如
hub.docker.com)。目标服务器(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@云主机IP 是 SSH 动态端口转发,它在本地虚拟机的 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 代理?
服务端配置:确保云主机的
sshd_config中AllowTcpForwarding=yes,且 SSH 服务已重启。客户端隧道:在本地虚拟机前台启动 SSH 动态转发(ssh -v -o ServerAliveInterval=30 -D 1080
...),确认日志显示Local forwarding listening on 127.0.0.1:1080。测试位置:所有测试命令(
curl、docker pull等)必须在本地虚拟机执行,而非云主机。环境变量:对需要联网的命令,提前设置
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),但维护成本高