远程规则源
远程源是可选的。 本地来源 在没有网络访问的情况下继续工作。下面的示例使用占位符 URL,仅供说明,而不是可立即运行的配置。
使用 url 加载远程源。持久缓存是可选的。相同的源对象在 rule_source_group.rules、masks(包括 all/any/not)下工作,或者与策略组规则中的 action、服务器的 rules 或支持的 override_rules 并排。平面源也不能指定 masks。
- global_settings: rule_cache_dir: ./cache
- rule_source_group: regional rules: - url: https://example.net/geoip-cn.srs update_interval: 7d download: client_chain: direct bootstrap_url: system
- address: "0.0.0.0:1080" protocol: {type: socks} rules: - masks: {rule_source_group: regional} action: block - url: https://example.net/blocked.json download: client_chain: address: "proxy.example.net:1080" protocol: {type: socks} bootstrap_url: system action: block - masks: {any_destination: true} action: allow将 proxy.example.net:1080 替换为您的代理地址。 download.client_chain 接受现有的链、池、内联客户端和组语法。它独立于外部策略的 client_chain,后者路由匹配的流量。 download.client_chain 和 download.bootstrap_url 都是必需的。引导程序可以是 system、基于 IP 的 DNS URL 或命名的 DNS 组。目标和代理主机名使用此解析器;失败的刷新路由永远不会回退到直接。自动刷新使用活动生成的 DNS、代理客户端和选择器选项。
所有运行时远程源都使用内存中保留的已编译规则,包括启用磁盘缓存时。重新加载重用 URL 和解码选项不变的源;运行时编译永远不会回退到缓存文件。省略 global_settings.rule_cache_dir 以禁用持久性。 shoes 在启动监听器之前下载所需的源。定期刷新仍然适用;下载失败或拒绝候选者会使活动规则保持不变。不会创建缓存、锁定、暂存或临时文件。下载缓冲区在验证和可选的缓存保存后被释放;字节相同的刷新不会重新编译规则。冷启动需要网络访问;当没有持久缓存时,远程中断会阻止启动。 check 和 --dry-run 保持离线状态,无法验证仅内存远程源。本地文件源仍然需要 path。
global_settings.rule_cache_dir 可以在一个私有托管目录中跨所有配置文件实现尽最大努力的持久性。即使保存失败,有效的下载仍然可用。记录缓存保存失败;下一次成功的下载会重试保存,包括字节相同的下载。在保存成功之前,重新启动可能会恢复较旧的缓存规则或需要网络访问。在源不可用时必须重新启动的路由器上使用持久缓存。它的值与声明文件相关,并且在进程生命周期内是固定的:添加、更改或删除它需要重新启动,即使没有远程源也是如此。远程 path 是可选的:省略时,shoes 从 URL 和解码选项生成稳定的文件名。显式远程路径需要 rule_cache_dir 并且必须是该目录的直接子目录。配置、本地规则源(包括别名)、PEM、套接字和其他状态必须位于其外部。 ACME 状态目录不能包含缓存目录或被缓存目录包含。在 Linux 上,/run/shoes 保留用于托管 TUN 所有权和恢复文件;请改用单独的缓存目录,例如 /run/shoes/rule-cache。该目录必须由正在运行的用户拥有,并且不可组写入或全局写入(例如,使用 install -d -m 700 cache 创建它)。缓存文件必须是拥有的、常规的、单链接的、不可组写或全局可写的,并且没有 setuid、setgid 或粘性模式位。任何路径组件中的符号链接和 .. 遍历都会被拒绝。 owner.lock、.shoes-update.lock 和 .shoes-update.tmp 边车已保留。守护进程拥有独占目录租约;另一个守护进程不能同时使用同一目录。替换目录或owner.lock使租约失效;随后的运行时缓存读取和写入将被拒绝,直到重新启动为止,而无需获取替换租约。保留的规则、下载和配置重新加载可以在内存中继续。共享缓存的相同声明会被去重;相互矛盾的声明将被拒绝。仅限本地的文件源未更改。
format 仍然是可选的:显式覆盖、识别的 SRS/MRS 签名、URL 路径名扩展(忽略查询),然后是缓存路径扩展。支持所有本地解码器; DAT 仍然需要显式格式/代码,而 Mihomo YAML/文本需要行为。无效解码永远不会重试不同的格式。
update_interval 默认为 24h;使用正整数与 s、m、h 或 d(从 1s 到 365d)。守护进程启动将有效的缓存源恢复到内存中。在准备候选监听器之前,将通过其配置的下载路由获取丢失、不可读、无效或空的缓存源。不安全的文件永远不会被读取或替换;新下载的内容可能仍会在内存中运行。配置 rule_cache_dir 时,初始目录创建和独占租约获取必须成功。重新加载更喜欢保留规则,因此删除或编辑缓存不会强制重新获取。更改保留源的 URL 或解码选项会获取新源,而不是重用其旧缓存。 check 和 --dry-run 严格保持离线状态:不进行提取、目录创建、租赁或安装。它们因缓存丢失或无效而失败;运行守护进程来填充丢失的文件。
Bootstrap 下载支持内置 direct、内联 TCP 代理链和池,以及具有内联、命名或文件支持 PEM 的正常出站 TLS 设置。其 bootstrap_url 必须是 system 或文字 IP udp://、tcp://、tls:// 或 https:// DNS URL。目标和代理主机名使用该解析器。每个池成员都必须得到支持。引导程序不支持用户定义的命名客户端组(包括普通循环组)、选择器、URL 测试组、命名 DNS 组、WireGuard、QUIC 代理传输和 H3 DNS。名为 system 的 DNS 组仍然是命名组,而不是内置解析器。没有失败或不受支持的路由回退到直接 TCP 或系统 DNS。文字引导 DNS URL 保留其现有的直接路由语义; OS VPN/TUN 路由仍然适用。
每当在启动或重新加载期间必须下载源时,这些限制都适用,包括冷启动时的每个仅内存源。通过可用的缓存或保留的内存源,准备接受正常的刷新路由,包括动态客户端和命名的 DNS 组。在外部填充此类缓存,或在切换到依赖于运行时的路由之前使用受支持的路由进行引导。 Bootstrap 不得依赖于该实例自己的监听器;间接依赖项可能会在下载截止日期时失败。候选和保留的 Fake-IP 范围仍被排除在下载目标、代理跃点和引导 DNS 之外。
配置后,启动会创建最终的缓存目录(如果丢失),然后获取其租约。父目录必须已经存在。创建尊重进程 umask 并且从不修复权限。如果缺少所有者访问权限,请在开始之前使用 install -d -m 700 cache 创建目录。重新加载会重用租约,并且不会重新创建已删除的根。
声明和所有必需的引导路由在获取之前都会进行预检。源文件被串行下载和解码器验证,保留在内存中,并且可以选择保存到磁盘,然后正常编译完整的配置。启动失败,服务前退出;失败的重新加载会保留活动的一代。如果以后的下载、配置检查或激活失败,则先前完成的保存仍会保留。这是针对每个文件的修复,而不是多文件磁盘事务或激活承诺。
该过程连续刷新到期源,具有 10% 的抖动和上限的指数故障退避。在替换保留规则之前,下载的源会通过 shoes 的实际解码器、编译预算和针对活动配置快照的验证。持久性和非持久性源使用相同的验证路径。初始到期时间基于恢复的缓存的 mtime 或初始下载时间;未来的时间被视为到期。成功的检查时间仅记录在内存中。冷启动时,显式缓存路径不会记录它来自的 URL;如果需要立即替换,则在进程生命周期之间更改 URL 时使用新的缓存名称。下载或验证失败会保留最后的规则和缓存。相同的下载重用已编译的规则并且不重新加载;相同的缓存字节保留 inode/mtime。每个文件替换都是原子的,而不是多文件事务。重命名后目录同步失败会报告不确定的持久性,但不会拒绝更新。新流程使用重新加载的规则;现有流保留其先前的配置。重新加载/删除/关闭会取消正在进行的刷新。 --no-reload 禁用文件系统触发的重新加载,未配置远程刷新。托管缓存被排除在通用文件系统监视之外。自动更改的源请求立即重新加载;外部缓存编辑仅在重新启动后读取,而不是在 SIGHUP 时读取。使用本地文件源进行外部管理的实时规则更新。重新加载会读取配置文件,包括任何不相关的编辑。如果激活失败,经过验证的替换仍保留在内存中,而旧规则保持活动状态。明确更正配置并重新加载;稍后的字节相同提取不会重试激活。原子安装不提供磁盘/激活或断电事务。批量文件读取、写入和同步由转发执行器运行。已提交的文件系统工作可能会在取消后完成,并保持其更新锁直到清理;它无法发布废弃的预重命名更新。最终所有权检查和原子重命名仍然是一个同步发布步骤。
HTTPS 验证证书。显式 http:// URL 允许明文。重定向、URL 凭据/片段、HTTP 内容压缩和预告片被拒绝。分块和封闭分隔的正文在相同的限制内被接受:64 MiB 下载、64 个标头/32 KiB、10 秒连接/DNS/TLS 和标头/正文空闲截止时间,以及 120 秒的总下载截止时间。解码器特定的解压缩限制仍然适用。截断的封闭分隔的明文响应可能与较短的有效规则列表无法区分;更喜欢HTTPS。日志报告实际更新/未更改/失败的结果,没有 URL 查询值或下载的数据。
远程刷新当前需要 Unix 进程运行时。 FFI 启动和 WireGuard 相关的下载/引导路由明确拒绝它。它不添加代理订阅、动态提供程序组或提供程序 API 端点。