['level' => 'warn'], 'dns' => ['servers' => [['type' => 'local', 'tag' => 'local']], 'final' => 'local'], 'inbounds' => [ ['type' => 'tun', 'tag' => 'tun-in', 'address' => ['172.19.0.1/30'], 'auto_route' => true, 'strict_route' => true], ['type' => 'mixed', 'tag' => 'mixed-in', 'listen' => '127.0.0.1', 'listen_port' => 7891], ], 'outbounds' => array_merge([ ['type' => 'selector', 'tag' => 'proxy', 'outbounds' => $tags ?: ['direct']], ['type' => 'direct', 'tag' => 'direct'], ], array_values($nodes)), 'route' => ['rules' => [ ['action' => 'sniff'], ['protocol' => 'dns', 'action' => 'hijack-dns'], ['ip_is_private' => true, 'action' => 'route', 'outbound' => 'direct'], ['rule_set' => ['geoip-cn', 'geosite-cn'], 'action' => 'route', 'outbound' => 'direct'], ], 'rule_set' => [ ['tag' => 'geoip-cn', 'type' => 'remote', 'format' => 'binary', 'url' => 'https://fastly.jsdelivr.net/gh/SagerNet/sing-geoip@rule-set/geoip-cn.srs', 'download_detour' => 'direct'], ['tag' => 'geosite-cn', 'type' => 'remote', 'format' => 'binary', 'url' => 'https://fastly.jsdelivr.net/gh/SagerNet/sing-geosite@rule-set/geosite-cn.srs', 'download_detour' => 'direct'], ], 'final' => 'proxy', 'default_domain_resolver' => 'local', 'auto_detect_interface' => true], ]; return json_encode($config, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR); } public static function clash(array $nodes, ?array $template = null): string { if ($template !== null) { $template['proxies'] = array_values($nodes); $names = array_column($nodes, 'name'); foreach ($template['proxy-groups'] as &$group) { if (!in_array($group['name'], ['πŸƒ εΊ”η”¨ε‡€εŒ–', 'πŸ›‘ 全球拦ζˆͺ', '🎯 ε…¨ηƒη›΄θΏž'], true)) { $group['proxies'] = array_values(array_unique(array_merge($group['proxies'] ?? [], $names))); if (!$group['proxies']) $group['proxies'] = ['DIRECT']; } } unset($group); return Yaml::dump($template, 12, 2, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE); } return Yaml::dump([ 'mixed-port' => 7890, 'allow-lan' => false, 'mode' => 'rule', 'log-level' => 'warning', 'proxies' => array_values($nodes), 'proxy-groups' => [['name' => 'PROXY', 'type' => 'select', 'proxies' => array_column($nodes, 'name') ?: ['DIRECT']]], 'rules' => ['IP-CIDR,10.0.0.0/8,DIRECT,no-resolve', 'IP-CIDR,172.16.0.0/12,DIRECT,no-resolve', 'IP-CIDR,192.168.0.0/16,DIRECT,no-resolve', 'MATCH,PROXY'], ], 12, 2, Yaml::DUMP_EMPTY_ARRAY_AS_SEQUENCE); } }