Featured image of post 我的家庭网络设计思路,开启debian的旁路由之路(七)

我的家庭网络设计思路,开启debian的旁路由之路(七)

本篇主要讲解如何使用nginx配置为文件服务器,为其他服务提供文件下载,以及自动更新clash订阅、自动生成前文需要的各种文件。

文件准备

nginx

我默认你已经按照 前文(二) 安装好了 nginx 了。新建 /etc/nginx/conf.d/private.conf,内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
server {
        listen 80;
        server_name 10.0.0.2;
        charset 'utf-8';
        root /var/www/html;
        location / {
                if ($request_filename ~* ^((.*?\.(txt|yaml|yml|md|acl|rule|list|ini|xml|conf|vcf|manifest|sig|buildinfo|json))|LICENCE|Packages|sha256sums)$){
                        more_set_headers 'Content-Type: text/plain; charset=utf-8';
                }
                autoindex on;            # 索引 
                autoindex_exact_size on; # 显示文件大小 
                autoindex_localtime on;  # 显示文件时间
        }
}

如果 nginx 已经启动起来了,那么重新读取下:nginx -s reload;如果 nginx 还没有启动,那么就启动它: systemctl restart nginx.service

然后,放在 /var/www/html 下面的文件,可以通过网址 http://10.0.0.2/XXXXX 来下载,也就是说,我们后面创建的 /var/www/html/config_template.yaml/var/www/html/convert_rule.ini 等等文件,可以通过网址 http://10.0.0.2/config_template.yaml http://10.0.0.2/convert_rule.ini 来下载。

clash配置模板

clash 订阅制作适合你自己的模板,根据 clash meta wiki,自行创建 /var/www/html/config_template.yaml。以下是我的。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
---
port: 7890
socks-port: 7891
mixed-port: 7893
tproxy-port: 7895
routing-mark: 666
allow-lan: true
bind-address: "*"
mode: rule
log-level: info
ipv6: false
find-process-mode: 'off'
external-controller: 0.0.0.0:9090
secret: You_Secret
external-ui: ui
external-ui-name: xd
external-ui-url: "https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip"
unified-delay: true
tcp-concurrent: true
authentication:
  - "Evine:ABCDEFGHIJK"
experimental:
  sniff-tls-sni: true
geodata-mode: true
geodata-loader: standard
geox-url:
  geoip: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat"
  geosite: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat"
  mmdb: "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/country.mmdb"
profile:
  tracing: true
  store-selected: true
  store-fake-ip: true
sniffer:
  enable: true                     # 嗅探器开关,开启后对 redir-host 类型识别的流量进行强制嗅探,包含Tun、Redir和TProxy或DNS为redir-host
  # force-dns-mapping: false
  parse-pure-ip: true              # 对所有未获取到域名的流量进行强制嗅探
  override-destination: true       # 是否使用嗅探结果作为实际访问,默认 true,全局配置,优先级低于 sniffer.sniff 实际配置
  # sniff: # TLS 默认如果不配置 ports 默认嗅探 443
  #   TLS:
  #     ports: [443, 8443]
  #   HTTP: # 需要嗅探的端口, 默认嗅探 80
  #     ports: [80, 8080-8880]
  #     override-destination: true # 可覆盖 sniffer.override-destination
dns:
  enable: true
  ipv6: false
  listen: 0.0.0.0:7874
  use-hosts: true
  enhanced-mode: redir-host
  default-nameserver:
    - 101.226.4.6
    - 114.114.114.114
    - 223.5.5.5
  nameserver:
    - "https://dns.alidns.com/dns-query"
    - "https://doh.pub/dns-query"
    - "https://doh.360.cn/dns-query"
  nameserver-policy:
    geosite:cn:
      - "https://dns.alidns.com/dns-query"
      - "https://doh.pub/dns-query"
      - "https://doh.360.cn/dns-query"
    geosite:geolocation-!cn:
      - "https://1.1.1.1/dns-query"
      - "https://8.8.8.8/dns-query"
  fallback:
    - 'https://1.1.1.1/dns-query'
    - 'https://8.8.8.8/dns-query'
  fallback-filter:
    geoip: true
    geoip-code: CN
    geosite:
      - gfw
    ipcidr:
      - 0.0.0.0/8
      - 10.0.0.0/8
      - 100.64.0.0/10
      - 127.0.0.0/8
      - 169.254.0.0/16
      - 172.16.0.0/12
      - 192.0.0.0/24
      - 192.0.2.0/24
      - 192.88.99.0/24
      - 192.168.0.0/16
      - 198.18.0.0/15
      - 198.51.100.0/24
      - 203.0.113.0/24
      - 224.0.0.0/4
      - 240.0.0.0/4
      - 255.255.255.255/32
    domain:
      - "+.google.com"
      - "+.facebook.com"
      - "+.youtube.com"
      - "+.githubusercontent.com"
      - "+.googlevideo.com"
      - "+.msftconnecttest.com"
      - "+.msftncsi.com"
  fake-ip-filter:
    - "+.*"

subconverter转换规则

制作自己的 subconverter 转换配置,新建 /var/www/html/convert_rule.ini ,详细的格式见 subconverter外部配置,在 这里 有大量的参考文件。

下面是我的 /var/www/html/convert_rule.ini,不要照抄,抄了也用不了。还是需要按照上一段提及的材料自行准备适合自己的。注意到我们自己形成了 ruleset=🎶 网易音乐,http://10.0.0.2/clash/neteasemusic.list,用 (^(?!.*网易).*) 在常规节点中排除了我们自建的 UnblockNeteaseMusic 节点,以及设置了专门的分组 custom_proxy_group=🎶 网易音乐,这都是为解锁网易云音乐服务的。另外,还要注意到我们在这个文件中使用 clash_rule_base=http://10.0.0.2/config_template.yaml 来引用了前一步创建的 clash 配置模板。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
[custom]
;设置规则标志位
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/LocalAreaNetwork.list
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/UnBan.list
ruleset=⚓ PT站点,http://10.0.0.2/pt.list
ruleset=🗺 直连网站,http://10.0.0.2/direct.list
ruleset=🌎 强制代理,http://10.0.0.2/proxy.list
ruleset=📢 谷歌FCM,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/GoogleFCM.list
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/GoogleCN.list
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/SteamCN.list
ruleset=Ⓜ️ 微软云盘,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/OneDrive.list
ruleset=Ⓜ️ 微软服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Microsoft.list
ruleset=🍎 苹果服务,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Apple.list
ruleset=📲 电报消息,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Telegram.list
ruleset=💬 OpenAi,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/OpenAi.list
ruleset=🎶 网易音乐,http://10.0.0.2/neteasemusic.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Epic.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Origin.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Sony.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Steam.list
ruleset=🎮 游戏平台,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Nintendo.list
ruleset=📹 油管视频,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/YouTube.list
ruleset=📺 哔哩哔哩,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/BilibiliHMT.list
ruleset=📺 哔哩哔哩,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/Ruleset/Bilibili.list
ruleset=🌏 国内媒体,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaMedia.list
ruleset=🌍 国外媒体,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyMedia.list
ruleset=🚀 节点选择,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ProxyGFWlist.list
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaDomain.list
ruleset=🎯 全球直连,https://raw.githubusercontent.com/ACL4SSR/ACL4SSR/master/Clash/ChinaCompanyIp.list
ruleset=🎯 全球直连,[]GEOIP,CN
ruleset=🐟 漏网之鱼,[]FINAL
;设置规则标志位

;设置分组标志位
custom_proxy_group=🚀 节点选择`select`[]♻️ 自动选择`[]🔯 故障转移`[]🔮 负载均衡`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=🚀 手动切换`select`(^(?!.*网易).*)
custom_proxy_group=♻️ 自动选择`url-test`(^(?!.*网易).*)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🔯 故障转移`fallback`(^(?!.*网易).*)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🔮 负载均衡`load-balance`(^(?!.*网易).*)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=⚓ PT站点`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=🗺 直连网站`select`[]DIRECT`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=🌎 强制代理`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=📲 电报消息`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=💬 OpenAi`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=📹 油管视频`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=📺 哔哩哔哩`select`[]🎯 全球直连`[]🇨🇳 台湾节点`[]🇭🇰 香港节点
custom_proxy_group=🌍 国外媒体`select`[]🚀 节点选择`[]♻️ 自动选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`🏴‍☠️ 其他节点`[]🚀 手动切换`[]DIRECT
custom_proxy_group=🌏 国内媒体`select`[]DIRECT`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🚀 手动切换
custom_proxy_group=📢 谷歌FCM`select`[]DIRECT`[]🚀 节点选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=Ⓜ️ 微软云盘`select`[]DIRECT`[]🚀 节点选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=Ⓜ️ 微软服务`select`[]DIRECT`[]🚀 节点选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=🍎 苹果服务`select`[]DIRECT`[]🚀 节点选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=🎮 游戏平台`select`[]DIRECT`[]🚀 节点选择`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=🎶 网易音乐`select`网易`[]DIRECT
custom_proxy_group=🎯 全球直连`select`[]DIRECT`[]🚀 节点选择`[]♻️ 自动选择
custom_proxy_group=🐟 漏网之鱼`select`[]🚀 节点选择`[]♻️ 自动选择`[]DIRECT`[]🇭🇰 香港节点`[]🏴‍☠️ 除香港外`[]🇨🇳 台湾节点`[]🇸🇬 狮城节点`[]🇯🇵 日本节点`[]🇺🇲 美国节点`[]🇰🇷 韩国节点`[]🏴‍☠️ 其他节点`[]🚀 手动切换
custom_proxy_group=🇭🇰 香港节点`url-test`(^(?!.*10x).*(港|HK|Hong Kong))`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🏴‍☠️ 除香港外`url-test`(^(?!.*(懒人|香港|网易)).*)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🇯🇵 日本节点`url-test`(^(?!.*10x).*(日本|川日|东京|大阪|泉日|埼玉|沪日|深日|[^-]日|JP|Japan))`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🇺🇲 美国节点`url-test`(美|波特兰|达拉斯|俄勒冈|凤凰城|费利蒙|硅谷|拉斯维加斯|洛杉矶|圣何塞|圣克拉拉|西雅图|芝加哥|US|United States)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🇨🇳 台湾节点`url-test`(台|新北|彰化|TW|Taiwan)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🇸🇬 狮城节点`url-test`(^(?!.*10x).*(新加坡|坡|狮城|SG|Singapore))`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🇰🇷 韩国节点`url-test`(KR|Korea|KOR|首尔|韩|韓)`https://cp.cloudflare.com/generate_204`180,,10
custom_proxy_group=🏴‍☠️ 其他节点`url-test`(^(?!.*(懒人|香港|台湾|新加坡|韩国|美国|日本|网易)).*)`https://cp.cloudflare.com/generate_204`180,,10
;设置分组标志位

enable_rule_generator=true
overwrite_original_rules=true
clash_rule_base=http://10.0.0.2/config_template.yaml

;Options for renaming nodes
rename=印尼@印度尼西亚
rename=澳洲@澳大利亚
rename=迪拜@阿联酋

;Options for adding emojis
add_emoji=true
remove_old_emoji=true
;emoji=(流量|时间|应急),🏳️‍🌈
emoji=香港,🇭🇰
emoji=澳门,🇲🇴
emoji=台湾,🇨🇳
emoji=日本,🇯🇵
emoji=韩国,🇰🇷
emoji=美国,🇺🇸
emoji=英国,🇬🇧
emoji=泰国,🇹🇭
emoji=法国,🇫🇷
emoji=德国,🇩🇪
emoji=巴西,🇧🇷
emoji=(^(?!.*尼).*印度),🇮🇳
emoji=荷兰,🇳🇱
emoji=南非,🇿🇦
emoji=智利,🇨🇱
emoji=丹麦,🇩🇰
emoji=伊朗,🇮🇷
emoji=越南,🇻🇳
emoji=瑞士,🇨🇭
emoji=捷克,🇨🇿
emoji=芬兰,🇫🇮
emoji=挪威,🇲🇽
emoji=瑞典,🇸🇪
emoji=新加坡,🇸🇬
emoji=俄罗斯,🇷🇺
emoji=阿根廷,🇦🇷
emoji=土耳其,🇹🇷
emoji=菲律宾,🇵🇭
emoji=比利时,🇧🇪
emoji=卢森堡,🇱🇺
emoji=阿联酋,🇦🇪
emoji=加拿大,🇨🇦
emoji=意大利,🇮🇹
emoji=爱尔兰,🇮🇪
emoji=奥地利,🇦🇹
emoji=孟加拉,🇧🇩
emoji=柬埔寨,🇰🇭
emoji=哈萨克,🇰🇿
emoji=墨西哥,🇲🇽
emoji=新西兰,🇳🇿
emoji=葡萄牙,🇵🇹
emoji=西班牙,🇪🇸
emoji=乌克兰,🇺🇦
emoji=罗马尼亚,🇷🇴
emoji=巴基斯坦,🇵🇰
emoji=马来西亚,🇲🇾
emoji=(澳洲|澳大利亚),🇦🇺
emoji=(印尼|印度尼西亚),🇮🇩
emoji=懒人,🦥
emoji=网易,🎶


;用于包含或排除节点关键词的选项 会覆盖 主程序目录中的配置文件 里的内容
;include_remarks=
exclude_remarks=越南|南非|到期|流量|重置

;在 header 里的加入流量信息
append_sub_userinfo=true

网易云音乐域名与IP规则

subconverter转换配置 中,我们引用了 http://10.0.0.2/neteasemusic.list,现在我们对它初始化。新建 /var/www/html/neteasemusic.list,内容如下,接下来我们会用脚本自动更新它。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DOMAIN-SUFFIX,music.163.com
DOMAIN-SUFFIX,music.163.com.163jiasu.com
IP-CIDR,39.105.63.80/32,no-resolve
IP-CIDR,39.105.175.128/32,no-resolve
IP-CIDR,45.127.129.53/32,no-resolve
IP-CIDR,47.100.127.239/32,no-resolve
IP-CIDR,59.111.19.33/32,no-resolve
IP-CIDR,59.111.19.99/32,no-resolve
IP-CIDR,59.111.160.195/32,no-resolve
IP-CIDR,112.47.51.30/32,no-resolve
IP-CIDR,114.80.149.72/30,no-resolve
IP-CIDR,115.238.119.67/32,no-resolve
IP-CIDR,115.238.119.68/31,no-resolve
IP-CIDR,118.24.63.156/32,no-resolve
IP-CIDR,121.228.190.68/30,no-resolve
IP-CIDR,122.225.83.106/32,no-resolve
IP-CIDR,122.225.83.109/32,no-resolve
IP-CIDR,122.225.83.110/32,no-resolve
IP-CIDR,180.163.200.96/30,no-resolve
IP-CIDR,182.92.170.253/32,no-resolve
IP-CIDR,183.134.34.248/31,no-resolve
IP-CIDR,183.136.182.18/31,no-resolve
IP-CIDR,183.136.182.20/32,no-resolve
IP-CIDR,193.112.159.225/32,no-resolve

网易云音乐的代理配置

前文(五) 中我们手动设置了网易云音乐的代理,现在我们为接下来的自动订阅创建一个文件:/var/www/html/neteasemusic.yaml,内容如下:

1
2
3
4
5
proxies:
  - name: "🎶 网易代理"
    server: 10.0.0.2
    port: 8080
    type: http

工具准备

后面的脚本中还要用到两个工具。下载 v2dat 保存为 /usr/local/bin/v2dat,下载 cidr-merger 保存为 /usr/local/bin/cidr-merger

然后为它们增加可执行权限:

1
chmod +x /usr/local/bin/{v2dat,cidr-merger}

感谢以下仓库:

自动脚本

为了自动备份旧的订阅文件,防止出错,我们使用将 /var/lib/clash/config.yaml 软连接到 /var/lib/clash/config/subscribes_name1.yamlsubscribes_name1 由你自行定义,请和下文的脚本中的命名保持一致)。后续脚本中会自动删除超过30天的旧订阅。

1
2
3
4
cd /var/lib/clash
mkdir config
cp config.yaml config/subscribes_name1.yaml
ln -sf config/subscribes_name1.yaml config.yaml

如果未来需要在多份订阅中切换,直接更新软连接即可:

1
2
cd /var/lib/clash
ln -sf config/subscribes_name2.yaml config.yaml

然后新建一个文件 /usr/local/bin/update-config.sh 如下,并按照注释修改。

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
#!/usr/bin/env bash

## 订阅相关信息,subscribes_name和subscribes_url一一对应,如果想要合并多个订阅为一份,使用 | 分隔,比如示例中第3个。同时这两个数组的元素个数必须一致。
subscribes_name=(
    subscribes_name1.yaml
    subscribes_name2.yaml
    subscribes_merge.yaml
)
subscribes_url=(
    "https://api.clashsubscribes.icu/clashudp/1111/125adfqeradf/"
    "https://v3.clashsubscribes.xyz/api/v1/client/subscribe?token=abcdefjagadfqaer456"
    "https://api.clashsubscribes.icu/clashudp/1111/125adfqeradf/|https://v3.clashsubscribes.xyz/api/v1/client/subscribe?token=abcdefjagadfqaer456"
)

## 订阅设置
subconverter_target="clash"                           # 转换目标
subconverter_url="http://10.0.0.2:25500/sub"          # subconverer的api接口
subconverter_nem="http://10.0.0.2/neteasemusic.yaml"  # 前面生成的neteasemusic.yaml的下载网址
subconverter_rule="http://10.0.0.2/convert_rule.ini"  # 前面生成的convert_rule.ini的下载网址

## 路径
dir_clash_work="/var/lib/clash"              # clash的工作路径
dir_xd=$dir_clash_work/ui/xd                 # clash的XD面板相关文件的保存目录
dir_mosdns_geodata="/var/lib/mosdns/geodata" # mosdns用到的geodata相关数据的保存目录,在mosdns配置文件中定义的
list_nem="/var/www/html/neteasemusic.list"   # neteasemusic.list的路径
nem_address=nem_address.nft                  # 前文中在/var/lib/clash下的clash需要用到的网易云音乐IP地址,服务clash的nftables规则用
geoip4_cn=geoip4_cn.nft                      # 前文中在/var/lib/clash下的clash需要用到的中国大陆IP地址,服务clash的nftables规则用

############ 以下内容建议不要修改 ############

## geodata相关
geodata=(
    geoip.dat
    geosite.dat
)
geodata_url=(
    https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat
    https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat
)
geodata_txt=(
    'geoip_cn.txt'
    'geosite_cn.txt'
    'geosite_geolocation-!cn.txt'
)

## 订阅相关信息
subscribes_current=$(readlink $dir_clash_work/config.yaml) # 当前所使用的配置,是个软连接

## 是否重启的标记
mark_mosdns_restart=no
mark_clash_restart=no

## 在clash工作目录下运行本脚本
cd "$dir_clash_work"

## url转换
urlencode() {
    while read -n1 v; do
        case $v in
            [a-zA-Z0-9.~_-]) printf "%s" "$v";;
                          *) printf "%%%02X" "'$v";;
        esac
    done
    printf '\n'
}

## 计算sha256
gen_sha256sum() {
    local file="$1"
    local sha
    if [[ -f "$file" ]]; then
        sha=$(sha256sum "$file" | awk '{print $1}')
    elif [[ "$file" == "http"* ]]; then
        sha=$(curl -fsSL "$file" 2>/dev/null | awk '{print $1}')
    fi
    if [[ -n $sha ]]; then
        echo $sha
    fi
}

## 更新geodata和nftables规则
update_geodata() {
    local i txt
    local tmp_geodir=/tmp/geodata
    local mmdb=country.mmdb
    if [[ ! -d $tmp_geodir ]]; then
        mkdir $tmp_geodir
    fi

    ## 更新 country.mmdb
    echo "开始更新 $mmdb ..."
    if wget -q --progress=bar:dot --show-progress -O "$tmp_geodir/$mmdb" https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/$mmdb; then
        if [[ $(gen_sha256sum "$mmdb") != $(gen_sha256sum "$tmp_geodir/$mmdb") ]]; then
            cp -f "$tmp_geodir/$mmdb" "$mmdb"
            echo "更新数据 $mmdb 成功..."
        else
            echo "$mmdb 无变化,不更新..."
        fi
    else
        echo "更新数据 $mmdb 失败..."
    fi

    ## 更新 geodata
    for ((i=0; i<${#geodata[@]}; i++)); do
        local sha256sum_new=$(gen_sha256sum "${geodata_url[i]}.sha256sum")
        echo "开始更新 ${geodata[i]} ..."
        if  [[ -n "$sha256sum_new" && "$sha256sum_new" != $(gen_sha256sum ${geodata[i]}) ]]; then
            if wget -q --progress=bar:dot --show-progress -O "$tmp_geodir/${geodata[i]}" "${geodata_url[i]}"; then
                if [[ "$sha256sum_new" == $(gen_sha256sum "$tmp_geodir/${geodata[i]}") ]]; then
                    cp -f "$tmp_geodir/${geodata[i]}" "${geodata[i]}"
                    echo "更新数据 ${geodata[i]} 成功..." 
                    mark_clash_restart=yes  # 重启clash
                fi
            else
                echo "更新数据 ${geodata[i]} 失败..."
            fi
        else
            echo "${geodata[i]} 无变化,不更新..."
        fi
    done

    ## 解包geodata
    if [[ $mark_clash_restart == yes ]]; then
        echo "geo 数据有变化,开始重新生成相关文件..."

        ## 为mosdns重新生成geoip_cn.txt,geosite_cn.txt,geosite_geolocation-!cn.txt
        echo "开始解包 geoip.dat 到临时目录 $tmp_geodir..." 
        v2dat unpack geoip -o "$tmp_geodir" -f cn geoip.dat
        echo "开始解包 geosite.dat 到临时目录 $tmp_geodir..." 
        v2dat unpack geosite -o "$tmp_geodir" -f cn -f 'geolocation-!cn' geosite.dat
        for txt in ${geodata_txt[@]}; do
            if [[ $(gen_sha256sum "$dir_mosdns_geodata/$txt") != $(gen_sha256sum "$tmp_geodir/$txt") ]]; then
                echo "检测到 $txt 内容有变化,从 $tmp_geodir/$txt 复制到 $dir_mosdns_geodata/$txt ..."
                cp -f "$tmp_geodir/$txt" "$dir_mosdns_geodata/$txt"
                mark_mosdns_restart=yes
            else
                echo "$txt 内容无变化,不更新..."
            fi
        done

        ## 为clash重新生成geoip4_cn.nft
        echo "define geoip4_cn = {" > $tmp_geodir/$geoip4_cn
        cat "$tmp_geodir"/geoip_cn.txt | sed '/:/d' | perl -pe "{s|^|    |; s|$|,|}" >> "$tmp_geodir"/$geoip4_cn
        echo "}" >> "$tmp_geodir"/$geoip4_cn
        if [[ -n $(grep -oP "(\d{1,3}\.){3}\d{1,3}" "$tmp_geodir"/$geoip4_cn) && $(gen_sha256sum $geoip4_cn) != $(gen_sha256sum "$tmp_geodir/$geoip4_cn") ]]; then
            cp -f "$tmp_geodir"/$geoip4_cn $geoip4_cn
            echo "更新数据 $geoip4_cn 成功..."
        fi
    else
        echo "geo 数据无变化,无需解包 ${geodata_txt[@]},无需更新 $geoip4_cn ..." 
    fi
    
    ## 为clash重新生成nem_address.nft和neteasemusic.list
    local domain_nem="music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com"
    local nemip=$(wget --timeout=5 -qO- "http://httpdns.n.netease.com/httpdns/v2/d?domain=$domain_nem" | jq -r .data[].ip | grep -v null | jq -r .[] | cidr-merger --range)
    nemip=$( (cat $nem_address | grep -oP "(\d{1,3}\.){3}\d{1,3}(-(\d{1,3}\.){3}\d{1,3})?"; cat $list_nem | grep -oP "(\d{1,3}\.){3}\d{1,3}/\d+"; echo "$nemip") | cidr-merger --range)
    if [[ -n "$nemip" ]]; then
        echo "define nem_address = {" > $tmp_geodir/$nem_address
        echo "$nemip" | perl -pe "{s|^|    |; s|$|,|}" >> "$tmp_geodir"/$nem_address
        echo "}" >> "$tmp_geodir"/$nem_address
        if [[ -n $(grep -oP "(\d{1,3}\.){3}\d{1,3}" "$tmp_geodir"/$nem_address) && $(gen_sha256sum $nem_address) != $(gen_sha256sum "$tmp_geodir/$nem_address") ]]; then
            cp -f "$tmp_geodir"/$nem_address $nem_address
            echo "更新数据 $nem_address 成功..."
            mark_clash_restart=yes # 重启clash
        else
            echo "$nem_address 内容无变化,不更新..."
        fi
    fi
    cp -f $list_nem "$tmp_geodir/${list_nem##*/}"
    sed -i "/IP-CIDR/d" "$tmp_geodir/${list_nem##*/}"
    echo "$nemip" | cidr-merger -s | perl -pe "{s|^|IP-CIDR,|; s|$|,no-resolve|}" >> "$tmp_geodir/${list_nem##*/}"
    if [[ $(gen_sha256sum "$tmp_geodir/${list_nem##*/}") != $(gen_sha256sum "$list_nem") ]]; then
        cp -f "$tmp_geodir/${list_nem##*/}" $list_nem
        echo "更新数据 ${list_nem##*/} 成功..."
    else
        echo "${list_nem##*/} 内容无变化,不更新..."
    fi
}

## 检测proxies:和proxy-groups:之间的行差,$1: 文件路径
diff_detect() {
    local yaml="$1"
    local line1=$(grep -nP "^proxies:" $yaml | awk -F: '{print $1}')
    local line2=$(grep -nP "^proxy-groups:" $yaml | awk -F: '{print $1}')
    local diff=$(( $line2 - $line1 )) 2>/dev/null
    if [[ -n $diff ]]; then
        echo $diff
    else
        echo 0
    fi
}

## 更新订阅
update_subscribes() {
    ## 更新订阅
    local i sha256sum_old sha256sum_new url config
    local dir_tmpsubscribes=/tmp/clash

    if [[ ! -d $dir_tmpsubscribes ]]; then
        mkdir $dir_tmpsubscribes
    fi
    for ((i=0; i<${#subscribes_name[@]}; i++)); do
        echo "开始更新订阅 ${subscribes_name[i]} ..."
        url=$(echo -n "${subscribes_url[i]}|${subconverter_nem}" | urlencode)
        config=$(echo -n ${subconverter_rule} | urlencode)
        subscribes_tmpconfig="$dir_tmpsubscribes/${subscribes_name[i]}"
        if wget -q -O "$subscribes_tmpconfig" "${subconverter_url}?target=${subconverter_target}&url=${url}&config=${config}"; then
            sha256sum_old=$(gen_sha256sum "config/${subscribes_name[i]}")
            sha256sum_new=$(gen_sha256sum "$subscribes_tmpconfig")
            if [[ $(diff_detect "$subscribes_tmpconfig") -gt 2 && $sha256sum_old != $sha256sum_new ]]; then
                if clash -t -d . -f "$subscribes_tmpconfig"; then
                    cp -a "config/${subscribes_name[i]}" "config/${subscribes_name[i]}.$(date +'%s')"
                    cp -f "$subscribes_tmpconfig" "config/${subscribes_name[i]}"
                    echo "更新订阅 ${subscribes_name[i]} 成功..."
                    if [[ "config/${subscribes_name[i]}" == "$subscribes_current" ]]; then
                        mark_clash_restart=yes # 重启clash
                    fi
                else
                    echo "订阅 ${subscribes_name[i]} 校验失败,不更新..."
                fi
            else
                echo "订阅 ${subscribes_name[i]} 无变化,不更新..."
            fi
        else
            echo "订阅 ${subscribes_name[i]} 下载失败..."
        fi
    done

    ## 删除超过30天的旧订阅
    for yaml in $(ls config/*.yaml.* 2>/dev/null); do
        if [[ $(( $(date +%s) - ${yaml##*.} )) -gt 2592000 ]]; then
            rm -v "$yaml"
        fi
    done
}

## 更新clash的XD面板
update_xd() {
    if [[ ! -d ${dir_xd} ]]; then
        mkdir -p ${dir_xd}
    fi
    cd ${dir_xd}
    echo "开始更新 clash 面板 XD ..."
    if [[ -n $(ls) && ! -d .git ]] || [[ -z $(ls) ]]; then
        rm -rf * .* &>/dev/null
        git clone -b gh-pages --depth 1 https://github.com/MetaCubeX/metacubexd .
    elif [[ -n $(ls) && -d .git ]]; then 
        git fetch
        git reset origin/gh-pages --hard
        git pull
    fi
}

## 重启服务
restart_service() {
    if [[ $mark_clash_restart == yes ]]; then
        systemctl restart clash.service # 也可以改成重新加载配置而非重启:curl -Ss -H "Authorization: Bearer YOUR_CLASH_SECRET" -X PUT -d '{"path": "/var/lib/clash/config.yaml"}' "http://127.0.0.1:9090/configs?force=true"
        echo "重启 clash.service"
    fi
    if [[ $mark_mosdns_restart == yes ]]; then
        systemctl restart mosdns.service
        echo "重启 mosdns.service"
    fi
}

## 中止时删除临时文件
finish() {
    rm -rf /tmp/{clash,geodata} &>/dev/null
}

## 调用和函数
main() {
    trap finish EXIT
    update_geodata
    update_subscribes
    update_xd
    restart_service
}
main "$@"

为其增加可执行权限:

1
chmod +x /usr/local/bin/update-config.sh

然后运行一下:

1
update-config.sh

如果有报错,请在报错前行添加 set +x,在后行添加 set -x 后,再次运行,根据输出信息自行排故。这需要你有一点点的 shell 知识。

建议将 update-config.sh 加入定时任务,请自行调整下执行时间:

1
echo -e "SHELL=/bin/bash\nPATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin\n19 1 * * * update-config.sh >/dev/null" | crontab -

最后

脚本运行没问题后,更新完全部所需文件,那么再回过头去把前面没有启动的服务全部启动起来吧。至此,基本的科学上网服务已配置完毕,在 本系列 接下来的文章中,将继续配置其他服务。

系列

Built with Hugo
主题 StackJimmy 设计