项目介绍
"cat"
不过多介绍就是你想的那个代理软件 温馨提示文章中所有名字已被修改为"cat"
,自行修改为原样
侵权联系删除,软件来自于魔戒,感谢魔戒官方提供的软件包
此项目是通过使用开源项目(https://github.com/Dreamacro/"cat"
)作为核心程序,再结合脚本实现简单的代理功能。
主要是为了解决我们在服务器上下载GitHub等一些国外资源速度慢的问题。
使用须知
- 运行本项目建议使用root用户,或者使用 sudo 提权。
- 使用过程中如遇到问题,请优先查已有的 issues。
- 在进行issues提交前,请替换提交内容中是敏感信息(例如:订阅地址)。
- 本项目是基于 “cat” 、yacd 进行的配置整合,关于"cat"、yacd的详细配置请去原项目查看。
- 此项目不提供任何订阅信息,请自行准备"cat"订阅地址。
- 运行前请手动更改
.env
文件中的"cat"_URL
变量值,否则无法正常运行。 - 当前在RHEL系列和Debian系列Linux系统中测试过,其他系列可能需要适当修改脚本。
- 支持 x86_64/aarch64 平台
注意:当你在使用此项目时,遇到任何无法独自解决的问题请优先前往 Issues 寻找解决方法。由于空闲时间有限,后续将不再对Issues中 “已经解答”、“已有解决方案” 的问题进行重复性的回答。
使用教程
下载项目
$ git clone https://github.com/wanhebin/"cat"-for-linux.git
进入到项目目录,编辑.env
文件,修改变量"cat"_URL
的值。
$ cd "cat"-for-linux
$ vim .env
注意:
.env
文件中的变量"cat"_SECRET
为自定义 “cat” Secret,值为空时,脚本将自动生成随机字符串。
启动程序
直接运行脚本文件start.sh
- 进入项目目录
$ cd "cat"-for-linux
- 运行启动脚本
$ sudo bash start.sh
正在检测订阅地址...
"cat"订阅地址可访问! [ OK ]
正在下载"cat"配置文件...
配置文件config.yaml下载成功! [ OK ]
正在启动"cat"服务...
服务启动成功! [ OK ]
"cat" Dashboard 访问地址:http://<ip>:9090/ui
Secret:xxxxxxxxxxxxx
请执行以下命令加载环境变量: source /etc/profile.d/"cat".sh
请执行以下命令开启系统代理: proxy_on
若要临时关闭系统代理,请执行: proxy_off
$ source /etc/profile.d/"cat".sh
$ proxy_on
- 检查服务端口
$ netstat -tln | grep -E '9090|789.'
tcp 0 0 127.0.0.1:9090 0.0.0.0:* LISTEN
tcp6 0 0 :::7890 :::* LISTEN
tcp6 0 0 :::7891 :::* LISTEN
tcp6 0 0 :::7892 :::* LISTEN
- 检查环境变量
$ env | grep -E 'http_proxy|https_proxy'
http_proxy=http://127.0.0.1:7890
https_proxy=http://127.0.0.1:7890
以上步鄹如果正常,说明服务"cat"程序启动成功,现在就可以体验高速下载github资源了。
重启程序
如果需要对"cat"配置进行修改,请修改 conf/config.yaml
文件。然后运行 restart.sh
脚本进行重启。
注意:
重启脚本restart.sh
不会更新订阅信息。
停止程序
- 进入项目目录
$ cd "cat"-for-linux
- 关闭服务
$ sudo bash shutdown.sh
服务关闭成功,请执行以下命令关闭系统代理:proxy_off
$ proxy_off
然后检查程序端口、进程以及环境变量http_proxy|https_proxy
,若都没则说明服务正常关闭。
“cat” Dashboard
- 访问 “cat” Dashboard
通过浏览器访问 start.sh
执行成功后输出的地址,例如:http://192.168.0.1:9090/ui
- 登录管理界面
在API Base URL
一栏中输入:http://<ip>:9090 ,在Secret(optional)
一栏中输入启动成功后输出的Secret。
点击Add并选择刚刚输入的管理界面地址,之后便可在浏览器上进行一些配置。
- 更多教程
此 “cat” Dashboard 使用的是yacd项目,详细使用方法请移步到yacd上查询。
常见问题
-
部分Linux系统默认的 shell
/bin/sh
被更改为dash
,运行脚本会出现报错(报错内容一般会有-en [ OK ]
)。建议使用bash xxx.sh
运行脚本。 -
部分用户在UI界面找不到代理节点,基本上是因为厂商提供的"cat"配置文件是经过base64编码的,且配置文件格式不符合"cat"配置标准。
目前此项目已集成自动识别和转换"cat"配置文件的功能。如果依然无法使用,则需要通过自建或者第三方平台(不推荐,有泄露风险)对订阅地址转换。
-
程序日志中出现
error: unsupported rule type RULE-SET
报错,解决方法查看官方WIKI
无法登录Web界面
确保 RESTful API 正确
[root@localhost "cat"-for-linux-master]# vim conf/config.yaml
# HTTP 代理端口
port: 7890
# SOCKS5 代理端口
socks-port: 7891
# Linux 和 macOS 的 redir 代理端口
redir-port: 7892
# 允许局域网的连接
allow-lan: true
# 规则模式:Rule(规则) / Global(全局代理)/ Direct(全局直连)
mode: rule
# 设置日志输出级别 (默认级别:silent,即不输出任何内容,以避免因日志内容过大而导致程序内存溢出)。
# 5 个级别:silent / info / warning / error / debug。级别越高日志输出量越大,越倾向于调试,若需要请自行开启。
log-level: silent
# "cat" 的 RESTful API
external-controller: '0.0.0.0:9090'
# RESTful API 的口令
secret: 'Abc@1234'
配置Docker代理
Dockerd 代理
在执行docker pull时,是由守护进程dockerd来执行。因此,代理需要配在dockerd的环境中。而这个环境,则是受systemd所管控,因此实际是systemd的配置。
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/proxy.conf
在这个proxy.conf文件(可以是任意*.conf的形式)中,添加以下内容:
cat > /etc/systemd/system/docker.service.d/proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,.example.com"
EOF
要换成可用的免密代理。通常使用 cntlm 在本机自建免密代理,去对接公司的代理。可参考《Linux下安装配置Cntlm 代理》
Container 代理
在容器运行阶段,如果需要代理上网,则需要配置 ~/.docker/config.json。以下配置,只在Docker 17.07及以上版本生效。
mkdir ~/.docker/
cat > ~/.docker/config.json << EOF
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "localhost,127.0.0.1,.example.com"
}
}
}
EOF
这个是用户级的配置,除了 proxies,docker login 等相关信息也会在其中。而且还可以配置信息展示的格式、插件参数等。
此外,容器的网络代理,也可以直接在其运行时通过 -e 注入 http_proxy 等环境变量。这两种方法分别适合不同场景。config.json 非常方便,默认在所有配置修改后启动的容器生效,适合个人开发环境。在CI/CD的自动构建环境、或者实际上线运行的环境中,这种方法就不太合适,用 -e 注入这种显式配置会更好,减轻对构建、部署环境的依赖。当然,在这些环境中,最好用良好的设计避免配置代理上网。
Docker Build 代理
虽然 docker build 的本质,也是启动一个容器,但是环境会略有不同,用户级配置无效。在构建时,需要注入 http_proxy 等参数。
docker build . \
--build-arg "HTTP_PROXY=http://127.0.0.1:7890/" \
--build-arg "HTTPS_PROXY=http://127.0.0.1:7890/" \
--build-arg "NO_PROXY=localhost,127.0.0.1,.example.com" \
-t your/image:tag
注意:无论是 docker run 还是 docker build,默认是网络隔绝的。如果代理使用的是 localhost:3128 这类,则会无效。这类仅限本地的代理,必须加上 --network host 才能正常使用。而一般则需要配置代理的外部IP,而且代理本身要开启 Gateway 模式。
命令行代理
docker run -it --env HTTP_PROXY="http://127.0.0.1:7890" --env HTTPS_PROXY="http://127.0.0.1:7890" ubuntu bash
查看Docker配置信息
[root@localhost "cat"-for-linux-master]# docker info | grep -i proxy
...
HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890
No Proxy: localhost,127.0.0.1,.example.com
...
重启服务
sudo systemctl daemon-reload
sudo systemctl restart docker
NO_Proxy优化
在配置 NO_PROXY
时,你需要确保它覆盖到所有你不希望通过代理的域名和 IP 地址。通常情况下,NO_PROXY
可以包括以下几类:
- 本地主机:
localhost
,127.0.0.1
,::1
(IPv6 本地地址) - 内部网络:常见的内部网络 IP 段如
10.0.0.0/8
,172.16.0.0/12
,192.168.0.0/16
等。 - 特定域名:如果你的内部服务使用特定域名或者子域名,可以将它们添加进去。
以下是一个优化的 NO_PROXY
配置示例:
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export NO_PROXY=localhost,127.0.0.1,::1,.example.com,.localdomain,.aliyun.com,mirrors.aliyun.com,mirrors.aliyuncs.com,mirrors.cloud.aliyuncs.com
解释:
localhost,127.0.0.1,::1
:本地环回地址。10.0.0.0/8,172.16.0.0/12,192.168.0.0/16
:常见的私有 IP 地址范围,用于确保内网流量不会通过代理。.example.com
:对于example.com
的所有子域名都不使用代理。.localdomain
:假设你有一个内网的局域网域名,可以像这样添加。.aliyun.com
覆盖所有阿里云的子域名。mirrors.aliyun.com
、mirrors.aliyuncs.com
和mirrors.cloud.aliyuncs.com
是你的 YUM 源配置文件中提到的阿里云镜像站的域名。
配置Containerd代理
创建文件
- 创建
containerd.service.d
目录:
mkdir -p /etc/systemd/system/containerd.service.d/
- 创建或编辑
/etc/systemd/system/containerd.service.d/http-proxy.conf
文件:
使用cat
命令创建或编辑http-proxy.conf
文件:
cat > /etc/systemd/system/containerd.service.d/http-proxy.conf << EOF
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16,.svc,.cluster.local,<nodeCIDR>,<APIServerInternalURL>,<serviceNetworkCIDRs>,<etcdDiscoveryDomain>,<clusterNetworkCIDRs>,<platformSpecific>,<REST_OF_CUSTOM_EXCEPTIONS>,.example.com,.localdomain,.aliyun.com,mirrors.aliyun.com,mirrors.aliyuncs.com,mirrors.cloud.aliyuncs.com"
EOF
重启 containerd 服务
- 重新加载 systemd 配置:
systemctl daemon-reload
- 重启
containerd
:
systemctl restart containerd
NO_PROXY 的推荐配置
在 NO_PROXY
中配置以下地址和网段可以确保这些流量不会经过代理:
-
本地地址和网段:
localhost
127.0.0.1
::1
127.0.0.0/8
-
Kubernetes 的默认域名后缀:
.svc
.cluster.local
-
Kubernetes Node 网段:
<nodeCIDR>
- 这个网段代表所有 Kubernetes 节点的 IP 地址范围。
-
APIServer 的内部 URL:
<APIServerInternalURL>
- 这通常是集群内部用于访问 Kubernetes API Server 的地址。
-
Service Network 网段:
<serviceNetworkCIDRs>
- Kubernetes Service 的网络范围。
-
etcd 的 Discovery Domain:
<etcdDiscoveryDomain>
- 如果有使用 etcd 的发现服务,需要添加对应的域名。
-
Cluster Network 网段:
<clusterNetworkCIDRs>
- 这个代表集群中使用的网络范围。
-
其他内网网段:
10.0.0.0/8
172.16.0.0/12
192.168.0.0/16
-
其他特定平台相关网段:
<platformSpecific>
- 例如 DevOps 工具的网段,Git 仓库等。
-
其他自定义 NO_PROXY 网段:
<REST_OF_CUSTOM_EXCEPTIONS>
- 任何需要特殊处理的例外网段。