一 设计思路及步骤
1. 获取clash订阅链接
(不要问我怎么获取)
2. 将clash订阅链接转换成Clash的Proxy Provider
参考 https://github.com/qier222/proxy-provider-converter
因vercel被墙,建议使用我部署的:Proxy Provider Converter
也可自行部署,参考:https://github.com/linshenkx/baseDockerImage/tree/master/proxy-provider-converter
3. 配置Proxy Provider
在clash配置文件中配置Proxy Provider,实现代理服务器列表的自动更新
clash配置文件,可以从订阅链接下载得到,再修改即可。或者我后面贴出来自用的。
4. 启动clash
启动dreamacro/clash或dreamacro/clash-premium容器,加载配置文件,进行clash服务
5. 启动clash-web
启动haishanh/yacd容器,对clash进行web管理
可以直接用作者部署的:yacd(hsiqi.top)
二 clash配置文件
主要修改地方是在proxy-providers和proxy-groups。
rules是根据proxy-groups配置的,数量比较多,具体参考从订阅地址得到的clash配置文件。或者自己从网上获取,这些是比较通用的。
可以看到proxy-groups中的配置都引用了use: ['LIAN']
来导入节点配置。
且使用了 url-test 来自动选出最快的代理。
默认clash配置文件:
修改之后的clash配置文件:使用效果,以电报消息为例,默认使用代理是节点选择,
而节点选择使用的代理是自动选择,所以电报消息默认使用的代理是节点池最快的节点。
使用效果
一般只需要修改proxy-providers的LIAN的url和path,
如果更换机场,也只需要重新生成clash订阅链接,然后修改这两个位置即可
参考配置:https://raw.githubusercontents.com/linshenkx/myFiles/master/blogFiles/clash/config.yaml
规则总是会更新的,如果使用的是clash-premium(专业版)的话,可以考虑用rule-providers,见文末。
三 启动clash
docker启动
需自行提供config.yaml 文件,这里推荐直接使用host网络,可以直接使用127.0.0.1 7890作为代理
注意这里使用的是dreamacro/clash-premium,也可用dreamacro/clash,放弃高级功能
docker run --name clash --network host --restart=always -v /opt/clash/config.yaml:/root/.config/clash/config.yaml -d dreamacro/clash-premium
如果没有安装docker的话,可以使用常规方法启动
常规安装
如果没有安装docker的话,可以使用常规方法启动
配置
gzip -d clash-linux-amd64-v1.5.0.gz mkdir /opt/clash mv clash-linux-amd64-v1.5.0 /opt/clash/clash echo "/opt/clash/clash >/opt/clash/start.out 2>&1 &" >> /opt/clash/start.sh chmod -R +x /opt/clash/ SHELL
把配置文件放到/root/.config/clash 下取代默认的config.yaml
启动
查看clash启动日志
tail -n 100 -f /opt/clash/start.out
四 安装clash-web
连接的时候填写 http://clash机器ip:clash-controller端口,以及secret密码。
密码和端口都在上面clash配置。
docker run --restart=always -p 7880:80 -d --name clash-web haishanh/yacd
SHELL
五 使用代理服务
1 linux系统设置代理
在 /etc/profile 添加all_proxy配置
no_proxy则配置不走代理,注意这和clash的直连还不一样。
如 *.linshenkx.cn对应ip为tailscale内网ip,外部无法访问
这时如果使用clash的直连则会提醒连接失败,而配置在no_proxy则会让其走tailscale的代理成功访问。
echo 'export all_proxy="http://127.0.0.1:7890"'>> /etc/profile
echo 'export http_proxy="http://127.0.0.1:7890"'>> /etc/profile
echo 'export https_proxy="http://127.0.0.1:7890"'>> /etc/profile
echo 'export no_proxy="127.0.0.1,*.linshenkx.cn"'>> /etc/profile
SHELL
2 docker容器设置代理
参考:
https://docs.docker.com/network/proxy/
可以设置环境变量,如ENV HTTP_PROXY="http://192.168.1.12:3128"
但无法使用127.0.0.1,除非同时配置--network host
。
且实测,环境变量方法难生效。
建议使用修改 ~/.docker/config.json 的方法。
配置以下内容:
{
"proxies":
{
"default":
{
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "127.0.0.1,*.linshenkx.cn,127.0.0.0/8"
}
}
}
容器内会自动添加HTTP_PROXY、HTTPS_PROXY、NO_PROXY、http_proxy、https_proxy、no_proxy等变量
3 docker命令设置代理
注意不是给docker容器设置代理
参考:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy
主要用于docker pull。
也可通过配置镜像加速来达到类似效果,
不过注意镜像加速覆盖不全面,
而且有坑,例如阿里的镜像加速有时候就拉不到最新的镜像(如:halohub/halo:latest)
4 java程序设置代理
测试时,在通过代码方式添加:
System.setProperty("proxyHost", "127.0.0.1");
System.setProperty("proxyPort", "7890");
-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=7890
-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=7890
-Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=7890
SHELL
如下,为使用系统代理方式启动halo,这样就可以在halo的管理界面使用在线下载、更新主题功能了,否则github连接过慢主题基本无法在线下载
docker run -it -d --name halo --network host -e JVM_OPTS="-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=7890 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=7890" -v /opt/halo/workspace:/root/.halo --restart=always halohub/halo
SHELL
5. 测试代理是否生效
可在命令行使用wget测试连接,如下
可以看到走了my.win:7890的代理
代理
直连
6. no_proxy相关说明
no_proxy很重要,因为不是所有的流量都需要经过clash的,如localhost。
就算localhost在clash是直连,也和不走clash是不一样的。
特别是用上了tailscale,tailscale的流量如果走了clash(直连)就会出现dns解析错误。
所以最好把tailscale的域名配置在no_proxy里面。
但是需要注意,no_proxy本身是不规范的,不同的程序/系统对其处理也是不一样的。
参考:https://about.gitlab.com/blog/2021/01/27/we-need-to-talk-no-proxy/
此外不同系统也会有影响,例如grafana的Alpine镜像就没有处理no_proxy,换成Ubuntu镜像则可以。
所以,在选镜像的时候建议不要一味地选小体积的镜像版本。
六 使用 rule-providers
这是premium版本特有的功能
相关说明见:https://github.com/Dreamacro/clash/wiki/premium-core-features#rule-providers
这里使用的是 https://github.com/Loyalsoldier/clash-rules 提供的规则。
完整配置如下:
注意,这里把raw.githubusercontent.com都换成了raw.githubusercontents.com
见https://www.7ed.net/#/raw-cdn,否则第一次启动时无法获取规则文件,会导致启动失败
不过这样会产生强依赖,即rules文件必须可访问,否则无法启动
而rules文件一般又无法直接在墙内访问,又得依赖第三方的加速服务,风险其实很高
所以并不是很建议
autoautoarduinobashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinlessluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptvbnetwasmxmlyamlhtml
#port: 7890
#socks-port: 7891
#redir-port: 7892
# 使用混合端口
mixed-port: 7890
# 部署在公网,关闭lan
allow-lan: false
bind-address: "*"
mode: Rule
log-level: info
ipv6: false
hosts:
services.googleapis.cn: 216.58.200.67
www.google.cn: 216.58.200.67
# 外部管理IP和端口
external-controller: 0.0.0.0:29090
# 外部管理密码
secret: '123456'
clash-for-android:
append-system-dns: false
profile:
tracing: true
dns:
enable: true
listen: 127.0.0.1:8853
default-nameserver:
- 223.5.5.5
- 1.0.0.1
ipv6: false
enhanced-mode: fake-ip
fake-ip-filter:
- "*.lan"
- stun.*.*.*
- stun.*.*
- time.windows.com
- time.nist.gov
- time.apple.com
- time.asia.apple.com
- "*.ntp.org.cn"
- "*.openwrt.pool.ntp.org"
- time1.cloud.tencent.com
- time.ustc.edu.cn
- pool.ntp.org
- ntp.ubuntu.com
- ntp.aliyun.com
- ntp1.aliyun.com
- ntp2.aliyun.com
- ntp3.aliyun.com
- ntp4.aliyun.com
- ntp5.aliyun.com
- ntp6.aliyun.com
- ntp7.aliyun.com
- time1.aliyun.com
- time2.aliyun.com
- time3.aliyun.com
- time4.aliyun.com
- time5.aliyun.com
- time6.aliyun.com
- time7.aliyun.com
- "*.time.edu.cn"
- time1.apple.com
- time2.apple.com
- time3.apple.com
- time4.apple.com
- time5.apple.com
- time6.apple.com
- time7.apple.com
- time1.google.com
- time2.google.com
- time3.google.com
- time4.google.com
- music.163.com
- "*.music.163.com"
- "*.126.net"
- musicapi.taihe.com
- music.taihe.com
- songsearch.kugou.com
- trackercdn.kugou.com
- "*.kuwo.cn"
- api-jooxtt.sanook.com
- api.joox.com
- joox.com
- y.qq.com
- "*.y.qq.com"
- streamoc.music.tc.qq.com
- mobileoc.music.tc.qq.com
- isure.stream.qqmusic.qq.com
- dl.stream.qqmusic.qq.com
- aqqmusic.tc.qq.com
- amobile.music.tc.qq.com
- "*.xiami.com"
- "*.music.migu.cn"
- music.migu.cn
- "*.msftconnecttest.com"
- "*.msftncsi.com"
- localhost.ptlogin2.qq.com
- "*.*.*.srv.nintendo.net"
- "*.*.stun.playstation.net"
- xbox.*.*.microsoft.com
- "*.ipv6.microsoft.com"
- "*.*.xboxlive.com"
- speedtest.cros.wr.pvp.net
nameserver:
- https://223.6.6.6/dns-query
- https://rubyfish.cn/dns-query
- https://dns.pub/dns-query
fallback:
- https://dns.rubyfish.cn/dns-query
- https://public.dns.iij.jp/dns-query
- tls://8.8.4.4
fallback-filter:
geoip: true
ipcidr:
- 240.0.0.0/4
- 0.0.0.0/32
- 127.0.0.1/32
domain:
- +.google.com
- +.facebook.com
- +.twitter.com
- +.youtube.com
- +.xn--ngstr-lra8j.com
- +.google.cn
- +.googleapis.cn
- +.googleapis.com
- +.gvt1.com
proxy-providers:
LIAN:
type: http
# 这里填proxy-provider-converter转换得到的链接
url: https://proxy-provider-converter-sooty.vercel.app/api/convert?url=***&target=clash
interval: 3600
# 这里也根据proxy-provider-converter填写
path: ./api.nxtlnodes.com.yaml
health-check:
enable: true
interval: 600
# lazy: true
url: http://www.gstatic.com/generate_204
proxy-groups:
- { name: '♻自动选择', type: url-test, url: 'http://www.gstatic.com/generate_204', interval: 300, tolerance: 50, use: ['LIAN'] }
- { name: 'PROXY', type: select, use: ['LIAN'], proxies: ['♻自动选择', DIRECT] }
rules:
- RULE-SET,applications,DIRECT
- DOMAIN,clash.razord.top,DIRECT
- DOMAIN,yacd.haishan.me,DIRECT
- RULE-SET,private,DIRECT
- RULE-SET,reject,REJECT
- RULE-SET,icloud,DIRECT
- RULE-SET,apple,DIRECT
- RULE-SET,google,DIRECT
- RULE-SET,proxy,PROXY
- RULE-SET,direct,DIRECT
- RULE-SET,lancidr,DIRECT
- RULE-SET,cncidr,DIRECT
- RULE-SET,telegramcidr,PROXY
- GEOIP,LAN,DIRECT
- GEOIP,CN,DIRECT
- MATCH,PROXY
rule-providers:
reject:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/reject.txt"
path: ./ruleset/reject.yaml
interval: 86400
icloud:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/icloud.txt"
path: ./ruleset/icloud.yaml
interval: 86400
apple:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/apple.txt"
path: ./ruleset/apple.yaml
interval: 86400
google:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/google.txt"
path: ./ruleset/google.yaml
interval: 86400
proxy:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/proxy.txt"
path: ./ruleset/proxy.yaml
interval: 86400
direct:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/direct.txt"
path: ./ruleset/direct.yaml
interval: 86400
private:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/private.txt"
path: ./ruleset/private.yaml
interval: 86400
gfw:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/gfw.txt"
path: ./ruleset/gfw.yaml
interval: 86400
greatfire:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/greatfire.txt"
path: ./ruleset/greatfire.yaml
interval: 86400
tld-not-cn:
type: http
behavior: domain
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/tld-not-cn.txt"
path: ./ruleset/tld-not-cn.yaml
interval: 86400
telegramcidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/telegramcidr.txt"
path: ./ruleset/telegramcidr.yaml
interval: 86400
cncidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/cncidr.txt"
path: ./ruleset/cncidr.yaml
interval: 86400
lancidr:
type: http
behavior: ipcidr
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/lancidr.txt"
path: ./ruleset/lancidr.yaml
interval: 86400
applications:
type: http
behavior: classical
url: "https://raw.githubusercontents.com/Loyalsoldier/clash-rules/release/applications.txt"
path: ./ruleset/applications.yaml
interval: 86400