0. 概述
当今社会,在网上冲浪时,如果没有一把趁手的兵器,那确实是少了几分乐趣,总会遇到各种的围追堵截,404一类的错误。在Windows上,趁手的兵器很好找,但是在开源的Linux上,那就是一种折磨。
所以本次我们要在Linux服务器上,通过Clash来开启一段网上冲浪的旅程。
本教程适用于:Linux大多数发行版(可安装docker) 树莓派(所有armv7架构cpu)群晖(增强版本)等
1. 前戏
首先,需要安装所需的软件,在21世纪20年代的今天,使用Docker来安装和部署一个软件无疑是最方便,最纯净的一种体验。本教程首先需要安装docker和docker-compose。如果没有听说过docker,只要类比下,docker是一个极其轻量的虚拟机就好了(其实底层完全不同)
docker
关于docker的安装此处不再赘述,需要的可前往docker安装文档来安装docker。
docker-compose(嫌弃前戏太长的可以直接快进到正戏-结局1)
docker-compose是一个管理一群docker的东西,需要安装可以前往docker-compose安装文档选择对应版本安装docker-compose
。网站全英文,只要复制粘贴命令即可。
注意:docker-compose仅有amd编译版本,如要使用树莓派/安卓机等arm架构设备,需要通过pip来曲线救国。
在docker
和docker-compose
安装完毕后,可通过docker -v
和docker-compose -v
来检验安装结果。
2. 正戏
在拥有docker
和docker-compose
后,整个流程就已经结束了大半。余下的就是对容器的操作了。直接命令行走起。
Clash
Clash需要一个名为 config.yaml
的配置文件来配置需要访问的目标,如果不通过docker
运行的话,默认是在~/.config/clash/config.yaml
这里的。如果你在使用PC版本的Clash的话,可以复制这个配置文件到服务器中。
注意:如果您的配置文件中有使用了
RULE-SET
的字样,需要使用Premium版本,并将镜像替换为dreamacro/clash-premium,或者是删除这些内容。
如果没有,具体的配置在项目wiki中有详细介绍。
关键配置
port: [http代理的端口]
socks-port: [sock5代理端口]
redir-port: [需要重定向的端口]
# 允许局域网访问,即可通过本机回环地址外的地址访问
allow-lan: true
# 外部RESTful API端口,这个在之后的流程中会使用到
external-controller: 0.0.0.0:9090
其余代理配置请参考官方配置文件
Clash_webUI
yacd是一个通过REST api来管理Clash的工具,它需要配置的,仅有Clash REST api的url和端口,并且页面需要可以访问到这个url。
注意:这个WebUI可以管理任何暴露在外网的REST接口,所以这就意味着,它访问的链接是本机所能访问到的链接。也就是说:需要访问WebUI的主机能够访问到Clash的REST API。
准备镜像
# 1. 获取clash的镜像
docker pull dreamacro/clash
# 2. 获取WebUI的镜像
docker pull haishanh/yacd
结局1
其实到此为止,直接运行即可,此处也直接提供docker run
命令以供不想安装docker-compose
的人直接运行。但是这个方式没有Compose那么舒服
# 1. 运行clash
docker run -d --name=clash --restart=always --network='host' -v [配置文件路径]:/root/.config/clash dreamacro/clash
# 2. 运行WebUI
docker run -d -p [想要开放的端口]:80 --name=clash_webui --restart=always haishanh/yacd
但是!
这不好。虽然看起来,两者都运行起来了,但是!它俩很独立。它俩没有以和为贵,没有在一起。所以,我们配置docker-compose
来让它俩一起运行,一起停止。
2+. 正戏进阶
配置使用 docker-compose
启动
使用docker-compose
有如下几个好处:
- 能够保留配置信息,持久化为
yaml
,再也不用担心docker run
命令忘了咋写的尴尬境地了! - 能够同时启停,方便管理。
- 能够自动创建docker网络,免去后续需要使用科学上网的容器的
--link
操作。
因为docker-compose
需要一个yaml
文件来启动和停止服务,所以按照如下内容编写
# docker-compose版本
version: '3.7'
# 服务列表
services:
# clash后台服务
clash:
# 设置image
image: dreamacro/clash
# 停止了总是重启
restart: always
volumes:
# 将配置文件挂载到容器中
- /root/.config/clash:/root/.config/clash
container_name: clash
ports:
# 这些端口都在配置文件中配置过,容器外地址可随心情配置
- [容器外http代理端口]:[容器内http代理端口,默认7890]
- [容器外sock5代理端口]:[容器内sock5代理端口,默认7890]
- [容器外REST API端口]:[容器内REST API端口,默认9090]
clash_web:
image: haishanh/yacd
restart: always
depends_on:
# 依赖于上面的clash服务,在clash启动后,web才启动
- clash
ports:
- [容器外web访问端口]:80
container_name: clash_web
启动
编写完成后仅需要在目录下执行docker-compose up -d
即可看到运行结果
docker-compose up -d
# 输出内容
# Starting clash ... done
# Starting clash_web ... done
停止
docker-compose stop
# 输出内容
# Stopping clash_web ... done
# Stopping clash ... done
至此,我们的clash已经部署在容器中,只要访问web端即可查看到clash的运行状态了
如果无法访问,请查看网络是否连通,防火墙是否放行,云服务器的策略是否正确
3. 使用
3.1 配置系统代理
Linux通过修改环境变量来使用代理,主要是在环境变量中添加如几条,在命令行中执行如下语句:
# 配置http和https代理
http_proxy=http://clash客户端IP:clash客户端端口
https_proxy=http_proxy
# ftp代理看需求配置
# ftp_proxy= http_proxy
# 对以下内容不使用代理
no_proxy=192.168..,172.16..,.local,localhost,127.0.0.1
# 导出环境变量
export http_proxy https_proxy no_proxy
# export ftp_proxy
# 使得环境变量生效
source /etc/profile
3.2 通过Web端切换代理
- 访问Web端网址
这里需要注意,需要配置
api base url
为你clash的web api
地址,请填写你服务器的`http://ip或域名:端口号`,并且确保这个ip是公网可访问的,因为这个Web端管理工具是通过公网访问 web api 来配置代理的
- 切换你的代理,尽情冲浪吧!
4. 测试
服务终于搭好了,测试下到底有没有科学上到网呢?通过curl
进行测试。
curl -x 127.0.0.1:7890 http://www.google.com
5. 容器内科学上网
有些同志们可能和我一样,对系统有些许的洁癖。如果能够使用容器为容器提供网络服务,并配置其余容器科学上网,岂不美哉?
确实,那就直接开干!
本章节涉及容器网络内容,可能会遇到如下问题 ------>
但是我们都是受过专业训练的,放平心态即可,实在不行可以在评论区来摇人
5.1 通过link
来配置容器网络
此方法官方不推荐,并在未来版本会被废弃,但是极其简单。如果你和博主一样是性情中人,同时是个懒批,而且想让官方去她🐴的,那这个方法必然是你的不二之选。
首先,你如果是通过命令行配置的容器,那么,只要将你先前的命令行,替换成如下形式即可
# 启动clash的指令
# --network='host' 不可用,因为我们要保持网络环境的干净整洁
docker run -d -p [你想暴露的http代理端口]:7890 -p[你想暴露的sock5代理端口]:7891 -p[你想暴露的rest接口端口]:9090 --name=clash --restart=always -v [配置文件路径]:/root/.config/clash dreamacro/clash
# 启动其他容器的指令
docker run --link clash [你的其他指令]
之后就可以按照其他容器中应用代理配置方法来配置代理了,需要注意的是,之前形如http://127.0.0.1:7890
的东西就需要被替换为http://clash:7890
了。
很简单,很直接,很单纯,很暴力,但就是有用😁
5.2 通过network
配置容器网络
这个方法是官方推荐的容器间网络互通的方法,但是麻烦,懒批是最不应该选这种的,但是也姑且说下,执行如下指令即可
# 1. 创建一个网络
docker network create [你要起的网络名,这里叫做张三吧]
# 2. 将你之前的clash容器加入这个网络,请更换启动指令
docker run -d --network 张三 -p [你想暴露的http代理端口]:7890 -p[你想暴露的sock5代理端口]:7891 -p[你想暴露的rest接口端口]:9090 --name=clash --restart=always -v [配置文件路径]:/root/.config/clash dreamacro/clash
# 3. 其他的需要使用科学上网的容器也要使用这个network设置
docker run --network 张三 [你的其他指令]
这样就可以科学上网了,确实麻烦,确实憨批。
5.3 通过docker-compose.yaml
配置容器网络(福报!)
如果你之前没有做一个懒批,那么这位朋友,你有福气了!因为docker-compose
会自动为你维护一个容器网络!为了将懒批的行为贯彻到底,我们必然不会自己再去创建网络了。
这个网络的默认名字叫做[你的文件夹名]_default
。如果你的docker-compose.yaml
所在文件夹为张三
,那就意味着,你的网络就叫做张三_default
。之后启动的容器仅仅需要加入这个网络就行了。
需要上网容器配置
- 通过命令行
docker run --network 张三_default [其他指令]
- 通过
docker-compose
# 下面略写,照常配置
version: '3.7'
services:
xxxx:
xxx: xxx
# 关键点: network
networks:
default:
# 声明该网络为外部已存在网络
external:
name: 张三_default
这样就好啦
6. 配置Nginx代理
请参考我的上一篇博客nginx80端口转发来配置nginx实现域名访问。写的确实不咋地,看不懂可以在评论区留个言