Linux 通过 Clash 来网上冲浪

vicat
vicat
发布于 2021-01-05 / 11431 阅读
0
8

Linux 通过 Clash 来网上冲浪

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来曲线救国。


dockerdocker-compose安装完毕后,可通过docker -vdocker-compose -v来检验安装结果。

2. 正戏

在拥有dockerdocker-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有如下几个好处:

  1. 能够保留配置信息,持久化为yaml,再也不用担心docker run命令忘了咋写的尴尬境地了!
  2. 能够同时启停,方便管理。
  3. 能够自动创建docker网络,免去后续需要使用科学上网的容器的--link操作。

dockercompose太好了.jpg

因为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端切换代理

  1. 访问Web端网址
    image.png

这里需要注意,需要配置api base url为你clash的web api地址,请填写你服务器的`http://ip或域名:端口号`,并且确保这个ip是公网可访问的,因为这个Web端管理工具是通过公网访问 web api 来配置代理的

  1. 切换你的代理,尽情冲浪吧!

4. 测试

服务终于搭好了,测试下到底有没有科学上到网呢?通过curl进行测试。

curl -x 127.0.0.1:7890 http://www.google.com

5. 容器内科学上网

有些同志们可能和我一样,对系统有些许的洁癖。如果能够使用容器为容器提供网络服务,并配置其余容器科学上网,岂不美哉?
岂不美哉.jpg
确实,那就直接开干

本章节涉及容器网络内容,可能会遇到如下问题 ------>
github_404.jpeggithub_500.jpggithub_maintain.jpg
但是我们都是受过专业训练的,放平心态即可,实在不行可以在评论区来摇人

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会自动为你维护一个容器网络!为了将懒批的行为贯彻到底,我们必然不会自己再去创建网络了。
416b8ac9512ff960bb904580e712d3fb.jpeg
这个网络的默认名字叫做[你的文件夹名]_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实现域名访问。写的确实不咋地,看不懂可以在评论区留个言

参考

  1. 怎么吃都不胖 . 在Docker中使用Clash . 2019-03-05/2020-12-29

评论