完善Singbox订阅,修复一些订阅下发的BUG

This commit is contained in:
wyx2685 2023-11-02 13:18:42 +09:00
parent a961bfff53
commit b84b5f67b8
No known key found for this signature in database
GPG Key ID: 8827A30FF1DB1379
11 changed files with 461 additions and 147 deletions

View File

@ -130,7 +130,7 @@ class Clash
if ($server['network'] === 'tcp') { if ($server['network'] === 'tcp') {
$tcpSettings = $server['networkSettings']; $tcpSettings = $server['networkSettings'];
if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'];
} }
if ($server['network'] === 'ws') { if ($server['network'] === 'ws') {
$array['network'] = 'ws'; $array['network'] = 'ws';
@ -141,10 +141,6 @@ class Clash
$array['ws-opts']['path'] = $wsSettings['path']; $array['ws-opts']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']];
if (isset($wsSettings['path']) && !empty($wsSettings['path']))
$array['ws-path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']];
} }
} }
if ($server['network'] === 'grpc') { if ($server['network'] === 'grpc') {
@ -226,6 +222,22 @@ class Clash
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['password'] = $password; $array['password'] = $password;
$array['udp'] = true; $array['udp'] = true;
if(in_array($server['network'], ["grpc", "ws"])){
$array['network'] = $server['network'];
// grpc配置
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName'];
}
// ws配置
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$array['ws-opts']['path'] = $server['networkSettings']['path'];
}
if(isset($server['networkSettings']['headers']['Host'])){
$array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host'];
}
}
};
if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['server_name'])) $array['sni'] = $server['server_name'];
if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false);
return $array; return $array;

View File

@ -104,7 +104,7 @@ class ClashMeta
$password = "{$serverKey}:{$userKey}"; $password = "{$serverKey}:{$userKey}";
} }
$array = []; $array = [];
$array['name'] = $server['name']; $array['name'] = rawurlencode($server['name']);
$array['type'] = 'ss'; $array['type'] = 'ss';
$array['server'] = $server['host']; $array['server'] = $server['host'];
$array['port'] = $server['port']; $array['port'] = $server['port'];
@ -139,7 +139,7 @@ class ClashMeta
if ($server['network'] === 'tcp') { if ($server['network'] === 'tcp') {
$tcpSettings = $server['networkSettings']; $tcpSettings = $server['networkSettings'];
if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'];
} }
if ($server['network'] === 'ws') { if ($server['network'] === 'ws') {
$array['network'] = 'ws'; $array['network'] = 'ws';
@ -150,10 +150,6 @@ class ClashMeta
$array['ws-opts']['path'] = $wsSettings['path']; $array['ws-opts']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']];
if (isset($wsSettings['path']) && !empty($wsSettings['path']))
$array['ws-path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']];
} }
} }
if ($server['network'] === 'grpc') { if ($server['network'] === 'grpc') {
@ -176,12 +172,13 @@ class ClashMeta
$array['server'] = $server['host']; $array['server'] = $server['host'];
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['uuid'] = $uuid; $array['uuid'] = $uuid;
$array['flow'] = !empty($server['flow']) ? $server['flow']: "";
$array['client-fingerprint'] = 'chrome';
$array['udp'] = true; $array['udp'] = true;
if ($server['tls']) { if ($server['tls']) {
$array['tls'] = true; $array['tls'] = true;
$array['skip-cert-verify'] = isset($server['tls_settings']['allow_insecure']) && $server['tls_settings']['allow_insecure'] == 1 ? true : false;
$array['flow'] = !empty($server['flow']) ? $server['flow']: "";
$array['client-fingerprint'] = !empty($server['fingerprint']) ? $server['fingerprint'] : 'chrome';
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name']))
@ -196,6 +193,8 @@ class ClashMeta
if ($server['network'] === 'tcp') { if ($server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['network'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'];
} }
if ($server['network'] === 'ws') { if ($server['network'] === 'ws') {
@ -207,10 +206,6 @@ class ClashMeta
$array['ws-opts']['path'] = $wsSettings['path']; $array['ws-opts']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']];
if (isset($wsSettings['path']) && !empty($wsSettings['path']))
$array['ws-path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']];
} }
} }
if ($server['network'] === 'grpc') { if ($server['network'] === 'grpc') {
@ -243,6 +238,22 @@ class ClashMeta
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['password'] = $password; $array['password'] = $password;
$array['udp'] = true; $array['udp'] = true;
if(in_array($server['network'], ["grpc", "ws"])){
$array['network'] = $server['network'];
// grpc配置
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName'];
}
// ws配置
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$array['ws-opts']['path'] = $server['networkSettings']['path'];
}
if(isset($server['networkSettings']['headers']['Host'])){
$array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host'];
}
}
};
if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['server_name'])) $array['sni'] = $server['server_name'];
if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false);
return $array; return $array;
@ -255,6 +266,7 @@ class ClashMeta
$array['server'] = $server['host']; $array['server'] = $server['host'];
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['udp'] = true; $array['udp'] = true;
$array['skip-cert-verify'] = $server['insecure'] == 1 ? true : false;
if (isset($server['server_name'])) $array['sni'] = $server['server_name']; if (isset($server['server_name'])) $array['sni'] = $server['server_name'];
@ -272,8 +284,8 @@ class ClashMeta
$array['obfs'] = $server['obfs_password']; $array['obfs'] = $server['obfs_password'];
} }
//Todo:完善客户端上下行 //Todo:完善客户端上下行
$array['up'] = $server['up_mbps']; $array['up'] = $server['down_mbps'];
$array['down'] = $server['down_mbps']; $array['down'] = $server['up_mbps'];
$array['protocol'] = 'udp'; $array['protocol'] = 'udp';
} }

View File

@ -139,7 +139,7 @@ class ClashVerge
if ($server['network'] === 'tcp') { if ($server['network'] === 'tcp') {
$tcpSettings = $server['networkSettings']; $tcpSettings = $server['networkSettings'];
if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $array['network'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'][0])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'][0]; if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'];
} }
if ($server['network'] === 'ws') { if ($server['network'] === 'ws') {
$array['network'] = 'ws'; $array['network'] = 'ws';
@ -150,10 +150,7 @@ class ClashVerge
$array['ws-opts']['path'] = $wsSettings['path']; $array['ws-opts']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']];
if (isset($wsSettings['path']) && !empty($wsSettings['path']))
$array['ws-path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']];
} }
} }
if ($server['network'] === 'grpc') { if ($server['network'] === 'grpc') {
@ -176,12 +173,13 @@ class ClashVerge
$array['server'] = $server['host']; $array['server'] = $server['host'];
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['uuid'] = $uuid; $array['uuid'] = $uuid;
$array['flow'] = !empty($server['flow']) ? $server['flow']: "";
$array['client-fingerprint'] = 'chrome';
$array['udp'] = true; $array['udp'] = true;
if ($server['tls']) { if ($server['tls']) {
$array['tls'] = true; $array['tls'] = true;
$array['skip-cert-verify'] = isset($server['tls_settings']['allow_insecure']) && $server['tls_settings']['allow_insecure'] == 1 ? true : false;
$array['flow'] = !empty($server['flow']) ? $server['flow']: "";
$array['client-fingerprint'] = !empty($server['fingerprint']) ? $server['fingerprint'] : 'chrome';
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name']))
@ -196,6 +194,8 @@ class ClashVerge
if ($server['network'] === 'tcp') { if ($server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['network'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'])) $array['http-opts']['path'] = $tcpSettings['header']['request']['path'];
} }
if ($server['network'] === 'ws') { if ($server['network'] === 'ws') {
@ -207,10 +207,6 @@ class ClashVerge
$array['ws-opts']['path'] = $wsSettings['path']; $array['ws-opts']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']]; $array['ws-opts']['headers'] = ['Host' => $wsSettings['headers']['Host']];
if (isset($wsSettings['path']) && !empty($wsSettings['path']))
$array['ws-path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host']))
$array['ws-headers'] = ['Host' => $wsSettings['headers']['Host']];
} }
} }
if ($server['network'] === 'grpc') { if ($server['network'] === 'grpc') {
@ -242,6 +238,22 @@ class ClashVerge
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['password'] = $password; $array['password'] = $password;
$array['udp'] = true; $array['udp'] = true;
if(in_array($server['network'], ["grpc", "ws"])){
$array['network'] = $server['network'];
// grpc配置
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$array['grpc-opts']['grpc-service-name'] = $server['networkSettings']['serviceName'];
}
// ws配置
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$array['ws-opts']['path'] = $server['networkSettings']['path'];
}
if(isset($server['networkSettings']['headers']['Host'])){
$array['ws-opts']['headers']['Host'] = $server['networkSettings']['headers']['Host'];
}
}
};
if (!empty($server['server_name'])) $array['sni'] = $server['server_name']; if (!empty($server['server_name'])) $array['sni'] = $server['server_name'];
if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false); if (!empty($server['allow_insecure'])) $array['skip-cert-verify'] = ($server['allow_insecure'] ? true : false);
return $array; return $array;
@ -254,7 +266,8 @@ class ClashVerge
$array['server'] = $server['host']; $array['server'] = $server['host'];
$array['port'] = $server['port']; $array['port'] = $server['port'];
$array['udp'] = true; $array['udp'] = true;
$array['skip-cert-verify'] = $server['insecure'] == 1 ? true : false;
if (isset($server['server_name'])) $array['sni'] = $server['server_name']; if (isset($server['server_name'])) $array['sni'] = $server['server_name'];
if ($server['version'] === 2) { if ($server['version'] === 2) {
@ -271,8 +284,8 @@ class ClashVerge
$array['obfs'] = $server['obfs_password']; $array['obfs'] = $server['obfs_password'];
} }
//Todo:完善客户端上下行 //Todo:完善客户端上下行
$array['up'] = $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps']; $array['up'] = $server['down_mbps'];
$array['down'] = $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps']; $array['down'] = $server['up_mbps'];
$array['protocol'] = 'udp'; $array['protocol'] = 'udp';
} }

View File

@ -119,6 +119,7 @@ class General
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -128,7 +129,7 @@ class General
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -143,7 +144,8 @@ class General
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
@ -180,7 +182,8 @@ class General
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -193,8 +196,23 @@ class General
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }
@ -215,7 +233,7 @@ class General
'auth' => $password, 'auth' => $password,
'insecure' => $server['insecure'], 'insecure' => $server['insecure'],
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'upmbps' => $server['up_mbps'], 'upmbps' => $server['down_mbps'],
'downmbps' => $server['up_mbps'] 'downmbps' => $server['up_mbps']
]); ]);
$uri .= $query; $uri .= $query;

View File

@ -41,6 +41,16 @@ class Passwall
public static function buildShadowsocks($password, $server) public static function buildShadowsocks($password, $server)
{ {
if ($server['cipher'] === '2022-blake3-aes-128-gcm') {
$serverKey = Helper::getServerKey($server['created_at'], 16);
$userKey = Helper::uuidToBase64($password, 16);
$password = "{$serverKey}:{$userKey}";
}
if ($server['cipher'] === '2022-blake3-aes-256-gcm') {
$serverKey = Helper::getServerKey($server['created_at'], 32);
$userKey = Helper::uuidToBase64($password, 32);
$password = "{$serverKey}:{$userKey}";
}
$name = rawurlencode($server['name']); $name = rawurlencode($server['name']);
$str = str_replace( $str = str_replace(
['+', '/', '='], ['+', '/', '='],
@ -105,6 +115,7 @@ class Passwall
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -114,7 +125,7 @@ class Passwall
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -129,7 +140,8 @@ class Passwall
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
@ -166,7 +178,8 @@ class Passwall
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -179,8 +192,23 @@ class Passwall
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }

View File

@ -1,7 +1,7 @@
<?php <?php
namespace App\Protocols; namespace App\Protocols;
use App\Utils\Helper;
class SSRPlus class SSRPlus
{ {
@ -99,6 +99,7 @@ class SSRPlus
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -108,7 +109,7 @@ class SSRPlus
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -123,14 +124,15 @@ class SSRPlus
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type']; if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type'];
if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']); if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']);
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'ws') { if ((string)$server['network'] === 'ws') {
$wsSettings = $server['network_settings']; $wsSettings = $server['network_settings'];
if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']); if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']);
@ -147,11 +149,11 @@ class SSRPlus
$quicSettings = $server['network_settings']; $quicSettings = $server['network_settings'];
if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security']; if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security'];
if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type']; if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type'];
$output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}"; $output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}";
if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']); if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']);
$output .= "&key={$config['path']}"; $output .= "&key={$config['path']}";
} }
if ((string)$server['network'] === 'grpc') { if ((string)$server['network'] === 'grpc') {
@ -160,7 +162,8 @@ class SSRPlus
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -173,8 +176,23 @@ class SSRPlus
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }

View File

@ -40,30 +40,27 @@ class SagerNet
return base64_encode($uri); return base64_encode($uri);
} }
public static function buildShadowsocks($uuid, $server) public static function buildShadowsocks($password, $server)
{ {
if ($server['cipher'] === '2022-blake3-aes-128-gcm') {
$serverKey = Helper::getServerKey($server['created_at'], 16);
$userKey = Helper::uuidToBase64($password, 16);
$password = "{$serverKey}:{$userKey}";
}
if ($server['cipher'] === '2022-blake3-aes-256-gcm') {
$serverKey = Helper::getServerKey($server['created_at'], 32);
$userKey = Helper::uuidToBase64($password, 32);
$password = "{$serverKey}:{$userKey}";
}
$name = rawurlencode($server['name']); $name = rawurlencode($server['name']);
$str = str_replace( $str = str_replace(
['+', '/', '='], ['+', '/', '='],
['-', '_', ''], ['-', '_', ''],
base64_encode("{$server['cipher']}:{$uuid}") base64_encode("{$server['cipher']}:{$password}")
); );
return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n"; return "ss://{$str}@{$server['host']}:{$server['port']}#{$name}\r\n";
} }
public static function buildShadowsocksSIP008($uuid, $server)
{
$config = [
"id" => $server['id'],
"remarks" => $server['name'],
"server" => $server['host'],
"server_port" => $server['port'],
"password" => $uuid,
"method" => $server['cipher']
];
return $config;
}
public static function buildVmess($uuid, $server) public static function buildVmess($uuid, $server)
{ {
$config = [ $config = [
@ -111,6 +108,7 @@ class SagerNet
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -120,7 +118,7 @@ class SagerNet
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -135,7 +133,8 @@ class SagerNet
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
@ -172,12 +171,13 @@ class SagerNet
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
public static function buildTrojan($uuid, $server) public static function buildTrojan($password, $server)
{ {
$name = rawurlencode($server['name']); $name = rawurlencode($server['name']);
$query = http_build_query([ $query = http_build_query([
@ -185,8 +185,23 @@ class SagerNet
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$uuid}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }
} }

View File

@ -142,6 +142,7 @@ class Shadowrocket
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -151,7 +152,7 @@ class Shadowrocket
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -166,7 +167,8 @@ class Shadowrocket
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
@ -203,7 +205,8 @@ class Shadowrocket
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -213,10 +216,26 @@ class Shadowrocket
$name = rawurlencode($server['name']); $name = rawurlencode($server['name']);
$query = http_build_query([ $query = http_build_query([
'allowInsecure' => $server['allow_insecure'], 'allowInsecure' => $server['allow_insecure'],
'peer' => $server['server_name'] 'peer' => $server['server_name'],
'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}&tfo=1#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }
@ -237,7 +256,7 @@ class Shadowrocket
'auth' => $password, 'auth' => $password,
'insecure' => $server['insecure'], 'insecure' => $server['insecure'],
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'upmbps' => $server['up_mbps'], 'upmbps' => $server['down_mbps'],
'downmbps' => $server['up_mbps'] 'downmbps' => $server['up_mbps']
]); ]);
$uri .= $query; $uri .= $query;

View File

@ -3,6 +3,7 @@ namespace App\Protocols;
use App\Models\ServerHysteria; use App\Models\ServerHysteria;
use App\Models\User; use App\Models\User;
use App\Utils\Helper;
class SingBox class SingBox
{ {
@ -56,17 +57,35 @@ class SingBox
$outbounds[] = &$selector; $outbounds[] = &$selector;
foreach ($this->servers as $item) { foreach ($this->servers as $item) {
if ($item['type'] === 'shadowsocks') {
$ssConfig = $this->buildShadowsocks($this->user['uuid'], $item);
$outbounds[] = $ssConfig;
$selector['outbounds'][] = $item['name'];
$urltest['outbounds'][] = $item['name'];
}
if ($item['type'] === 'trojan') {
$trojanConfig = $this->buildTrojan($this->user['uuid'], $item);
$outbounds[] = $trojanConfig;
$selector['outbounds'][] = $item['name'];
$urltest['outbounds'][] = $item['name'];
}
if ($item['type'] === 'vmess') {
$vmessConfig = $this->buildVmess($this->user['uuid'], $item);
$outbounds[] = $vmessConfig;
$selector['outbounds'][] = $item['name'];
$urltest['outbounds'][] = $item['name'];
}
if ($item['type'] === 'vless') { if ($item['type'] === 'vless') {
$vlessConfig = $this->buildVless($this->user['uuid'], $item); $vlessConfig = $this->buildVless($this->user['uuid'], $item);
$outbounds[] = $vlessConfig; $outbounds[] = $vlessConfig;
$selector['outbounds'][] = $item['name']; $selector['outbounds'][] = $item['name'];
$urltest['outbounds'][] = $item['name']; $urltest['outbounds'][] = $item['name'];
} elseif ($item['type'] === 'hysteria') { }
if ($item['type'] === 'hysteria') {
$hysteriaConfig = $this->buildHysteria($this->user['uuid'], $item, $this->user); $hysteriaConfig = $this->buildHysteria($this->user['uuid'], $item, $this->user);
$outbounds[] = $hysteriaConfig; $outbounds[] = $hysteriaConfig;
$tag = $item['version'] == 2 ? "Hy2" : "Hy"; $selector['outbounds'][] = $item['name'];
$selector['outbounds'][] = "[$tag]{$item['name']}"; $urltest['outbounds'][] = $item['name'];
$urltest['outbounds'][] = "[$tag]{$item['name']}";
} }
} }
@ -78,58 +97,184 @@ class SingBox
return $outbounds; return $outbounds;
} }
/** protected function buildShadowsocks($password, $server)
* Vless订阅
*/
protected function buildVless($password, $server)
{ {
$tlsSettings = $server['tls_settings'] ?? []; if ($server['cipher'] === '2022-blake3-aes-128-gcm') {
$tlsConfig = []; $serverKey = Helper::getServerKey($server['created_at'], 16);
$userKey = Helper::uuidToBase64($password, 16);
$password = "{$serverKey}:{$userKey}";
}
if ($server['cipher'] === '2022-blake3-aes-256-gcm') {
$serverKey = Helper::getServerKey($server['created_at'], 32);
$userKey = Helper::uuidToBase64($password, 32);
$password = "{$serverKey}:{$userKey}";
}
$array = [];
$array['tag'] = $server['name'];
$array['type'] = 'shadowsocks';
$array['server'] = $server['host'];
$array['server_port'] = $server['port'];
$array['method'] = $server['cipher'];
$array['password'] = $password;
return $array;
}
protected function buildVmess($uuid, $server)
{
$array = [];
$array['tag'] = $server['name'];
$array['type'] = 'vmess';
$array['server'] = $server['host'];
$array['server_port'] = $server['port'];
$array['uuid'] = $uuid;
$array['security'] = 'auto';
$array['alterId'] = 0;
$array['transport']= [];
if ($server['tls']) { if ($server['tls']) {
$tlsConfig = [];
$tlsConfig['enabled'] = true; $tlsConfig['enabled'] = true;
if ($server['tlsSettings']) {
switch ($server['tls']) { $tlsSettings = $server['tlsSettings'] ?? [];
case 1: $tlsConfig['insecure'] = $tlsSettings['allowInsecure'] ? true : false;
$tlsConfig['insecure'] = (bool) ($tlsSettings['allowInsecure'] ?? false); $tlsConfig['server_name'] = $tlsSettings['serverName'] ?? null;
$tlsConfig['server_name'] = $tlsSettings['serverName'] ?? null; }
break; $array['tls'] = $tlsConfig;
}
case 2: if ($server['network'] === 'tcp') {
$tlsConfig['insecure'] = (bool) ($tlsSettings['allowInsecure'] ?? false); $tcpSettings = $server['networkSettings'];
$tlsConfig['server_name'] = $tlsSettings['server_name'] ?? null; if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['transport']['type'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'])) $array['transport']['path'] = $tcpSettings['header']['request']['path'];
if ( }
isset($tlsSettings['public_key'], $tlsSettings['short_id']) && if ($server['network'] === 'ws') {
!empty($tlsSettings['server_name']) $array['transport']['type'] ='ws';
) { if ($server['networkSettings']) {
$tlsConfig['reality'] = [ $wsSettings = $server['networkSettings'];
'enabled' => true, if (isset($wsSettings['path']) && !empty($wsSettings['path'])) $array['transport']['path'] = $wsSettings['path'];
'public_key' => $tlsSettings['public_key'], if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['transport']['headers'] = ['Host' => array($wsSettings['headers']['Host'])];
'short_id' => $tlsSettings['short_id'] $array['transport']['max_early_data'] = 2048;
]; $array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol';
}
$fingerprints = ['chrome', 'firefox', 'safari', 'ios', 'edge', 'qq']; }
$tlsConfig['utls'] = [ if ($server['network'] === 'grpc') {
"enabled" => true, $array['transport']['type'] ='grpc';
"fingerprint" => $fingerprints[array_rand($fingerprints)] if ($server['networkSettings']) {
]; $grpcSettings = $server['networkSettings'];
} if (isset($grpcSettings['serviceName'])) $array['transport']['service_name'] = $grpcSettings['serviceName'];
break;
} }
} }
return [ return $array;
}
protected function buildVless($password, $server)
{
$array = [
"type" => "vless", "type" => "vless",
"tag" => $server['name'], "tag" => $server['name'],
"server" => $server['host'], "server" => $server['host'],
"server_port" => $server['port'], "server_port" => $server['port'],
"uuid" => $password, "uuid" => $password,
"flow" => $server['flow'], "packet_encoding" => "xudp"
"packet_encoding" => "xudp",
"tls" => $tlsConfig
]; ];
$tlsSettings = $server['tls_settings'] ?? [];
if ($server['tls']) {
$tlsConfig = [];
$tlsConfig['enabled'] = true;
$array['flow'] = !empty($server['flow']) ? $server['flow'] : "";
$tlsSettings = $server['tls_settings'] ?? [];
if ($server['tls_settings']) {
$tlsConfig['insecure'] = isset($tlsSettings['allow_insecure']) && $tlsSettings['allow_insecure'] == 1 ? true : false;
$tlsConfig['server_name'] = $tlsSettings['server_name'] ?? null;
if ($server['tls'] == 2) {
$tlsConfig['reality'] = [
'enabled' => true,
'public_key' => $tlsSettings['public_key'],
'short_id' => $tlsSettings['short_id']
];
}
$fingerprints = ['chrome', 'firefox', 'safari', 'ios', 'edge', 'qq'];
$tlsConfig['utls'] = [
"enabled" => true,
"fingerprint" => $fingerprints[array_rand($fingerprints)]
];
}
$array['tls'] = $tlsConfig;
}
if ($server['network'] === 'tcp') {
$tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type']) && $tcpSettings['header']['type'] == 'http') $array['transport']['type'] = $tcpSettings['header']['type'];
if (isset($tcpSettings['header']['request']['path'])) $array['transport']['path'] = $tcpSettings['header']['request']['path'];
}
if ($server['network'] === 'ws') {
$array['transport']['type'] ='ws';
if ($server['network_settings']) {
$wsSettings = $server['network_settings'];
if (isset($wsSettings['path']) && !empty($wsSettings['path'])) $array['transport']['path'] = $wsSettings['path'];
if (isset($wsSettings['headers']['Host']) && !empty($wsSettings['headers']['Host'])) $array['transport']['headers'] = ['Host' => array($wsSettings['headers']['Host'])];
$array['transport']['max_early_data'] = 2048;
$array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol';
}
}
if ($server['network'] === 'grpc') {
$array['transport']['type'] ='grpc';
if ($server['network_settings']) {
$grpcSettings = $server['network_settings'];
if (isset($grpcSettings['serviceName'])) $array['transport']['service_name'] = $grpcSettings['serviceName'];
}
}
if ($server['network'] === 'h2') {
$array['transport']['type'] = 'http';
if ($server['network_settings']) {
$h2Settings = $server['network_settings'];
if (isset($h2Settings['host'])) $array['transport']['host'] = array($h2Settings['host']);
if (isset($h2Settings['path'])) $array['transport']['path'] = $h2Settings['path'];
}
}
return $array;
}
protected function buildTrojan($password, $server)
{
$array = [];
$array['tag'] = $server['name'];
$array['type'] = 'trojan';
$array['server'] = $server['host'];
$array['server_port'] = $server['port'];
$array['password'] = $password;
$array['tls'] = [
'enabled' => true,
'insecure' => $server['allow_insecure'] ? true : false,
'server_name' => $server['server_name']
];
if(in_array($server['network'], ["grpc", "ws"])){
$array['transport']['type'] = $server['network'];
// grpc配置
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$array['transport']['service_name'] = $server['networkSettings']['serviceName'];
}
// ws配置
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$array['transport']['path'] = $server['networkSettings']['path'];
}
if(isset($server['networkSettings']['headers']['Host'])){
$array['transport']['headers'] = ['Host' => array($server['networkSettings']['headers']['Host'])];
}
$array['transport']['max_early_data'] = 2048;
$array['transport']['early_data_header_name'] = 'Sec-WebSocket-Protocol';
}
};
return $array;
} }
protected function buildHysteria($password, $server, $user) protected function buildHysteria($password, $server, $user)
@ -137,8 +282,6 @@ class SingBox
$array = [ $array = [
'server' => $server['host'], 'server' => $server['host'],
'server_port' => $server['port'], 'server_port' => $server['port'],
//'up_mbps' => $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps'],
//'down_mbps' => $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps'],
'tls' => [ 'tls' => [
'enabled' => true, 'enabled' => true,
'insecure' => $server['insecure'] ? true : false, 'insecure' => $server['insecure'] ? true : false,
@ -148,19 +291,19 @@ class SingBox
if ($server['version'] == 1) { if ($server['version'] == 1) {
$array['auth_str'] = $password; $array['auth_str'] = $password;
$array['tag'] = "[Hy]" . $server['name']; $array['tag'] = $server['name'];
$array['type'] = 'hysteria'; $array['type'] = 'hysteria';
$array['up_mbps'] = $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps']; $array['up_mbps'] = $user->speed_limit ? min($server['down_mbps'], $user->speed_limit) : $server['down_mbps'];
$array['down_mbps'] = $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps']; $array['down_mbps'] = $user->speed_limit ? min($server['up_mbps'], $user->speed_limit) : $server['up_mbps'];
if ($server['is_obfs']) { if (isset($server['obfs']) && isset($server['obfs_password'])) {
$array['obfs'] = $server['server_key']; $array['obfs'] = $server['obfs_password'];
} }
$array['disable_mtu_discovery'] = true; $array['disable_mtu_discovery'] = true;
$array['tls']['alpn'] = [ServerHysteria::$alpnMap[$server['alpn']]];
} elseif ($server['version'] == 2) { } elseif ($server['version'] == 2) {
$array['password'] = $password; $array['password'] = $password;
$array['tag'] = "[Hy2]" . $server['name']; $array['tag'] = $server['name'];
$array['type'] = 'hysteria2'; $array['type'] = 'hysteria2';
$array['password'] = $password; $array['password'] = $password;

View File

@ -116,6 +116,7 @@ class V2rayN
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -125,7 +126,7 @@ class V2rayN
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -140,14 +141,15 @@ class V2rayN
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type']; if (isset($kcpSettings['header']['type'])) $config['headerType'] = $kcpSettings['header']['type'];
if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']); if (isset($kcpSettings['seed'])) $config['path'] = Helper::encodeURIComponent($kcpSettings['seed']);
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}"; $output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'ws') { if ((string)$server['network'] === 'ws') {
$wsSettings = $server['network_settings']; $wsSettings = $server['network_settings'];
if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']); if (isset($wsSettings['path'])) $config['path'] = Helper::encodeURIComponent($wsSettings['path']);
@ -164,11 +166,11 @@ class V2rayN
$quicSettings = $server['network_settings']; $quicSettings = $server['network_settings'];
if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security']; if (isset($quicSettings['security'])) $config['quicSecurity'] = $quicSettings['security'];
if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type']; if (isset($quicSettings['header']['type'])) $config['headerType'] = $quicSettings['header']['type'];
$output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}"; $output .= "&quicSecurity={$config['quicSecurity']}" . "&headerType={$config['headerType']}";
if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']); if ((string)$quicSettings['security'] !== 'none' && isset($quicSettings['key'])) $config['path'] = Helper::encodeURIComponent($quicSettings['key']);
$output .= "&key={$config['path']}"; $output .= "&key={$config['path']}";
} }
if ((string)$server['network'] === 'grpc') { if ((string)$server['network'] === 'grpc') {
@ -177,7 +179,8 @@ class V2rayN
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -190,8 +193,23 @@ class V2rayN
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }

View File

@ -115,6 +115,7 @@ class V2rayNG
"mode" => "gun", "mode" => "gun",
"security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "", "security" => $server['tls'] !=0 ? ($server['tls'] == 2 ? "reality":"tls") : "",
"flow" => $server['flow'], "flow" => $server['flow'],
"fp" => isset($server['fingerprint']) ? $server['fingerprint'] : 'chrome',
"sni" => "", "sni" => "",
"pbk" => "", "pbk" => "",
"sid" =>"", "sid" =>"",
@ -124,7 +125,7 @@ class V2rayNG
$output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}"; $output .= "?" . "type={$config['type']}" . "&encryption={$config['encryption']}" . "&security={$config['security']}";
if ($server['tls']) { if ($server['tls']) {
if ($config['flow'] !="") $output .= "&flow={$config['flow']}"; if ($config['flow'] != "") $output .= "&flow={$config['flow']}";
if ($server['tls_settings']) { if ($server['tls_settings']) {
$tlsSettings = $server['tls_settings']; $tlsSettings = $server['tls_settings'];
if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name']; if (isset($tlsSettings['server_name']) && !empty($tlsSettings['server_name'])) $config['sni'] = $tlsSettings['server_name'];
@ -139,7 +140,8 @@ class V2rayNG
if ((string)$server['network'] === 'tcp') { if ((string)$server['network'] === 'tcp') {
$tcpSettings = $server['network_settings']; $tcpSettings = $server['network_settings'];
if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type']; if (isset($tcpSettings['header']['type'])) $config['headerType'] = $tcpSettings['header']['type'];
$output .= "&headerType={$config['headerType']}"; if (isset($tcpSettings['header']['request']['path'])) $config['path'] = $tcpSettings['header']['request']['path'];
$output .= "&headerType={$config['headerType']}" . "&seed={$config['path']}";
} }
if ((string)$server['network'] === 'kcp') { if ((string)$server['network'] === 'kcp') {
$kcpSettings = $server['network_settings']; $kcpSettings = $server['network_settings'];
@ -176,7 +178,8 @@ class V2rayNG
if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun"; if (isset($grpcSettings['multiMode'])) $config['mode'] = $grpcSettings['multiMode'] ? "multi" : "gun";
$output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}"; $output .= "&serviceName={$config['serviceName']}" . "&mode={$config['mode']}";
} }
$output .= "&fp=chrome" . "#" . $config['name'];
$output .= "&fp={$config['fp']}" . "#" . $config['name'];
return $output . "\r\n"; return $output . "\r\n";
} }
@ -189,8 +192,23 @@ class V2rayNG
'peer' => $server['server_name'], 'peer' => $server['server_name'],
'sni' => $server['server_name'] 'sni' => $server['server_name']
]); ]);
$uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}#{$name}"; $uri = "trojan://{$password}@{$server['host']}:{$server['port']}?{$query}";
$uri .= "\r\n"; if(in_array($server['network'], ["grpc", "ws"])){
$uri .= "&type={$server['network']}";
if($server['network'] === "grpc" && isset($server['networkSettings']['serviceName'])) {
$uri .= "&path={$server['networkSettings']['serviceName']}";
}
if($server['network'] === "ws") {
if(isset($server['networkSettings']['path'])) {
$uri .= "&path={$server['networkSettings']['path']}";
}
if(isset($server['networkSettings']['headers']['Host'])) {
$uri .= "&host={$server['networkSettings']['headers']['Host']}";
}
}
}
$uri .= "#{$name}\r\n";
return $uri; return $uri;
} }
} }