Skip to content

Commit aaf7d2a

Browse files
authored
Merge pull request #887 from cmliu/beta2.0
Beta2.0
2 parents a2a943a + 1977bb1 commit aaf7d2a

1 file changed

Lines changed: 47 additions & 21 deletions

File tree

_worker.js

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { connect } from "cloudflare:sockets";
22
let config_JSON, 反代IP = '', 启用SOCKS5反代 = null, 启用SOCKS5全局反代 = false, 我的SOCKS5账号 = '', parsedSocks5Address = {};
3-
let 缓存反代IP, 缓存反代解析数组, 缓存反代数组索引 = 0;
3+
let 缓存反代IP, 缓存反代解析数组, 缓存反代数组索引 = 0, 启用反代兜底 = true;
44
let SOCKS5白名单 = ['*tapecontent.net', '*cloudatacdn.com', '*loadshare.org', '*cdn-centaurus.com', 'scholar.google.com'];
55
const 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

Comments
 (0)