给服务器配置代理
今天在服务器上部署项目时依旧遇到了国内服务器无法访问境外镜像资源的情况,由于已经遇到很多次了,所以本篇文章就来详细记录一下如何给服务器配置代理,避免大家踩坑。当然我的方案只是一种折中的方案,后续有精力再去折腾其他方案。
基础环境
- 一台PC设备,操作系统任意,需要在本地PC上运行clash代理(我的端口是7897,根据个人情况会有所不同,请自己调整端口)。
- 一台服务器,有公网ip。
- 配置了服务器与本地PC的ssh连接与免密登录(最好是在
~/.ssh/config文件里写个Name,方便使用,后续就不用写username@<ip>的形式了,也无需输入密码)。
原理说明
- 在服务器上配置
http/https代理,将流量转发至服务器的7897端口。 - 通过ssh隧道连接,建立与本地PC的端口映射,将服务器7897的流量转发至本地PC的7897端口(由于本地PC无公网ip,服务器想要与其通信这里采用ssh隧道的方式)。
服务器操作
配置环境变量(注意端口换成你自己的)。
1 | # 配置http与https流量 走clash系统代理 后面端口为clash运行端口 |
直接在终端输入,退出终端作用域就无了,想要长期保存可以写在.zprofile/.bash_profile/.zshrc/.bashrc中,根据自己的shell选择(其实profile和rc文件写哪个都可以,之前看到过一篇帖子详细讲二者区别的,这里不细说了,平时习惯用哪个就写哪个吧,想要分清楚的可以去google一下)。
本地PC操作
- 运行clash(最好把局域网连接也打开)。
- 建立ssh隧道(注意是-R不是-L,不要转发反了)。
1 | ssh -R 127.0.0.1:7897:127.0.0.1:7897 <servername> -N |
注意端口和servername换成你自己的。
- 这里ssh隧道是挂在终端前台运行的,这里给出一个bash脚本,大家可以复制下来保存到
serverClash.sh文件中,方便后台运行,以及启动/关闭ssh隧道(注意端口和servername换成你自己的)。
1 | #!/bin/bash |
给脚本添加执行权限
1
2chmod +x serverClash.sh
# 可以使用 ./serverClash.sh help 查看使用方法,很easy
验证代理
在服务器上curl一下google
1 | curl -I https://www.google.com |
(ping不通是正常的,ping的ICMP是网络层协议,clash代理是工作在传输层TCP / UDP以上的,所以ping根本不会走代理端口,是直接由内核转发出去的)
给docker配代理
docker拉取镜像默认是不会走http / https代理的,docker命令输⼊到shell后,是由docker客户端将请求转发给docker服务器 docker daemon 去执⾏,它并不会读取环境变量中http_proxy的配置。所以我们要给docker daemon也配个代理。
- Docker daemon 的代理配置文件放在:
1 | /etc/systemd/system/docker.service.d/http-proxy.conf |
如果目录不存在,先创建:
1 | sudo mkdir -p /etc/systemd/system/docker.service.d |
写入配置:
1 | sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf > /dev/null << EOF |
注意换成你自己的端口
- 让 Docker 重新加载配置
1 | sudo systemctl daemon-reload |
测试是否成功走代理
运行:
1 | docker pull hello-world |
如果能拉下来,说明 docker daemon 已经成功走代理。
说些什么吧!