11import { connect } from "cloudflare:sockets" ;
22let config_JSON , 反代IP = '' , 启用SOCKS5反代 = null , 启用SOCKS5全局反代 = false , 我的SOCKS5账号 = '' , parsedSocks5Address = { } ;
3- let 缓存反代IP , 缓存反代解析数组 , 缓存反代数组索引 = 0 ;
3+ let 缓存反代IP , 缓存反代解析数组 , 缓存反代数组索引 = 0 , 启用反代兜底 = true ;
44let SOCKS5白名单 = [ '*tapecontent.net' , '*cloudatacdn.com' , '*loadshare.org' , '*cdn-centaurus.com' , 'scholar.google.com' ] ;
55const Pages静态页面 = 'https://edt-pages.github.io' ;
66///////////////////////////////////////////////////////主程序入口///////////////////////////////////////////////
@@ -20,6 +20,7 @@ export default {
2020 if ( env . PROXYIP ) {
2121 const proxyIPs = await 整理成数组 ( env . PROXYIP ) ;
2222 反代IP = proxyIPs [ Math . floor ( Math . random ( ) * proxyIPs . length ) ] ;
23+ 启用反代兜底 = false ;
2324 } else 反代IP = ( request . cf . colo + '.PrOxYIp.CmLiUsSsS.nEt' ) . toLowerCase ( ) ;
2425 const 访问IP = request . headers . get ( 'X-Real-IP' ) || request . headers . get ( 'CF-Connecting-IP' ) || request . headers . get ( 'X-Forwarded-For' ) || request . headers . get ( 'True-Client-IP' ) || request . headers . get ( 'Fly-Client-IP' ) || request . headers . get ( 'X-Appengine-Remote-Addr' ) || request . headers . get ( 'X-Forwarded-For' ) || request . headers . get ( 'X-Real-IP' ) || request . headers . get ( 'X-Cluster-Client-IP' ) || request . cf ?. clientTcpRtt || '未知IP' ;
2526 if ( env . GO2SOCKS5 ) SOCKS5白名单 = await 整理成数组 ( env . GO2SOCKS5 ) ;
@@ -238,8 +239,12 @@ export default {
238239 const 优选API = [ ] , 优选IP = [ ] , 其他节点 = [ ] ;
239240 for ( const 元素 of 完整优选列表 ) {
240241 if ( 元素 . toLowerCase ( ) . startsWith ( 'https://' ) ) 优选API . push ( 元素 ) ;
241- else if ( 元素 . toLowerCase ( ) . includes ( '://' ) ) 其他节点 . push ( 元素 ) ;
242- else 优选IP . push ( 元素 ) ;
242+ else if ( 元素 . toLowerCase ( ) . includes ( '://' ) ) {
243+ if ( 元素 . includes ( '#' ) ) {
244+ const 地址备注分离 = 元素 . split ( '#' ) ;
245+ 其他节点 . push ( 地址备注分离 [ 0 ] + '#' + encodeURIComponent ( decodeURIComponent ( 地址备注分离 [ 1 ] ) ) ) ;
246+ } else 其他节点 . push ( 元素 ) ;
247+ } else 优选IP . push ( 元素 ) ;
243248 }
244249 其他节点LINK = 其他节点 . join ( '\n' ) + '\n' ;
245250 const 优选API的IP = await 请求优选API ( 优选API ) ;
@@ -383,7 +388,7 @@ async function 处理WS请求(request, yourUUID) {
383388 if ( 判断是否是木马 ) {
384389 const { port, hostname, rawClientData } = 解析木马请求 ( chunk , yourUUID ) ;
385390 if ( isSpeedTestSite ( hostname ) ) throw new Error ( 'Speedtest site is blocked' ) ;
386- await forwardataTCP ( hostname , port , rawClientData , serverSock , null , remoteConnWrapper ) ;
391+ await forwardataTCP ( hostname , port , rawClientData , serverSock , null , remoteConnWrapper , yourUUID ) ;
387392 } else {
388393 const { port, hostname, rawIndex, version, isUDP } = 解析魏烈思请求 ( chunk , yourUUID ) ;
389394 if ( isSpeedTestSite ( hostname ) ) throw new Error ( 'Speedtest site is blocked' ) ;
@@ -394,7 +399,7 @@ async function 处理WS请求(request, yourUUID) {
394399 const respHeader = new Uint8Array ( [ version [ 0 ] , 0 ] ) ;
395400 const rawData = chunk . slice ( rawIndex ) ;
396401 if ( isDnsQuery ) return forwardataudp ( rawData , serverSock , respHeader ) ;
397- await forwardataTCP ( hostname , port , rawData , serverSock , respHeader , remoteConnWrapper ) ;
402+ await forwardataTCP ( hostname , port , rawData , serverSock , respHeader , remoteConnWrapper , yourUUID ) ;
398403 }
399404 } ,
400405 } ) ) . catch ( ( err ) => {
@@ -498,16 +503,17 @@ function 解析魏烈思请求(chunk, token) {
498503 if ( ! hostname ) return { hasError : true , message : `Invalid address: ${ addressType } ` } ;
499504 return { hasError : false , addressType, port, hostname, isUDP, rawIndex : addrValIdx + addrLen , version } ;
500505}
501- async function forwardataTCP ( host , portNum , rawData , ws , respHeader , remoteConnWrapper ) {
502- console . log ( `[TCP转发] 目标: ${ host } :${ portNum } | 反代IP: ${ 反代IP } | 反代类型: ${ 启用SOCKS5反代 || 'proxyip' } | 全局: ${ 启用SOCKS5全局反代 ? '是' : '否' } ` ) ;
503- async function connectDirect ( address , port , data , 所有反代数组 = null ) {
506+ async function forwardataTCP ( host , portNum , rawData , ws , respHeader , remoteConnWrapper , yourUUID ) {
507+ console . log ( `[TCP转发] 目标: ${ host } :${ portNum } | 反代IP: ${ 反代IP } | 反代兜底: ${ 启用反代兜底 ? '是' : '否' } | 反代类型: ${ 启用SOCKS5反代 || 'proxyip' } | 全局: ${ 启用SOCKS5全局反代 ? '是' : '否' } ` ) ;
508+
509+ async function connectDirect ( address , port , data , 所有反代数组 = null , 反代兜底 = true ) {
504510 let remoteSock ;
505511 if ( 所有反代数组 && 所有反代数组 . length > 0 ) {
506- const 最大尝试次数 = 缓存反代数组索引 + Math . min ( 8 , 所有反代数组 . length ) ;
507- for ( ; 缓存反代数组索引 < 最大尝试次数 ; 缓存反代数组索引 ++ ) {
508- const [ 反代地址 , 反代端口 ] = 所有反代数组 [ 缓存反代数组索引 % 所有反代数组 . length ] ;
512+ for ( let i = 0 ; i < 所有反代数组 . length ; i ++ ) {
513+ const 反代数组索引 = ( 缓存反代数组索引 + i ) % 所有反代数组 . length ;
514+ const [ 反代地址 , 反代端口 ] = 所有反代数组 [ 反代数组索引 ] ;
509515 try {
510- console . log ( `[反代连接] 尝试连接到: ${ 反代地址 } :${ 反代端口 } (索引: ${ 缓存反代数组索引 } )` ) ;
516+ console . log ( `[反代连接] 尝试连接到: ${ 反代地址 } :${ 反代端口 } (索引: ${ 反代数组索引 } )` ) ;
511517 remoteSock = connect ( { hostname : 反代地址 , port : 反代端口 } ) ;
512518 // 等待TCP连接真正建立,设置1秒超时
513519 await Promise . race ( [
@@ -518,6 +524,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW
518524 await testWriter . write ( data ) ;
519525 testWriter . releaseLock ( ) ;
520526 console . log ( `[反代连接] 成功连接到: ${ 反代地址 } :${ 反代端口 } ` ) ;
527+ 缓存反代数组索引 = 反代数组索引 ;
521528 return remoteSock ;
522529 } catch ( err ) {
523530 console . log ( `[反代连接] 连接失败: ${ 反代地址 } :${ 反代端口 } , 错误: ${ err . message } ` ) ;
@@ -526,21 +533,31 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW
526533 }
527534 }
528535 }
529- remoteSock = connect ( { hostname : address , port : port } ) ;
530- const writer = remoteSock . writable . getWriter ( ) ;
531- await writer . write ( data ) ;
532- writer . releaseLock ( ) ;
533- return remoteSock ;
536+
537+ if ( 反代兜底 ) {
538+ remoteSock = connect ( { hostname : address , port : port } ) ;
539+ const writer = remoteSock . writable . getWriter ( ) ;
540+ await writer . write ( data ) ;
541+ writer . releaseLock ( ) ;
542+ return remoteSock ;
543+ } else {
544+ closeSocketQuietly ( ws ) ;
545+ throw new Error ( '[反代连接] 所有反代连接失败,且未启用反代兜底,连接终止。' ) ;
546+ }
534547 }
548+
535549 async function connecttoPry ( ) {
536550 let newSocket ;
537551 if ( 启用SOCKS5反代 === 'socks5' ) {
552+ console . log ( `[SOCKS5代理] 代理到: ${ host } :${ portNum } ` ) ;
538553 newSocket = await socks5Connect ( host , portNum , rawData ) ;
539554 } else if ( 启用SOCKS5反代 === 'http' || 启用SOCKS5反代 === 'https' ) {
555+ console . log ( `[HTTP代理] 代理到: ${ host } :${ portNum } ` ) ;
540556 newSocket = await httpConnect ( host , portNum , rawData ) ;
541557 } else {
542- const 所有反代数组 = await 解析地址端口 ( 反代IP ) ;
543- newSocket = await connectDirect ( atob ( 'UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg==' ) , 1 , rawData , 所有反代数组 ) ;
558+ console . log ( `[反代连接] 代理到: ${ host } :${ portNum } ` ) ;
559+ const 所有反代数组 = await 解析地址端口 ( 反代IP , host , yourUUID ) ;
560+ newSocket = await connectDirect ( atob ( 'UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg==' ) , 1 , rawData , 所有反代数组 , 启用反代兜底 ) ;
544561 }
545562 remoteConnWrapper . socket = newSocket ;
546563 newSocket . closed . catch ( ( ) => { } ) . finally ( ( ) => closeSocketQuietly ( ws ) ) ;
@@ -549,13 +566,15 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW
549566
550567 const 验证SOCKS5白名单 = ( addr ) => SOCKS5白名单 . some ( p => new RegExp ( `^${ p . replace ( / \* / g, '.*' ) } $` , 'i' ) . test ( addr ) ) ;
551568 if ( 启用SOCKS5反代 && ( 启用SOCKS5全局反代 || 验证SOCKS5白名单 ( host ) ) ) {
569+ console . log ( `[TCP转发] 启用 SOCKS5/HTTP 全局代理` ) ;
552570 try {
553571 await connecttoPry ( ) ;
554572 } catch ( err ) {
555573 throw err ;
556574 }
557575 } else {
558576 try {
577+ console . log ( `[TCP转发] 尝试直连到: ${ host } :${ portNum } ` ) ;
559578 const initialSocket = await connectDirect ( host , portNum , rawData ) ;
560579 remoteConnWrapper . socket = initialSocket ;
561580 connectStreams ( initialSocket , ws , respHeader , connecttoPry ) ;
@@ -1154,10 +1173,12 @@ async function 反代参数获取(request) {
11541173 if ( searchParams . has ( 'proxyip' ) ) {
11551174 const 路参IP = searchParams . get ( 'proxyip' ) ;
11561175 反代IP = 路参IP . includes ( ',' ) ? 路参IP . split ( ',' ) [ Math . floor ( Math . random ( ) * 路参IP . split ( ',' ) . length ) ] : 路参IP ;
1176+ 启用反代兜底 = false ;
11571177 return ;
11581178 } else if ( proxyMatch ) {
11591179 const 路参IP = proxyMatch [ 1 ] === 'proxyip.' ? `proxyip.${ proxyMatch [ 2 ] } ` : proxyMatch [ 2 ] ;
11601180 反代IP = 路参IP . includes ( ',' ) ? 路参IP . split ( ',' ) [ Math . floor ( Math . random ( ) * 路参IP . split ( ',' ) . length ) ] : 路参IP ;
1181+ 启用反代兜底 = false ;
11611182 return ;
11621183 }
11631184
@@ -1323,7 +1344,7 @@ function sha224(s) {
13231344 return hex ;
13241345}
13251346
1326- async function 解析地址端口 ( proxyIP ) {
1347+ async function 解析地址端口 ( proxyIP , 目标域名 = 'dash.cloudflare.com' , UUID = '00000000-0000-4000-8000-000000000000' ) {
13271348 if ( ! 缓存反代IP || ! 缓存反代解析数组 || 缓存反代IP !== proxyIP ) {
13281349 proxyIP = proxyIP . toLowerCase ( ) ;
13291350 async function DoH查询 ( 域名 , 记录类型 ) {
@@ -1399,7 +1420,12 @@ async function 解析地址端口(proxyIP) {
13991420 所有反代数组 = [ [ 地址 , 端口 ] ] ;
14001421 }
14011422 }
1402- 缓存反代解析数组 = 所有反代数组 ;
1423+ const 排序后数组 = 所有反代数组 . sort ( ( a , b ) => a [ 0 ] . localeCompare ( b [ 0 ] ) ) ;
1424+ const 目标根域名 = 目标域名 . includes ( '.' ) ? 目标域名 . split ( '.' ) . slice ( - 2 ) . join ( '.' ) : 目标域名 ;
1425+ let 随机种子 = [ ...( 目标根域名 + UUID ) ] . reduce ( ( a , c ) => a + c . charCodeAt ( 0 ) , 0 ) ;
1426+ console . log ( `[反代解析] 随机种子: ${ 随机种子 } \n目标站点: ${ 目标根域名 } ` )
1427+ const 洗牌后 = [ ...排序后数组 ] . sort ( ( ) => ( 随机种子 = ( 随机种子 * 1103515245 + 12345 ) & 0x7fffffff ) / 0x7fffffff - 0.5 ) ;
1428+ 缓存反代解析数组 = 洗牌后 . slice ( 0 , 8 ) ;
14031429 console . log ( `[反代解析] 解析完成 总数: ${ 缓存反代解析数组 . length } 个\n${ 缓存反代解析数组 . map ( ( [ ip , port ] , index ) => `${ index + 1 } . ${ ip } :${ port } ` ) . join ( '\n' ) } ` ) ;
14041430 缓存反代IP = proxyIP ;
14051431 } else console . log ( `[反代解析] 读取缓存 总数: ${ 缓存反代解析数组 . length } 个\n${ 缓存反代解析数组 . map ( ( [ ip , port ] , index ) => `${ index + 1 } . ${ ip } :${ port } ` ) . join ( '\n' ) } ` ) ;
0 commit comments