最近买了Clash
的机场订阅地址,试用发现Clash
梯子访问网络还是比较方便的,不过需要每台电脑或者设备上安装相应的软件,相对来讲比较麻烦,其实局域网内可以启用Allow LAN
模式,其他设备可以通过这个代理访问,正好本地局域网中有一台长期运行的NAS
,可以通过它作为长期代理。
注意:本文不涉及怎么购买订阅地址,请自行解决。
准备Clash配置文件
新增一个config.yaml
文件,需要上传到群晖的/docker/clash/config.yaml
,这个yaml
文件可以从本地电脑的Clash
中复制出来:
注意:这里只能用config.yaml不
能用config.yml
,可以适当修改部分信息,也可以不修改:
# Port of HTTP(S) proxy server on the local end(默认)
port: 7890
# Port of SOCKS5 proxy server on the local end(默认)
socks-port: 7891
# 开启局域网代理,这个要配置true
allow-lan: true
#UI监听端口,可以改成0.0.0.0:9090,改后可以通过ui界面访问
external-controller: 0.0.0.0:9090
配置文件准备好,上传到群晖之后,就可以开始了。
Docker安装Clash镜像
进入群晖Docker
套件,搜素clash
,可以看到dreamacro/clash
,双击下载下来。
对应开源地址:
GitHub地址:https://github.com/Dreamacro/clash
Docker地址:https://registry.hub.docker.com/r/dreamacro/clash/
参考配置文件:https://github.com/Dreamacro/clash/wiki/configuration
配置Clash容器
找到刚才下载的镜像,现在可以开始配置Clash
容器了,点击【启动】,再下一步:
配置端口,目前开放的端口最好映射出来,根据实际情况配置本地端口,容器端口是固定的,如果是mixed-port: 7890
,可以少暴露端口:
然后映射配置文件,本地配置文件/docker/clash/config.yaml
映射到容器的/root/.config/clash/config.yaml
配置完成可以启动了。
其实clash
代理已经可以使用了,不过为了方便查看,可以再用UI
工具查看一下。
使用UI界面
在线版UI
界面:http://yacd.haishan.me/ (目前似乎有兼容问题)
输入对应的地址即可,比如本地的:http://192.168.31.126:9090
也可以自己安装一个UI
容器,名字叫:haishanh/yacd,搜索后下载安装
下载后,进入启动配置,配置自动重新启动:
配置端口:
启动完毕。
访问:http://192.168.31.126:9080/ 添加clash服务的地址
进入之后可以看到clash的订阅信息了:
UI
安装配置完成。
代理使用
以iOS
手机为例,在【无线局域网】设置中,已连接的WIFI
右边的信息图标:
配置HTTP
代理:
然后就可以尝试访问https://google.com测试一下了。
自动更新
目前这种操作方式不能自动更新代理,可以考虑使用定时任务来更新,编写定时任务脚本,并存放到/docker/clash/reload-clash.sh
:
注意:如果订阅地址用浏览器打开不是yml
格式,不能使用这个方法,可以尝试在url
后面增加参数:?target=clash
或者clash=1
之类的看看是否能转换出yml
数据。
# 下载节点配置文件,根据实际的订阅地址填写
wget -O /volume1/docker/clash/config.yaml https://xxxxxx
# external-controller地址为0.0.0.0:9090,方便UI访问(可选)
sed -i 's/127.0.0.1:9090/0.0.0.0:9090/g' /volume1/docker/clash/config.yaml
# 增加安全性,配置使用代理的用户名和密码(可选)
sed -i 's/allow-lan: true/allow-lan: true\r\nauthentication:\r\n - "user1:password1"\r\n - "user2:password2"/g' /volume1/docker/clash/config.yaml
# 重启 clash 容器,名字为实际的容器名字
docker container restart dreamarco-clash1
配置群晖定时任务,进入【控制面板】->【任务计划】:
然后新增一个任务,【用户定义的脚本】任务,并配置名称等
配置运行频率:
配置运行脚本bash /volume1/docker/clash/reload-clash.sh
:
需要注意路径,完整路径是要包含/volume1
的
可以先运行一次测试看看。
至此算是完全配置完成了。
常见问题
运行脚本提示没有权限运行docker:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containers/dreamacro-clash1/restart": dial unix /var/run/docker.sock: connect: permission denied
可以尝试把脚本修改一下,把sudo
需要的密码放进去:
sudo -S
是表示sudo
从标准输入STDIN
读入密码而不是从终端读取。
echo "YourPWD" | sudo -S docker container restart dreamarco-clash1
新自动刷新
运行发现,重启Docker
方式刷新并不是很好,参考了API
文档,发现可以用另外的方式更新:
https://clash.gitbook.io/doc/restful-api/config
文件路径:/docker/clash/reload-clash.sh
实际配置到【任务计划】中需要全路径bash /volume1/docker/clash/reload-clash.sh
:
# 下载节点配置文件,根据实际的订阅地址填写
wget -O /volume1/docker/clash/config.yaml https://xxxxxx
# external-controller地址为0.0.0.0:9090,方便UI访问(可选)
sed -i 's/127.0.0.1:9090/0.0.0.0:9090/g' /volume1/docker/clash/config.yaml
# 增加安全性,配置使用代理的用户名和密码(可选)
sed -i 's/allow-lan: true/allow-lan: true\r\nauthentication:\r\n - "user1:password1"\r\n - "user2:password2"/g' /volume1/docker/clash/config.yaml
# 去掉重启Docker,调用API刷新:
curl --location --request PUT 'http://localhost:9090/configs' \
--header 'Content-Type: application/json' \
--data-raw '{"path": "/root/.config/clash/config.yaml"}'
注意:代理端口不要使用默认的7890,暴露外网可能会被扫描到,出现流量偷跑的情况,另外UI界面并不需要,可以测试完后停止UI相关容器
楼主大牛,我收藏这个帖子已经很久了,每次折腾完都先打开这个帖子把clash转上。但是一直有个困惑,就是,安装好以后都能正常使用,一点问题都没有,就是如果重启群晖以后,容器重新运行就出问题了,进去看日志都是乱代码,等进群晖config文件夹打开config.yaml一看,里面就成空白的了。已经无数次了,不知道为什么?
我安装时 ,是直接将win版的clash下的配置文件config.yml,上传到群晖docker文件夹,然后直接改的后缀成yaml,打开内容改一改,启动容器就正常运行了。就是一旦路由器或者docker重启,就不行了,怎么解决呢?
已经安装成功了,如何让另一个Jellyfin容器走这个代理
NO_PROXY 172.17.0.1,127.0.0.1,localhost ##保持默认
ALL_PROXY http://10.0.0.4:10081 ## 更换为自己的http代理
HTTP_PROXY http://10.0.0.4:10081 ##更换为自己的http代理
这一步/docker/clash/config.yaml映射到容器的/root/.config/clash/config.yaml
启动容器Dreamacro-dash-1失败:{“Message”:“无法创建填充任务:OClruntime创建失败:runc创建失败:无法启动容器进程:错误容器初始化:错误挂载”/volume1/docker/clash/config.yaml“to rootfsat”/root/.confg/clash“:mountNolumhe1/docker/clashfconfig.yaml:/root/.config/clash(通过/proc/self/fd/7},标志:0x5000:不是目录:未知:您是否正在尝试将目录挂载到文件中(反之亦然)?检查指定的主机路径是否为预期类型}。
目前已经解决这个问题,关键点在于
/volume1/docker/clash/config.yaml 必须映射/root/.confg/clash/config.yaml
才可以正常启动容器,我觉得应该和docker版本或者群辉版本有关系
我的设置完了之后,我查了一下,一直几百兆几百兆的在使用流量,一天时间就给我用成负的了
最好的方式是用旁路由,参考:https://fugary.com/?p=419
大神厉害
docker部署都正常的,在”访问:http://192.168.31.126:9080/ 添加clash服务的地址这一步的时候提示”Failed to connect“,是为啥啊? 地址没问题啊,是群晖IP+映射端口号
设置一下端口转发
kyjutis1哥们你那问题解决了吗 我也遇到了这个问题
知道啦 是这一步出问题了external-controller: ‘0.0.0.0:9090’
个可以具体说说咋实现端口转发吗
请问楼主筛选节点有没有办法也实现呢
大佬,新版的DS7.2多了个web-station选项,跟你的教程有点不一样按你的教程到了UI界面那一步就报错。搞不下去了。请问怎么解决?
是报错”Failed to connect“吗?我也是
请问大佬怎么把bridg的内部IP映射出来呢?
群晖920+ 的7.2版本, 多了个什么web-station(好像用于bridg类型容器网络,对外映射成 192.xxx 的IP跟端口的工具),单独创建clash
使用bridg,yacd一直链接不到,设置成host网络模式也会这样…搞一下午了
如果你使用wget命令无法成功,有可能是你的机场和国内的网络连通,可以用
如果你用wget命令不成功,反馈Will not apply HSTS. The HSTS database must be a regular and non-world-writable file可以尝试这样的指令
if curl -o /volume1/docker/clash/config123.yaml -x http://10.0.0.4:7890 (你本身clash的代理地址)https://xxxxxxxxxxxxxxxx(下载地址); then
sleep 5
rm -f /volume1/docker/clash/config.yaml
mv /volume1/docker/clash/config123.yaml /volume1/docker/clash/config.yaml
docker restart -t=10 clash
fi
中间插入需要修改的config指令就行了
请问有搭建其他代理的方式吗?socks5我暴露公网,主要是TG方便用,但不知道为何链接总是很慢。
为什么要设置那个代理地址 才可以出国啊
很早之前就看大佬你的攻略,就自动更新没成功,今天再来看评论区,终于成功啦
正常启动后镜像是不是应该获取到和群晖一样的开头的IP地址,为什么我的启动后详情中看到的IP地址是172开头的,原来我建立的macvlan,我把bridge改成macvlan后,获取的IP地址是和群晖一样的,可是却不能用9090端口进行访问,这是什么情况呢
求教下大佬,想在外网使用clash的服务,需要怎么弄大佬有研究吗?我现在用反向代理映射了端口,但是用不了socks5服务。
建议不要暴露到外网,其他时候可以使用自己的订阅地址
主要是想给TG开下代理。不然一直开着小火箭手机掉电蛮快的。
我是一元机场的clash,在订阅地址后添加”&flag=clash”就能下载配置文件,可名称是“一元机场”,也就是中文名字,而且没有后缀。请问我在拉取的同时,如何重命名?
没太理解,wget命令的时候不是改名了吗
可是手动运行这个sh的时候,并无起作用,无提示错误,config.yaml文件也无更新。
另外,在订阅地址后添加”&flag=clash”后才能下载配置文件,我是在电脑上做的测试。
订阅地址是这个格式:https://sub1.smallstrawberry.com/api/v1/client/subscribe?token=1234abcd&flag=clash
在地址两头添加单引号。
‘https://sub1.smallstrawberry.com/api/v1/client/subscribe?token=1234abcd&flag=clash‘
这样子
牛牛牛,多谢指导,正好喷到这个问题
人都麻了,订阅地址两边加上”就好了
大佬你好,我目前的问题是节点输出文件后缀是yml,这个配置文件的9090端口的ip是127.0.0.1:9090,需要手动修改成0.0.0.0:9000。请问有什么办法能自动更新订阅吗
我这搭建好了,但是通过nas的web浏览器登录google打不开网页。这种搭建的clash,群晖自己不能翻墙是正常的吗?还是我的yaml文件不对?我是复制了配置文件内容,复制到记事本,然后更改拓展名为yaml,这可以吗?
群晖的dns需要修改成群晖的地址加clash端口号
是DNS吗?我DNS填写127.0.0.1:7890 提示错误啊 您所输入的ip地址不正确
下载节点配置文件,根据实际的订阅地址填写
wget -O /volume2/docker/clash/config.yaml https://XXXXXXXXXXXXX/clash/clash_trojan.yaml
external-controller地址为0.0.0.0:9090,方便UI访问(可选)
sed -i ‘s/127.0.0.1:9090/0.0.0.0:9090/g’ /volume2/docker/clash/config.yaml
allow-lan改为true
sed -i ‘s/allow-lan: false/allow-lan: true/g’ /volume2/docker/clash/config.yaml
添加自动选择
sed -i ‘/proxy-groups:/a
type: url-test
proxies:
url: ‘http://www.gstatic.com/generate_204‘
interval: 300’ /volume2/docker/clash/config.yaml
去掉重启Docker,调用API刷新(不生效):
curl –location –request PUT ‘http://localhost:8870/configs‘
–header ‘Content-Type: application/json’
–data-raw ‘{“path”: “/root/.config/clash/config.yaml”}’
curl执行后,上面的修改都没生效
“调用API刷新(不生效)”的原因是配置进行了文件映射导致的。容器启动后再修改host的congfig.yaml文件,docker是不知道的,所以并没有同步更新到容器里对应的config.yaml,clash进行配置update是调用容器目录下的config.yaml,造成刷新不生效。
刷新配置不想重启container, 解决方法有两种:
方法一:不用文件映射,改为目录映射,如/volume1/docker/clash/ -> /root/.config/clash/,这样不用改命令,即可刷新配置。挂载的时候不要用只读方式,因为容器需要往这个目录里写文件;
方法二:不进行文件或者目录挂载,在定时脚本里加一行 docker cp /volume1/docker/clash/config.yaml NAME:/root/.config/clash/config.yaml,把更新的congfig.yaml文件cp到容器了,再调用api刷新即可。NAME是容器的名字,host的路径根据自己的改,遇到权限问题参考博主的说明。这个方法有个问题,就是容器建立后默认的listening地址是本机,需要先cp一个有0.0.0.0:9090的地址配置进去,重启以后再跑定时任务自动刷新就没问题了。
上面两个方法都可以进行配置的刷新生效,但方法一开放了目录读写,存在给容器过度权限问题,优点是简单便捷。方法二安全性高,但容器建立时都需要进行重刷配置的过程。
采用方法一,可以正常使用镜像,但是配置文件调用API更新依然不生效。
已经修改成功,因为我希望修改端口信息,通过查询API文档,需要增加force查询词:
curl –location –request PUT ‘http://localhost:9090/configs?force=true‘ –header ‘Content-Type: application/json’ –data-raw ‘{“path”: “/root/.config/clash/config.yaml”}’
大大您好,我这边参照您的配置成功自动更新clash了,但不知道为什么在输出结果中提示:Will not apply HSTS. The HSTS database must be a regular and non-world-writable file.
ERROR: could not open HSTS store at ‘/var/services/homes/zhujiayu/.wget-hsts’. HSTS will be disabled.
而且他生成了一个wget-hsts的文件,我是个小白,请问这个是什么文件啊?会有什么影响嘛?谢谢
自动更新会会返回一串编码后的字符串:dm1lc3M6Ly9leUoySWpvaU1pSXNJbkJ6SW……Wm5RdVkyOX
BASE64解码后又是几十行编码后的字符串,无法直接使用,现在做法只能手动通过windows客户端更新后黏贴过去,有什么好的办法吗?
前面leaf讲了这个问题,订阅地址最后加上这个&flag=clash ,然后整个地址要加一对引号wget -O /volume1/docker/clash/config.yaml ‘https://xxxxx&flag=clash‘
我用新自动刷新会弹出这个提示,感觉用旧的重启docker对我来说好用点。
{“message”:”external-ui: /root/.config/clash/dashboard not exist”}
另外,如果down下来的config.yaml的allow-lan: false 那就要换成sed -i ‘s/allow-lan: false/allow-lan: true……这样
谢谢,非常详细。
最后我实在是不想折腾 Rules 自动更新了。想起来的时候直接登录 NAS 拖拽文件进行覆盖就完事了。
非常感谢!
博主,非常感谢,已根据您的教程,搭建好了自动更新的Clash
我有个问题,
您最后修改的更新脚本,更新之后并不能更新rules,即便是我sed插入了新的rules,不重启容器的话,就不能载入我写入config.yaml的规则
请问博主有好办法么·
我也有同样的问题,请问最后解决了吗?
我的sed都不成功,每次都是文件名改了,里面内容替换不了,感觉是网络问题,后来把下载,sed替换和最后调用API更新分成了三个计划任务,间隔1分钟启动,就能用了
大神我自动更新一点都不起作用,请问不用自动更新,怎么把节点导进去?
老大 为什么我进去ui界面会秒退啊
博主为什么我的自动更新订阅地址就不行了,config就自动变成0kb了。就是定时任务不行,那就没有了。
可能是你的机场订阅地址直接访问不到了,你试试群晖里也用http代理
非常棒的介绍,已成功部署在群晖DS220+上,感谢!
{“message”:”open /root/.config/clash/config.yaml: stale NFS file handle”} 极空间使用 curl 调用API刷新,报这个错误,是不是极空间NAS自己docker挂载文件的问题吧?
请问这个解决了吗
不知道为什么,我按照博主的操作方法但是不能正常代理。在UI上显示无连接无数据流量,但是节点却能正常读取。
启动Clash一直显示 FATA[0000] Parse config error: yaml: line 9: did not find expected ‘,’ or ‘}’ ,用的Shadowfly的订阅,是config.yaml文件里格式问题吗?文件里line 9是proxies:,然后后面就是 – { name: 这种格式了。
问题最后解决了,特地来感谢博主,一直wget不成功,后面找了别人帮我看过后,才发现是因为docker和主机不是一个网段,就造成容器不能访问主机,也就wget不了,后面重建容器,网络选择host,就可以了,再次表示感谢。
博主能远程教一下嘛,按照教程提示安装,用UI进提示连接不上
你好,我遇到过这种情况,我可以给你分享一下经验。这个UI访问是需要提前在配置文件中的” external-controller “这个命令中修改,内容是:你群晖局域网的IP+clash对应的Web UI端口号。
感谢大佬 终于成功了。我踩的坑提示一下,自动更新的脚本 这句wget -O /volume1/docker/clash/config.yaml ‘https://xxxxx&flag=clash‘ 订阅地址有特殊符号一定记得加引号。
大佬,我有公网IP,能否出个公网共享这个clash的教程,自己搞了一下,没有搞通,不知道卡在哪了。
我是公网,在外面也能访问家里的clash设置
大佬,有没有发现这个docker映像后台偷跑流量?挺猛的。我用了一段时间后发现我的clash节点流量被群晖这个跑了好几百G(没有设备通过这个链接)
不要用默认端口,另外要设置密码,应该不会有流量偷跑
我怀疑是这个docker映像本身自带后门,而不是外部的攻击。所以不知道使用相同映像的人是否也遇到类似情况。
流量确实大很多,准备放弃换个玩的
我去 我今天遇到了这个情况,真无语啊
大佬,安装正常,就是自动更新这里不行,一天不更新,就没办法使用了
主要要编写一个/docker/clash/reload-clash.sh文件,配置到任务计划中,文件主要功能是下载新的yaml文件,然后用curl调用接口把配置文件刷新一下就可以了
我现在问题就是在群辉上部署了Subconverter的前端和后端,前端生成的订阅连接在浏览器直接可以打开,但下载不了yaml文件,电脑clash for windows,填入订阅url,下载的是yml格式,文件名是以数字.yml 。把这个yml文件改名为config.ymal。放到群辉的clash文件下,clash运行是正常的,现在就是卡壳在自动更新上。还请指点,谢谢
文中最后有shell源文件,修改为自己的下载yaml地址,以及把用户名和密码改下,其他应该都不用改
本人实在是不菜,后端的pref.toml文件参数修改,应该可以输出yaml文件,搞半天真的是看不懂,还请帮忙看看Subconverter,谢谢
clash服务 无法启动一直报错 Parse config error: read /root/.config/clash/config.yaml: is a directory 文件夹路径 /docker/clash/config.yml 装载路径/root/.config/clash/config.yaml 请教下是哪里有问题 谢谢了
文件名要统一为config.yaml,外面的也要用相同的名字,不然映射到子目录下了
我是在clsah文件夹下面建立了一个config.yaml文件夹 ,然后把配置文件config.yaml放到里面。启动还是报一样的错误。装载路径需要按照这个名称手动建立吗/root/.config/clash/config.yaml
可以了 谢谢 指点
你怎么弄的,和你遇到一样的问题
ui页面一直连接不上,反反复复看了好几遍写的教程,确实没错误,不知道哪里出现了问题哦
UI不影响使用,可以不装,UI填写地址是从本地浏览器发起请求,在线版也可以访问本地的clash地址
但是如何选择节点,这个通过命令不会操作,我看clash是提示RESTful API listening,而ui是以get的形式发送的,我看网络提示返回405 和CORS error,不知道是不是和restful请求有关系
都搞好了,感谢博主的教程|´・ω・)ノ
请问,请问这里的本地地址就是 Nas 的地址吗?
可以出一个portainer安装clash的教程吗,小白一个自己摸索的了快一个月都没弄出来,搜遍这个网络都没有教程
curl –location –request PUT ‘http://localhost:9090/configs‘ –header ‘Content-Type: application/json’ –data-raw ‘{“path”:”/home/silent/clash/config.yaml”}’
{“message”:”stat /home/silent/clash/config.yaml: no such file or directory”}
路径没错 文件名也没错 就是报错找不到文件 权限给了也没用
应该要用容器里的路径/root/.config/clash/config.yaml
谢谢 以为是外面的路径 结果是容器里面的路径
谢谢,解决了同样的问题
这个不能实现透明代理吧
代理端口不要使用默认的7890,暴露外网可能会被扫描到–这个是不是要公网ip后才考虑
是的,一般用nas的都有公网IP吧,没有公网IP的nas还是很不方便的
了解了,我刚好还没要到公网ip就先不管了。。
另外请教一下,最后调用api更新没太看懂,代码放在哪里运行,订阅链接也不用了吗,有空麻烦讲解一下
这个是启动的服务监听多个端口,7890默认是代理端口,9090是管理端口,有暴露restful API,可以用http请求访问修改配置,要有一定的开发基础,可以看看文档:https://clash.gitbook.io/doc/restful-api/config
调用API刷新的方法不生效,查看日志后发现–header: command not found,–data-raw: command not found这两个命令没有,请问这个要怎么解决
是不是上一行末尾的反斜杠漏了?curl那条命令实际是在一行的,用反斜杠支持命令太长换行书写
直接复制的你贴出来的的命令,一开始我也以为这个问题,但是验证过了不是,没有头绪了
可能不同系统对回车支持有点不一样,把反斜杠删掉,curl命令那条全部写在一行中试试看
真的是这个问题,我是群晖7.0.1,还真没想到,谢谢
这个方式是不是比软路由更好
这个相对来讲比较简单一点,而且软路由后面要科学上网一般也要再安装clash之类的。
请教个问题,这个方法在IOS可以,但是Apple TV上无法配置网络的代理,这种情况下,只能NAS装虚拟机然后装Openwrt虚拟LAN地址么?
是的,Apple TV是不能使用这种代理方式,可以参考:https://fugary.com/?p=419 用旁路由实现