From 0b30ee8be3fdf5e748d5428fe2275d6045d64f98 Mon Sep 17 00:00:00 2001 From: cmliu Date: Mon, 22 Dec 2025 17:28:28 +0800 Subject: [PATCH 1/4] =?UTF-8?q?fix:=20=E6=9B=B4=E6=96=B0=E4=BC=98=E9=80=89?= =?UTF-8?q?=E8=8A=82=E7=82=B9=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91=EF=BC=8C?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E5=9C=B0=E5=9D=80=E5=A4=87=E6=B3=A8=E7=9A=84?= =?UTF-8?q?=E7=BC=96=E7=A0=81=E4=B8=8E=E8=A7=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/_worker.js b/_worker.js index 4e76bf1..77ea54a 100644 --- a/_worker.js +++ b/_worker.js @@ -238,8 +238,12 @@ export default { const 优选API = [], 优选IP = [], 其他节点 = []; for (const 元素 of 完整优选列表) { if (元素.toLowerCase().startsWith('https://')) 优选API.push(元素); - else if (元素.toLowerCase().includes('://')) 其他节点.push(元素); - else 优选IP.push(元素); + else if (元素.toLowerCase().includes('://')) { + if (元素.includes('#')) { + const 地址备注分离 = 元素.split('#'); + 其他节点.push(地址备注分离[0] + '#' + encodeURIComponent(decodeURIComponent(地址备注分离[1]))); + } else 其他节点.push(元素); + } else 优选IP.push(元素); } 其他节点LINK = 其他节点.join('\n') + '\n'; const 优选API的IP = await 请求优选API(优选API); From f7359eaec00c5ad1f2700da68a6a0ac56743137b Mon Sep 17 00:00:00 2001 From: cmliu Date: Mon, 22 Dec 2025 17:57:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E5=8F=8D=E4=BB=A3?= =?UTF-8?q?=E5=85=9C=E5=BA=95=E9=80=BB=E8=BE=91=EF=BC=8C=E4=BC=98=E5=8C=96?= =?UTF-8?q?TCP=E8=BD=AC=E5=8F=91=E8=BF=9E=E6=8E=A5=E5=A4=B1=E8=B4=A5?= =?UTF-8?q?=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/_worker.js b/_worker.js index 77ea54a..d7aaeef 100644 --- a/_worker.js +++ b/_worker.js @@ -1,6 +1,6 @@ import { connect } from "cloudflare:sockets"; let config_JSON, 反代IP = '', 启用SOCKS5反代 = null, 启用SOCKS5全局反代 = false, 我的SOCKS5账号 = '', parsedSocks5Address = {}; -let 缓存反代IP, 缓存反代解析数组, 缓存反代数组索引 = 0; +let 缓存反代IP, 缓存反代解析数组, 缓存反代数组索引 = 0, 启用反代兜底 = true; let SOCKS5白名单 = ['*tapecontent.net', '*cloudatacdn.com', '*loadshare.org', '*cdn-centaurus.com', 'scholar.google.com']; const Pages静态页面 = 'https://edt-pages.github.io'; ///////////////////////////////////////////////////////主程序入口/////////////////////////////////////////////// @@ -20,6 +20,7 @@ export default { if (env.PROXYIP) { const proxyIPs = await 整理成数组(env.PROXYIP); 反代IP = proxyIPs[Math.floor(Math.random() * proxyIPs.length)]; + 启用反代兜底 = false; } else 反代IP = (request.cf.colo + '.PrOxYIp.CmLiUsSsS.nEt').toLowerCase(); 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'; if (env.GO2SOCKS5) SOCKS5白名单 = await 整理成数组(env.GO2SOCKS5); @@ -503,8 +504,9 @@ function 解析魏烈思请求(chunk, token) { return { hasError: false, addressType, port, hostname, isUDP, rawIndex: addrValIdx + addrLen, version }; } async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnWrapper) { - console.log(`[TCP转发] 目标: ${host}:${portNum} | 反代IP: ${反代IP} | 反代类型: ${启用SOCKS5反代 || 'proxyip'} | 全局: ${启用SOCKS5全局反代 ? '是' : '否'}`); - async function connectDirect(address, port, data, 所有反代数组 = null) { + console.log(`[TCP转发] 目标: ${host}:${portNum} | 反代IP: ${反代IP} | 反代兜底: ${启用反代兜底 ? '是' : '否'} | 反代类型: ${启用SOCKS5反代 || 'proxyip'} | 全局: ${启用SOCKS5全局反代 ? '是' : '否'}`); + + async function connectDirect(address, port, data, 所有反代数组 = null, 反代兜底 = true) { let remoteSock; if (所有反代数组 && 所有反代数组.length > 0) { const 最大尝试次数 = 缓存反代数组索引 + Math.min(8, 所有反代数组.length); @@ -530,12 +532,19 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW } } } - remoteSock = connect({ hostname: address, port: port }); - const writer = remoteSock.writable.getWriter(); - await writer.write(data); - writer.releaseLock(); - return remoteSock; + + if (反代兜底) { + remoteSock = connect({ hostname: address, port: port }); + const writer = remoteSock.writable.getWriter(); + await writer.write(data); + writer.releaseLock(); + return remoteSock; + } else { + closeSocketQuietly(ws); + throw new Error('[反代连接] 所有反代连接失败,且未启用反代兜底,连接终止。'); + } } + async function connecttoPry() { let newSocket; if (启用SOCKS5反代 === 'socks5') { @@ -544,7 +553,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW newSocket = await httpConnect(host, portNum, rawData); } else { const 所有反代数组 = await 解析地址端口(反代IP); - newSocket = await connectDirect(atob('UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg=='), 1, rawData, 所有反代数组); + newSocket = await connectDirect(atob('UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg=='), 1, rawData, 所有反代数组, 启用反代兜底); } remoteConnWrapper.socket = newSocket; newSocket.closed.catch(() => { }).finally(() => closeSocketQuietly(ws)); @@ -1157,10 +1166,12 @@ async function 反代参数获取(request) { if (searchParams.has('proxyip')) { const 路参IP = searchParams.get('proxyip'); 反代IP = 路参IP.includes(',') ? 路参IP.split(',')[Math.floor(Math.random() * 路参IP.split(',').length)] : 路参IP; + 启用反代兜底 = false; return; } else if (proxyMatch) { const 路参IP = proxyMatch[1] === 'proxyip.' ? `proxyip.${proxyMatch[2]}` : proxyMatch[2]; 反代IP = 路参IP.includes(',') ? 路参IP.split(',')[Math.floor(Math.random() * 路参IP.split(',').length)] : 路参IP; + 启用反代兜底 = false; return; } From ebc2db79a4dcc3727c84e41729ecda13d03349e1 Mon Sep 17 00:00:00 2001 From: cmliu Date: Mon, 22 Dec 2025 18:14:12 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E6=B7=BB=E5=8A=A0=E6=97=A5=E5=BF=97?= =?UTF-8?q?=E8=BE=93=E5=87=BA=E4=BB=A5=E5=A2=9E=E5=BC=BATCP=E8=BD=AC?= =?UTF-8?q?=E5=8F=91=E8=BF=9E=E6=8E=A5=E7=9A=84=E8=B0=83=E8=AF=95=E4=BF=A1?= =?UTF-8?q?=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/_worker.js b/_worker.js index d7aaeef..a9535a8 100644 --- a/_worker.js +++ b/_worker.js @@ -548,10 +548,13 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW async function connecttoPry() { let newSocket; if (启用SOCKS5反代 === 'socks5') { + console.log(`[SOCKS5代理] 代理到: ${host}:${portNum}`); newSocket = await socks5Connect(host, portNum, rawData); } else if (启用SOCKS5反代 === 'http' || 启用SOCKS5反代 === 'https') { + console.log(`[HTTP代理] 代理到: ${host}:${portNum}`); newSocket = await httpConnect(host, portNum, rawData); } else { + console.log(`[反代连接] 代理到: ${host}:${portNum}`); const 所有反代数组 = await 解析地址端口(反代IP); newSocket = await connectDirect(atob('UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg=='), 1, rawData, 所有反代数组, 启用反代兜底); } @@ -562,6 +565,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW const 验证SOCKS5白名单 = (addr) => SOCKS5白名单.some(p => new RegExp(`^${p.replace(/\*/g, '.*')}$`, 'i').test(addr)); if (启用SOCKS5反代 && (启用SOCKS5全局反代 || 验证SOCKS5白名单(host))) { + console.log(`[TCP转发] 启用 SOCKS5/HTTP 全局代理`); try { await connecttoPry(); } catch (err) { @@ -569,6 +573,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW } } else { try { + console.log(`[TCP转发] 尝试直连到: ${host}:${portNum}`); const initialSocket = await connectDirect(host, portNum, rawData); remoteConnWrapper.socket = initialSocket; connectStreams(initialSocket, ws, respHeader, connecttoPry); From 1977bb1825eeff41ca17bb2ec9b1fc57826050c4 Mon Sep 17 00:00:00 2001 From: cmliu Date: Mon, 22 Dec 2025 19:49:06 +0800 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=E5=90=8C=E7=9B=AE=E6=A0=87=E6=A0=B9?= =?UTF-8?q?=E5=9F=9F=E5=90=8D=E5=9B=BA=E5=AE=9A=E5=8F=8D=E4=BB=A3=E6=95=B0?= =?UTF-8?q?=E7=BB=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/_worker.js b/_worker.js index a9535a8..79fb861 100644 --- a/_worker.js +++ b/_worker.js @@ -388,7 +388,7 @@ async function 处理WS请求(request, yourUUID) { if (判断是否是木马) { const { port, hostname, rawClientData } = 解析木马请求(chunk, yourUUID); if (isSpeedTestSite(hostname)) throw new Error('Speedtest site is blocked'); - await forwardataTCP(hostname, port, rawClientData, serverSock, null, remoteConnWrapper); + await forwardataTCP(hostname, port, rawClientData, serverSock, null, remoteConnWrapper, yourUUID); } else { const { port, hostname, rawIndex, version, isUDP } = 解析魏烈思请求(chunk, yourUUID); if (isSpeedTestSite(hostname)) throw new Error('Speedtest site is blocked'); @@ -399,7 +399,7 @@ async function 处理WS请求(request, yourUUID) { const respHeader = new Uint8Array([version[0], 0]); const rawData = chunk.slice(rawIndex); if (isDnsQuery) return forwardataudp(rawData, serverSock, respHeader); - await forwardataTCP(hostname, port, rawData, serverSock, respHeader, remoteConnWrapper); + await forwardataTCP(hostname, port, rawData, serverSock, respHeader, remoteConnWrapper, yourUUID); } }, })).catch((err) => { @@ -503,17 +503,17 @@ function 解析魏烈思请求(chunk, token) { if (!hostname) return { hasError: true, message: `Invalid address: ${addressType}` }; return { hasError: false, addressType, port, hostname, isUDP, rawIndex: addrValIdx + addrLen, version }; } -async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnWrapper) { +async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnWrapper, yourUUID) { console.log(`[TCP转发] 目标: ${host}:${portNum} | 反代IP: ${反代IP} | 反代兜底: ${启用反代兜底 ? '是' : '否'} | 反代类型: ${启用SOCKS5反代 || 'proxyip'} | 全局: ${启用SOCKS5全局反代 ? '是' : '否'}`); - + async function connectDirect(address, port, data, 所有反代数组 = null, 反代兜底 = true) { let remoteSock; if (所有反代数组 && 所有反代数组.length > 0) { - const 最大尝试次数 = 缓存反代数组索引 + Math.min(8, 所有反代数组.length); - for (; 缓存反代数组索引 < 最大尝试次数; 缓存反代数组索引++) { - const [反代地址, 反代端口] = 所有反代数组[缓存反代数组索引 % 所有反代数组.length]; + for (let i = 0; i < 所有反代数组.length; i++) { + const 反代数组索引 = (缓存反代数组索引 + i) % 所有反代数组.length; + const [反代地址, 反代端口] = 所有反代数组[反代数组索引]; try { - console.log(`[反代连接] 尝试连接到: ${反代地址}:${反代端口} (索引: ${缓存反代数组索引})`); + console.log(`[反代连接] 尝试连接到: ${反代地址}:${反代端口} (索引: ${反代数组索引})`); remoteSock = connect({ hostname: 反代地址, port: 反代端口 }); // 等待TCP连接真正建立,设置1秒超时 await Promise.race([ @@ -524,6 +524,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW await testWriter.write(data); testWriter.releaseLock(); console.log(`[反代连接] 成功连接到: ${反代地址}:${反代端口}`); + 缓存反代数组索引 = 反代数组索引; return remoteSock; } catch (err) { console.log(`[反代连接] 连接失败: ${反代地址}:${反代端口}, 错误: ${err.message}`); @@ -555,7 +556,7 @@ async function forwardataTCP(host, portNum, rawData, ws, respHeader, remoteConnW newSocket = await httpConnect(host, portNum, rawData); } else { console.log(`[反代连接] 代理到: ${host}:${portNum}`); - const 所有反代数组 = await 解析地址端口(反代IP); + const 所有反代数组 = await 解析地址端口(反代IP, host, yourUUID); newSocket = await connectDirect(atob('UFJPWFlJUC50cDEuMDkwMjI3Lnh5eg=='), 1, rawData, 所有反代数组, 启用反代兜底); } remoteConnWrapper.socket = newSocket; @@ -1342,7 +1343,7 @@ function sha224(s) { return hex; } -async function 解析地址端口(proxyIP) { +async function 解析地址端口(proxyIP, 目标域名 = 'dash.cloudflare.com', UUID = '00000000-0000-4000-8000-000000000000') { if (!缓存反代IP || !缓存反代解析数组 || 缓存反代IP !== proxyIP) { proxyIP = proxyIP.toLowerCase(); async function DoH查询(域名, 记录类型) { @@ -1418,7 +1419,12 @@ async function 解析地址端口(proxyIP) { 所有反代数组 = [[地址, 端口]]; } } - 缓存反代解析数组 = 所有反代数组; + const 排序后数组 = 所有反代数组.sort((a, b) => a[0].localeCompare(b[0])); + const 目标根域名 = 目标域名.includes('.') ? 目标域名.split('.').slice(-2).join('.') : 目标域名; + let 随机种子 = [...(目标根域名 + UUID)].reduce((a, c) => a + c.charCodeAt(0), 0); + console.log(`[反代解析] 随机种子: ${随机种子}\n目标站点: ${目标根域名}`) + const 洗牌后 = [...排序后数组].sort(() => (随机种子 = (随机种子 * 1103515245 + 12345) & 0x7fffffff) / 0x7fffffff - 0.5); + 缓存反代解析数组 = 洗牌后.slice(0, 8); console.log(`[反代解析] 解析完成 总数: ${缓存反代解析数组.length}个\n${缓存反代解析数组.map(([ip, port], index) => `${index + 1}. ${ip}:${port}`).join('\n')}`); 缓存反代IP = proxyIP; } else console.log(`[反代解析] 读取缓存 总数: ${缓存反代解析数组.length}个\n${缓存反代解析数组.map(([ip, port], index) => `${index + 1}. ${ip}:${port}`).join('\n')}`);