这篇文章介绍Remnawave订阅相关的内容,可能有点多有点杂,我尽量写的详细一点= =
首先在Remnawave面板里面有一个很重要的概念:主机。
这个主机是个啥意思呢?用一句话总结就是:你每添加的一个主机就对应最终用户在他们的客户端(Shadowrocket、Happ、sing-box等)上看到的节点。
假设现在我想让用户拥有一个VLESS-XHTTP-TLS过CDN的节点,现在我尝试添加一个主机。
1、备注随便填写,这是最终用户在他们的客户端上看到的节点名字。
2、每个主机都需要选择一个配置文件:
主机选择的这个配置文件必须已经有节点激活在使用:
3、因为我这是搭建的一个过CDN的节点,所以地址这里填写的是域名,且CloudFlare需要打开小云朵开关,如无需过CDN或者无需域名的情况下,可直接填写节点服务器的公网IP。
4、端口在大多数情况下,必须与所选配置文件内的入站端口匹配。首次添加的主机会自动识别配置文件内入站所使用的端口。
5、勾选主机可见性,启用这个主机。这样就创建好了一个主机。
Remnawave面板的第二个概念:内部分组。
一句话总结:内部分组的作用就是一种访问控制。最主要的功能是用来控制最终用户可以使用的主机(节点)。
Remnawave面板自带一个默认的内部分组,这里演示我就用这个自带的Default-Squad分组了,点击编辑:
这里可以同时选择多个配置文件(如果有的话),勾选你想让用户使用的入站配置:
接着我们创建一个用户,让这个用户使用Default-Squad分组:
这样用户就拥有了自己的订阅链接,他们可以通过这个订阅链接导入节点信息到各类客户端中使用。并且这个订阅链接内只包含你在Default-Squad分组内允许的入站配置:
Remnawave面板的第三个概念:订阅设置。
这个订阅设置怎么说呢,主要看用户使用的是什么客户端,因为不同的客户端在处理订阅链接时的行为不一样。但是对于Remnawave面板而言大致可以分为两类:基础订阅、json订阅。
这两者的区别是基础订阅一般情况下只包含节点信息,不包含路由规则、DNS配置等信息。而json订阅是包含路由规则、DNS配置等信息的。
我这里就拿自己常用的几个iOS客户端来演示吧。我平时用Shadowrocket、Happ、sing-box比较多。这里就主要说一下这三个客户端。
其中支持基础订阅的客户端,比如Shadowrocket,一般情况下它只提取订阅链接中的(主机)节点信息,像什么路由规则、DNS配置等等是不管的,因为它有自己的规则配置。所以它是开箱即用的,直接把Remnawave面板的订阅链接输上去导入就行了。
Happ这个客户端有点特殊,因为它同时支持基础订阅和json订阅,并且它支持在基础订阅内包含路由规则、DNS配置等信息。我使用这个客户端的时候一般不勾选“在基础订阅提供 JSON”,这样可以让Happ始终使用基础订阅,如果你勾选了这个,Happ默认就是json订阅了,那么你就需要自己搓一个json的订阅模板:
现在演示一下Happ如何在基础订阅内包含路由规则、DNS配置等信息。下面是我已经配置好的一个Happ路由链接:
happ://routing/add/eyJOYW1lIjoiQ2hpbmEiLCJHbG9iYWxQcm94eSI6InRydWUiLCJSZW1vdGVETlNUeXBlIjoiRG9IIiwiUmVtb3RlRE5TRG9tYWluIjoiaHR0cHM6Ly9kbnMuZ29vZ2xlL2Rucy1xdWVyeSIsIlJlbW90ZUROU0lQIjoiOC44LjguOCIsIkRvbWVzdGljRE5TVHlwZSI6IkRvSCIsIkRvbWVzdGljRE5TRG9tYWluIjoiaHR0cHM6Ly9kbnMuYWxpZG5zLmNvbS9kbnMtcXVlcnkiLCJEb21lc3RpY0ROU0lQIjoiMjIzLjUuNS41IiwiR2VvaXB1cmwiOiIiLCJHZW9zaXRldXJsIjoiIiwiTGFzdFVwZGF0ZWQiOiIiLCJEbnNIb3N0cyI6eyJkbnMuZ29vZ2xlIjoiOC44LjguOCIsImRucy5hbGlkbnMuY29tIjoiMjIzLjUuNS41In0sIkRpcmVjdFNpdGVzIjpbImdlb3NpdGU6Z2VvbG9jYXRpb24tY24iXSwiRGlyZWN0SXAiOlsiZ2VvaXA6Y24iXSwiUHJveHlTaXRlcyI6WyJnZW9zaXRlOmdlb2xvY2F0aW9uLSFjbiJdLCJQcm94eUlwIjpbXSwiQmxvY2tTaXRlcyI6W10sIkJsb2NrSXAiOltdLCJEb21haW5TdHJhdGVneSI6IklQSWZOb25NYXRjaCIsIkZha2VETlMiOiJmYWxzZSIsIlVzZUNodW5rRmlsZXMiOiJ0cnVlIn0=
可以直接在面板内通过Happ路由编辑器导入并解码然后根据自己的需要来修改:
解码后的配置如下:
{ "Name": "China", "GlobalProxy": "true", "RemoteDNSType": "DoH", "RemoteDNSDomain": "https://dns.google/dns-query", "RemoteDNSIP": "8.8.8.8", "DomesticDNSType": "DoH", "DomesticDNSDomain": "https://dns.alidns.com/dns-query", "DomesticDNSIP": "223.5.5.5", "Geoipurl": "", "Geositeurl": "", "LastUpdated": "", "DnsHosts": { "dns.google": "8.8.8.8", "dns.alidns.com": "223.5.5.5" }, "DirectSites": [ "geosite:geolocation-cn" ], "DirectIp": [ "geoip:cn" ], "ProxySites": [ "geosite:geolocation-!cn" ], "ProxyIp": [], "BlockSites": [], "BlockIp": [], "DomainStrategy": "IPIfNonMatch", "FakeDNS": "false", "UseChunkFiles": "true" }
建议不要使用太多的geosite、geoip规则,Happ在iOS上的Xray-core有50MB内存限制,超过50MB内存就会停止运行。这些规则多了会导致Xray-core内存迅速超过50NB。
如果不需要修改我提供的这个Happ路由规则,那么只需要在Remnawave面板的订阅设置–>Happ路由,添加保存即可:
现在说一下sing-box这个客户端,这其实是我主力使用的一个客户端,这个客户端只支持json订阅,所以需要在Remnawave面板配置一个json模板:
下面是我配置好的一个模板(基于GUI for SingBox导出),目前这个配置可以直接拿来用,但是我还是要稍微提一下哈,这个模板为了兼容sing-box 1.11(iOS客户端没办法更新)所以有些配置不是当前sing-box 1.12推荐的,随着sing-box的版本更新,有些配置可能会被弃用,到时会失效。(sing-box经常出破坏性的更新,没办法)
{ "dns": { "final": "Remote-DNS", "rules": [ { "action": "route", "server": "Local-DNS", "outbound": "any" }, { "action": "route", "server": "Local-DNS", "clash_mode": "direct" }, { "action": "route", "server": "Remote-DNS", "clash_mode": "global" }, { "action": "route", "server": "Local-DNS", "rule_set": [ "GeoSite-CN" ] }, { "action": "route", "server": "Remote-DNS", "rule_set": [ "GeoLocation-!CN" ] } ], "servers": [ { "tag": "Local-DNS", "detour": "🎯 全球直连", "address": "https://223.5.5.5:443/dns-query", "address_resolver": "Local-DNS-Resolver" }, { "tag": "Local-DNS-Resolver", "detour": "🎯 全球直连", "address": "udp://223.5.5.5:53" }, { "tag": "Remote-DNS", "detour": "→ Remnawave", "address": "tls://8.8.8.8:853", "address_resolver": "Remote-DNS-Resolver" }, { "tag": "Remote-DNS-Resolver", "detour": "→ Remnawave", "address": "udp://8.8.8.8:53" } ], "disable_cache": false, "disable_expire": false, "independent_cache": false }, "log": { "level": "info", "output": "", "disabled": false, "timestamp": false }, "route": { "final": "→ Remnawave", "rules": [ { "action": "sniff", "inbound": "tun-in" }, { "action": "hijack-dns", "protocol": "dns" }, { "action": "route", "outbound": "🎯 全球直连", "clash_mode": "direct" }, { "action": "route", "outbound": "→ Remnawave", "clash_mode": "global" }, { "action": "reject", "protocol": "quic" }, { "action": "reject", "rule_set": [ "Category-Ads" ] }, { "action": "route", "outbound": "→ Remnawave", "domain_keyword": "nexon" }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoSite-Private" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoSite-CN" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoIP-Private" ] }, { "action": "route", "outbound": "🎯 全球直连", "rule_set": [ "GeoIP-CN" ] }, { "action": "route", "outbound": "→ Remnawave", "rule_set": [ "GeoLocation-!CN" ] } ], "rule_set": [ { "tag": "Category-Ads", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/category-ads-all.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoIP-Private", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/private.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoSite-Private", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/private.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoIP-CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geoip/cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoSite-CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" }, { "tag": "GeoLocation-!CN", "url": "https://testingcf.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@sing/geo/geosite/geolocation-!cn.srs", "type": "remote", "format": "binary", "download_detour": "🎯 全球直连" } ], "auto_detect_interface": true }, "inbounds": [ { "mtu": 9000, "tag": "tun-in", "type": "tun", "stack": "system", "address": [ "172.18.0.1/30" ], "auto_route": true, "strict_route": true, "interface_name": "WiFi-6", "endpoint_independent_nat": false } ], "outbounds": [ { "tag": "→ Remnawave", "type": "selector", "outbounds": [ "⚡️ 自动选择" ], "interrupt_exist_connections": true }, { "tag": "⚡️ 自动选择", "url": "https://www.gstatic.com/generate_204", "type": "urltest", "interval": "3m", "outbounds": null, "tolerance": 150, "interrupt_exist_connections": true }, { "tag": "🎯 全球直连", "type": "direct" } ], "experimental": { "clash_api": { "secret": "", "external_ui": "", "default_mode": "rule", "external_controller": "127.0.0.1:2413", "external_ui_download_url": "", "access_control_allow_origin": [ "*" ], "external_ui_download_detour": "🎯 全球直连", "access_control_allow_private_network": false }, "cache_file": { "path": "cache.db", "enabled": true, "cache_id": "", "store_rdrc": true, "rdrc_timeout": "7d", "store_fakeip": true } } }
我常用的几个客户端就都介绍完了,实际上你可以看到Remnawave面板的json订阅配置还支持Mihomo、Stash等,但是我不用这些这里就不介绍了。
[可选]搭建一个Remnawave Subscription Page(独立的订阅页面程序)其作用是可以隐藏Remnawave面板域名,并且提供一个更美观的订阅页面。先看下效果:
编辑Remnawave面板的.env配置文件:
cd /opt/remnawave && nano .env
把之前的这个配置:
SUB_PUBLIC_DOMAIN=remnawave.example.com/api/sub
修改为你的订阅页面域名:
SUB_PUBLIC_DOMAIN=subscription.example.com
创建compose文件:
mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml
写入如下配置:
services: remnawave-subscription-page: image: remnawave/subscription-page:latest container_name: remnawave-subscription-page hostname: remnawave-subscription-page restart: always environment: - REMNAWAVE_PANEL_URL=https://remnawave.example.com - APP_PORT=3010 - META_TITLE="Subscription Page Title" - META_DESCRIPTION="Subscription Page Description" ports: - '127.0.0.1:3010:3010' networks: - remnawave-network networks: remnawave-network: driver: bridge external: true
注意:REMNAWAVE_PANEL_URL这里要指向你的面板URL,但是有多种配置方法。
1、此订阅页面程序与面板不在同一台服务器部署,那么这里就填写面板的域名,并且去掉compose内的external: true配置。
2、在同一服务器部署,可以直接填面板服务的主机名:3000,例如:http://remnawave:3000,也可以直接填写域名。
启动:
docker compose up -d
配置反向代理,我这里用的Pangolin: