1. 先让服务器有代理环境
1.1. ssh 反向隧道
要求:
- 本机能科学
- 能 ssh 连接服务器
- 服务器的
/etc/ssh/sshd_config
中 AllowTcpForwarding yes
或者被注释(默认为 yes)
思路:
- 通过 ssh 命令,让服务器上的 ssh 服务再监听一个端口
- 当请求进入这个端口时,通过 ssh 连接,把请求传到本机
- 本机再转到可以科学的 ip:port,从而获取科学环境
简图:

场景假设:
- 本地 windows 7890 上有 clash
- vmware 里有虚拟机,虚拟机网络为 桥接 模式
- 此时虚拟机 ip 是 192.168.124.15
- windows ip 是 192.168.124.5
具体操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| # 如果在 windows 上开启 ssh 反向隧道 # 本机有 clash 所以是 127.0.0.1 ssh -R 12345:127.0.0.1:7890 -p 22 root@<服务器ip> -N -f
# 如果在虚拟机中开启 ssh 反向隧道 # 虚拟机无 clash 所以要指向 windows:192.168.124.5 ssh -R 12345:192.168.124.5:7890 -p 22 root@<服务器ip> -N -f
# 在服务器上检查效果 # 检查第一步:12345 有 ssh 服务 ╰─❯ netstat -tunlp | grep ssh tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 736/sshd: /usr/sbin tcp 0 0 127.0.0.1:12345 0.0.0.0:* LISTEN 353706/sshd: root tcp6 0 0 :::22 :::* LISTEN 736/sshd: /usr/sbin tcp6 0 0 ::1:12345 :::* LISTEN 353706/sshd: root # 检查第二步:可以访问谷歌 ╰─❯ curl -x localhost:12345 -I www.google.com HTTP/1.1 200 OK
|
注:-N 不执行远程命令 -f 在后台运行 ssh 会话
总结:
最简单快捷、侵入性最低的办法
1.2. 内网穿透工具
工具举例:
frp、rathole 等
要求:
- 本机能科学
- 本机、服务器上都安了工具
- 服务器需要新开一个端口(起到 ssh 反向隧道中的 22 端口的作用)
思路:
和 ssh 反向隧道一样
ssh 反向隧道:
服务器访问 google => 服务器 12345 端口 => ssh 服务拿到请求 => ssh 隧道 => 本机 => 科学环境
frp、rathole:
服务器访问 google => 服务器 12345 端口 => frp、rathole 拿到请求 => 工具长连接 => 本机 => 科学环境
具体操作:
(场景不变,这里只举例上面第二种虚拟机连接的情况)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| # rathole 安装步骤省略 # 服务器上的配置文件(部分) [server] bind_addr = "0.0.0.0:11111" # 长连接端口
[server.services.my_win_clash] token = "my_secret_token" bind_addr = "0.0.0.0:12345"
# 虚拟上的配置文件(部分) [client.services.my_win_clash] token = "my_secret_token" local_addr = "192.168.124.5:7890"
# 配置解释 11111 类似 ssh 中的 22 my_win_clash 是用户自定义的,要能对上 my_secret_token 相当于连接密码,要能对上
|
检查效果
1 2 3 4 5 6 7
| # 第一步:rathole 已监听 7890 端口 ╰─❯ netstat -tunlp | grep rathole | grep 7890 tcp 0 0 0.0.0.0:7890 0.0.0.0:* LISTEN 665336/rathole
# 第二步:可以访问谷歌 ╰─❯ curl -x localhost:7890 -I www.google.com HTTP/1.1 200 OK
|
总结:
比 ssh 麻烦,但更稳定
2. 再保证应用走环境
2.1. 全局环境变量
常用变量
1 2 3 4 5 6 7 8 9 10 11 12 13
| # 大写 ALL_PROXY HTTP_PROXY HTTPS_PROXY FTP_PROXY SOCKS_PROXY
# 小写 all_proxy http_proxy https_proxy ftp_proxy socks_proxy
|
设置方法
编辑 ~/.zshrc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
| # 开启代理 proxyon () { export ALL_PROXY="http://localhost:7890" export all_proxy="http://localhost:7890" echo export ALL_PROXY="http://localhost:7890" echo export all_proxy="http://localhost:7890" }
# 取消代理 proxyoff () { unset ALL_PROXY unset all_proxy echo unset ALL_PROXY echo unset all_proxy }
# 查看代理 proxyecho () { echo ALL_PROXY="$ALL_PROXY" echo HTTP_PROXY="$HTTP_PROXY" echo HTTPS_PROXY="$HTTPS_PROXY" echo FTP_PROXY="$FTP_PROXY" echo SOCKS_PROXY="$SOCKS_PROXY" echo all_proxy="$all_proxy" echo http_proxy="$http_proxy" echo https_proxy="$https_proxy" echo ftp_proxy="$ftp_proxy" echo socks_proxy="$socks_proxy" }
|
2.2. 手动指定
注:除非有特殊配置,git、curl、wget 只需配置全局变量,就可以走代理了
2.2.1. curl
-x 选项
1 2 3 4 5
| # 示例一 curl -x localhost:7890 -I www.google.com
# 示例二 curl -x localhost:7890 -LO https://github.com/fastfetch-cli/fastfetch/releases/download/2.27.1/fastfetch-linux-amd64.deb
|
2.2.2. docker
- docker-cli、dockerd、docker container 三者代理设置是独立的
- 如果需要成功 docker pull 镜像,需要同时配置 docker-cli、dockerd 代理
- 如果需要运行时的容器,通过代理访问外部网络,需要配置 docker container 代理
docker-cli 代理配置
按照 2.1. 全局环境变量 配置了环境变量即可
dockerd 代理配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| # 建目录 sudo mkdir -p /etc/systemd/system/docker.service.d
# 建文件,比如命名为 proxy.conf vim /etc/systemd/system/docker.service.d/proxy.conf
# 文件内容 [Service] Environment="HTTP_PROXY=http://localhost:7890" Environment="HTTPS_PROXY=http://localhost:7890"
# 使文件生效 sudo systemctl daemon-reload sudo systemctl restart docker
# 检查是否生效 # 检查方式一 systemctl show --property=Environment docker # 示例输出如下 Environment=HTTP_PROXY=http://localhost:7890 HTTPS_PROXY=http://localhost:7890
# 检查方式二 docker info | grep -i proxy # 示例输出如下 HTTP Proxy: http://localhost:7890 HTTPS Proxy: http://localhost:7890
|
docker container 代理配置(待测试)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| # 编辑文件 ~/.docker/config.json
# 内容 { "proxies": { "default": { "httpProxy": "http://localhost:7890", "httpsProxy": "http://localhost:7890", "noProxy": "localhost,127.0.0.1,.example.com" } } }
|
附件
测试 docker pull mysql:8.0
命令成功拉取条件
