diff --git a/app/bot.php b/app/bot.php index 6ca9304..d05a563 100644 --- a/app/bot.php +++ b/app/bot.php @@ -3467,17 +3467,6 @@ DNS-over-HTTPS with IP: $c = $this->getXray(); $text[] = "Menu -> " . $this->i18n('xray'); $text[] = "fake domain: {$c['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0]}"; - - $data[] = [ - [ - 'text' => 'android', - 'web_app' => ['url' => 'https://github.com/2dust/v2rayNG/releases'], - ], - [ - 'text' => 'windows', - 'web_app' => ['url' => 'https://github.com/2dust/v2rayN/releases'], - ], - ]; $data[] = [ [ 'text' => $this->i18n('changeFakeDomain'), @@ -3518,16 +3507,19 @@ DNS-over-HTTPS with IP: public function userXr($i) { - $c = $this->getXray(); - $domain = $this->getPacConf()['domain'] ?: $this->ip; - $scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https'; - $hash = substr(md5($this->key), 0, 8); - $link = "$scheme://{$domain}/pac?h=$hash&t=s&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}"; + $c = $this->getXray(); + $domain = $this->getPacConf()['domain'] ?: $this->ip; + $scheme = empty($this->nginxGetTypeCert()) ? 'http' : 'https'; + $hash = substr(md5($this->key), 0, 8); + $v2ray = "$scheme://{$domain}/pac?h=$hash&t=s&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}"; + $sing = "$scheme://{$domain}/pac?h=$hash&t=si&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}"; + $fullsing = 'sing-box://import-remote-profile/?url=' . urlencode("$scheme://{$domain}/pac?h=$hash&t=si&s={$c['inbounds'][0]['settings']['clients'][$i]['id']}") . "#vpnbot$i"; $text[] = "Menu -> " . $this->i18n('xray') . " -> {$c['inbounds'][0]['settings']['clients'][$i]['email']}\n"; $text[] = "{$this->linkXray($i)}\n"; - $text[] = "v2ray subscription: $link"; + $text[] = "v2ray subscription: $v2ray"; + $text[] = "sing-box subscription: $sing"; $data[] = [ [ @@ -3563,9 +3555,9 @@ DNS-over-HTTPS with IP: public function v2raySubscription($key) { - $domain = $this->getPacConf()['domain'] ?: $this->ip; - $xr = $this->getXray(); $pac = $this->getPacConf(); + $domain = $pac['domain'] ?: $this->ip; + $xr = $this->getXray(); $flag = true; foreach ($xr['inbounds'][0]['settings']['clients'] as $k => $v) { @@ -3646,7 +3638,7 @@ DNS-over-HTTPS with IP: "network" => "tcp", "security" => "reality", "realitySettings" => [ - "serverName" => $domain, + "serverName" => $xr['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0], "fingerprint" => "chrome", "show" => false, "publicKey" => $pac['xray'], @@ -3692,6 +3684,145 @@ DNS-over-HTTPS with IP: echo json_encode($c); } + public function singboxSubscription($key) + { + $pac = $this->getPacConf(); + $domain = $pac['domain'] ?: $this->ip; + $xr = $this->getXray(); + + $flag = true; + foreach ($xr['inbounds'][0]['settings']['clients'] as $k => $v) { + if ($v['id'] == $key) { + $flag = false; + break; + } + } + if ($flag) { + return; + } + + $c = [ + "log" => [ + "level" => "error", + "timestamp" => true + ], + "inbounds" => [[ + "type" => "tun", + "tag" => "tun-in", + "domain_strategy" => "prefer_ipv4", + "interface_name" => "sing-tun", + "inet4_address" => "172.19.0.1/30", + "mtu" => 1400, + "gso" => true, + "auto_route" => true, + "strict_route" => true, + "sniff" => true, + "endpoint_independent_nat" => false, + "stack" => "mixed", + "platform" => [ + "http_proxy" => [ + "enabled" => false, + "server" => "127.0.0.1", + "server_port" => 2080 + ] + ] + ], + [ + "type" => "mixed", + "tag" => "mixed-in", + "domain_strategy" => "prefer_ipv4", + "listen" => "127.0.0.1", + "listen_port" => 2080, + "tcp_fast_open" => true, + "sniff" => true, + "sniff_override_destination" => false, + "users" => [] + ] + ], + "dns" => [ + "servers" => [[ + "tag" => "dns_direct", + "address" => "tls://" . ($pac['adguardkey'] ? "{$pac['adguardkey']}." : '') . "$domain", + "address_resolver" => "dns-remote", + "strategy" => "prefer_ipv4", + "detour" => "direct" + ], + [ + "tag" => "dns-remote", + "address" => "tcp://8.8.8.8", + "address_strategy" => "prefer_ipv4", + "strategy" => "prefer_ipv4", + "detour" => "direct" + ] + ], + "rules" => [[ + "outbound" => "any", + "server" => "dns-direct", + "disable_cache" => false + ]], + "strategy" => "ipv4_only", + "independent_cache" => true + ], + "outbounds" => [[ + "flow" => "xtls-rprx-vision", + "packet_encoding" => "", + "server" => $domain, + "server_port" => 443, + "tls" => [ + "enabled" => true, + "insecure" => false, + "reality" => [ + "enabled" => true, + "public_key" => $pac['xray'], + "short_id" => $xr['inbounds'][0]['streamSettings']['realitySettings']['shortIds'][0], + ], + "server_name" => $xr['inbounds'][0]['streamSettings']['realitySettings']['serverNames'][0], + "utls" => [ + "enabled" => true, + "fingerprint" => "chrome" + ] + ], + "uuid" => $key, + "type" => "vless", + "domain_strategy" => "ipv4_only", + "tag" => "proxy" + ], + [ + "type" => "direct", + "tag" => "direct" + ], + [ + "type" => "block", + "tag" => "block" + ], + [ + "type" => "dns", + "tag" => "dns-out" + ] + ], + "route" => [ + "auto_detect_interface" => true, + "override_android_vpn" => true, + "rules" => [[ + "protocol" => "dns", + "outbound" => "dns-out" + ], + [ + "domain" => array_keys(array_filter($pac['includelist'])), + "outbound" => "proxy" + ], + [ + "ip_cidr" => [ + "0.0.0.0/0" + ], + "outbound" => "direct" + ] + ] + ] + ]; + echo json_encode($c); + } + public function getXray() { return json_decode(file_get_contents('/config/xray.json'), true); diff --git a/app/index.php b/app/index.php index 911f6d1..a6ff686 100644 --- a/app/index.php +++ b/app/index.php @@ -37,6 +37,13 @@ if ($hash == substr(md5($c['key']), 0, 8)) { $bot->v2raySubscription($_GET['s']); exit; + case 'si': + require __DIR__ . '/bot.php'; + require __DIR__ . '/i18n.php'; + $bot = new Bot($c['key'], $i); + $bot->singboxSubscription($_GET['s']); + exit; + default: if (file_exists($file = __DIR__ . "/zapretlists/$type")) { $pac = file_get_contents($file); diff --git a/version b/version index 1fee6b7..8fbec67 100644 --- a/version +++ b/version @@ -1,3 +1,5 @@ +08.04.2024 v1.15 +- подписка с маршрутизацией для singbox 07.04.2024 v1.14 - раздельные пользователи для XTLS-Reality - подписка с маршрутизацией для v2rayN/nginx