From dad3f7750f385aab56a7306e09dbdb9af5a08d14 Mon Sep 17 00:00:00 2001 From: cmliu Date: Wed, 4 Sep 2024 02:37:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=85=8D=E7=BD=AE=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=E6=98=BE=E7=A4=BA=E6=9B=B4=E5=A4=9A=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/package-worker.yml | 26 ---------- README.md | 43 ++++++++-------- _worker.js | 73 +++++++++++++++++++++------ worker.zip | Bin 20034 -> 0 bytes 4 files changed, 80 insertions(+), 62 deletions(-) delete mode 100644 .github/workflows/package-worker.yml delete mode 100644 worker.zip diff --git a/.github/workflows/package-worker.yml b/.github/workflows/package-worker.yml deleted file mode 100644 index 3acdcfb..0000000 --- a/.github/workflows/package-worker.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: Package Worker # 工作流程的名称 - -on: # 触发事件 - workflow_dispatch: # 手动触发 - push: # 当代码被推送到仓库时触发 - paths: # 指定触发条件的文件路径 - - '_worker.js' # 当_worker.js文件发生变动时触发 - -jobs: # 工作流程中的任务 - package-and-commit: # 任务名称 - runs-on: ubuntu-latest # 运行环境,这里使用最新版本的Ubuntu - steps: # 任务步骤 - - name: Checkout Repository # 步骤名称,检出代码 - uses: actions/checkout@v2 # 使用actions/checkout动作 - - - name: Zip the worker file # 将_worker.js文件打包成worker.zip - run: zip worker.zip _worker.js # 使用zip命令直接打包 - - - name: Commit and push the packaged file # 提交并推送打包后的文件 - uses: EndBug/add-and-commit@v7 # 使用EndBug/add-and-commit动作 - with: - add: 'worker.zip' # 指定要提交的文件 - message: 'Automatically package and commit worker.zip' # 提交信息 - author_name: github-actions[bot] # 提交者名称 - author_email: actions[bot]@users.noreply.github.com # 提交者邮箱 - token: ${{ secrets.GH_TOKEN }} # 使用GH_TOKEN作为身份验证 diff --git a/README.md b/README.md index 424769d..d8fdaf5 100644 --- a/README.md +++ b/README.md @@ -5,26 +5,28 @@ - 快速部署视频教程:https://www.youtube.com/watch?v=59THrmJhmAw ***最佳推荐!!!*** - 进阶使用视频教程:https://www.youtube.com/watch?v=s91zjpw3-P8 -Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networks](https://alice.ws/aff.php?aff=15)提供的云服务器维持[CM订阅转换服务](https://sub.fxxk.dedyn.io/)!** +Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networks](https://url.cmliussss.com/alice)提供的云服务器维持[CM订阅转换服务](https://sub.fxxk.dedyn.io/)!** # 免责声明 -本免责声明适用于 GitHub 上的 “edgetunnel” 项目(以下简称“该项目”),项目链接为:https://github.com/cmliu/edgetunnel +本免责声明适用于 GitHub 上的 “edgetunnel” 项目(以下简称“本项目”),项目链接为:https://github.com/cmliu/edgetunnel 。 ### 用途 -该项目被设计和开发仅供学习、研究和安全测试目的。它旨在为安全研究者、学术界人士和技术爱好者提供一个了解和实践网络通信技术的工具。 +本项目仅供教育、研究和安全测试目的而设计和开发。旨在为安全研究人员、学术界人士及技术爱好者提供一个探索和实践网络通信技术的工具。 ### 合法性 -使用者在下载和使用该项目时,必须遵守当地法律和规定。使用者有责任确保他们的行为符合其所在地区的法律、规章以及其他适用的规定。 +在下载和使用本项目代码时,必须遵守使用者所适用的法律和规定。使用者有责任确保其行为符合所在地区的法律框架、规章制度及其他相关规定。 ### 免责 -1. 作为该项目的作者,我(以下简称“作者”)强调该项目应仅用于合法、道德和教育目的。 -2. 作者不鼓励、不支持也不促进任何形式的非法使用该项目。如果发现该项目被用于非法或不道德的活动,作者将强烈谴责这种行为。 -3. 作者对任何人或团体使用该项目进行的任何非法活动不承担责任。使用者使用该项目时产生的任何后果由使用者本人承担。 -4. 作者不对使用该项目可能引起的任何直接或间接损害负责。 -5. 通过使用该项目,使用者表示理解并同意本免责声明的所有条款。如果使用者不同意这些条款,应立即停止使用该项目。 +1. 作为本项目的 **二次开发作者**(以下简称“作者”),我 **cmliu** 强调本项目仅应用于合法、道德和教育目的。 +2. 作者不认可、不支持亦不鼓励任何形式的非法使用。如果发现本项目被用于任何非法或不道德的活动,作者将对此强烈谴责。 +3. 作者对任何人或组织利用本项目代码从事的任何非法活动不承担责任。使用本项目代码所产生的任何后果,均由使用者自行承担。 +4. 作者不对使用本项目代码可能引起的任何直接或间接损害负责。 +5. 为避免任何意外后果或法律风险,使用者应在使用本项目代码后的 24 小时内删除代码。 -作者保留随时更新本免责声明的权利,且不另行通知。最新的免责声明版本将会在该项目的 GitHub 页面上发布。 +通过使用本项目代码,使用者即表示理解并同意本免责声明的所有条款。如使用者不同意这些条款,应立即停止使用本项目。 + +作者保留随时更新本免责声明的权利,且不另行通知。最新版本的免责声明将发布在本项目的 GitHub 页面上。 ## 风险提示 - 通过提交虚假的节点配置给订阅服务,避免节点配置信息泄露。 @@ -60,11 +62,11 @@ Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networ ## Pages 上传 部署方法 **最佳推荐!!!** [视频教程](https://www.youtube.com/watch?v=59THrmJhmAw) 1. 部署 CF Pages: - - 下载 [worker.zip](https://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip) 文件,并点上 Star !!! - - 在 CF Pages 控制台中选择 `上传资产`后,为你的项目取名后点击 `创建项目`,然后上传你下载好的 [worker.zip](https://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip) 文件后点击 `部署站点`。 + - 下载 [main.zip](https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip) 文件,并点上 Star !!! + - 在 CF Pages 控制台中选择 `上传资产`后,为你的项目取名后点击 `创建项目`,然后上传你下载好的 [main.zip](https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip) 文件后点击 `部署站点`。 - 部署完成后点击 `继续处理站点` 后,选择 `设置` > `环境变量` > **制作**为生产环境定义变量 > `添加变量`。 变量名称填写**UUID**,值则为你的UUID,后点击 `保存`即可。 - - 返回 `部署` 选项卡,在右下角点击 `创建新部署` 后,重新上传 [worker.zip](https://raw.githubusercontent.com/cmliu/edgetunnel/main/worker.zip) 文件后点击 `保存并部署` 即可。 + - 返回 `部署` 选项卡,在右下角点击 `创建新部署` 后,重新上传 [main.zip](https://github.com/cmliu/edgetunnel/archive/refs/heads/main.zip) 文件后点击 `保存并部署` 即可。 2. 访问订阅内容: - 访问 `https://[YOUR-PAGES-URL]/[YOUR-UUID]` 即可获取订阅内容。 @@ -133,11 +135,12 @@ Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networ | 变量名 | 示例 | 必填 | 备注 | YT | |--------|---------|-|-----|-----| | UUID | `90cd4a77-141a-43c9-991b-08263cfe9c10` |✅| Powershell -NoExit -Command "[guid]::NewGuid()"| [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=72s) | -| PROXYIP | `proxyip.fxxk.dedyn.io` |❌| 备选作为访问CFCDN站点的代理节点(支持多ProxyIP, ProxyIP之间使用`,`或 换行 作间隔) | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=166s) | -| SOCKS5 | `user:password@127.0.0.1:1080` |❌| 优先作为访问CFCDN站点的SOCKS5代理(支持多socks5, socks5之间使用`,`或 换行 作间隔) | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=826s) | -| ADD | `icook.tw:2053#官方优选域名` |❌| 本地优选TLS域名/优选IP(支持多元素之间`,`或 换行 作间隔) || +| PROXYIP | `proxyip.fxxk.dedyn.io` |❌| 备选作为访问CFCDN站点的代理节点(支持多ProxyIP, ProxyIP之间使用`,`或`换行`作间隔) | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=166s) | +| SOCKS5 | `user:password@127.0.0.1:1080` |❌| 优先作为访问CFCDN站点的SOCKS5代理(支持多socks5, socks5之间使用`,`或`换行`作间隔) | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=826s) | +| GO2SOCKS5 | `blog.cmliussss.com`,`*ip111.cn` |❌| 设置`SOCKS5`变量之后,可设置强制使用socks5访问名单(`*`可作为通配符,`换行`作多元素间隔) || +| ADD | `icook.tw:2053#官方优选域名` |❌| 本地优选TLS域名/优选IP(支持多元素之间`,`或`换行`作间隔) || | ADDAPI | [https://raw.github.../addressesapi.txt](https://raw.githubusercontent.com/cmliu/WorkerVless2sub/main/addressesapi.txt) |❌| 优选IP的API地址(支持多元素之间`,`或 换行 作间隔) || -| ADDNOTLS | `icook.hk:8080#官方优选域名` |❌| 本地优选noTLS域名/优选IP(支持多元素之间`,`或 换行 作间隔) || +| ADDNOTLS | `icook.hk:8080#官方优选域名` |❌| 本地优选noTLS域名/优选IP(支持多元素之间`,`或`换行`作间隔) || | ADDNOTLSAPI | [https://raw.github.../addressesapi.txt](https://raw.githubusercontent.com/cmliu/CFcdnVmess2sub/main/addressesapi.txt) |❌| 优选IP的API地址(支持多元素之间`,`或 换行 作间隔) || | ADDCSV | [https://raw.github.../addressescsv.csv](https://raw.githubusercontent.com/cmliu/WorkerVless2sub/main/addressescsv.csv) |❌| iptest测速结果(支持多元素, 元素之间使用`,`作间隔) || | DLS | `8` |❌| `ADDCSV`测速结果满足速度下限 || @@ -148,8 +151,8 @@ Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networ | SUBCONFIG | [https://raw.github.../ACL4SSR_Online_Full_MultiMode.ini](https://raw.githubusercontent.com/cmliu/ACL4SSR/main/Clash/config/ACL4SSR_Online_Full_MultiMode.ini) |❌| clash、singbox等 订阅转换配置文件 | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=1605s) | | SUBNAME | `edgetunnel` |❌| 订阅名称 | | | RPROXYIP | `false` |❌| 设为 true 即可强制获取订阅器分配的ProxyIP(需订阅器支持)| [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=1816s) | -| URL302 | `https://t.me/CMLiussss` |❌| 主页302跳转(支持多url, url之间使用`,`或 换行 作间隔, 小白别用) | | -| URL | `https://t.me/CMLiussss` |❌| 主页伪装(支持多url, url之间使用`,`或 换行 作间隔, 乱设容易触发反诈) | | +| URL302 | `https://t.me/CMLiussss` |❌| 主页302跳转(支持多url, url之间使用`,`或`换行`作间隔, 小白别用) | | +| URL | `https://t.me/CMLiussss` |❌| 主页伪装(支持多url, url之间使用`,`或`换行`作间隔, 乱设容易触发反诈) | | | CFEMAIL | `admin@gmail.com` |❌| CF账户邮箱(与`CFKEY`都填上后, 订阅信息将显示请求使用量, 小白别用) | | | CFKEY | `c6a944b5c956b6c18c2352880952bced8b85e` |❌| CF账户Global API Key(与`CFEMAIL`都填上后, 订阅信息将显示请求使用量, 小白别用) | | @@ -200,4 +203,4 @@ Telegram交流群:[@CMLiussss](https://t.me/CMLiussss),**感谢[Alice Networ # 感谢 -[zizifn](https://github.com/zizifn/edgetunnel)、[3Kmfi6HP](https://github.com/3Kmfi6HP/EDtunnel)、[Stanley-baby](https://github.com/Stanley-baby)、[ACL4SSR](https://github.com/ACL4SSR/ACL4SSR/tree/master/Clash/config)、[SHIJS1999](https://github.com/SHIJS1999/cloudflare-worker-vless-ip)、Alice Networks LTD、 +[zizifn](https://github.com/zizifn/edgetunnel)、[3Kmfi6HP](https://github.com/3Kmfi6HP/EDtunnel)、[Stanley-baby](https://github.com/Stanley-baby)、[ACL4SSR](https://github.com/ACL4SSR/ACL4SSR/tree/master/Clash/config)、[SHIJS1999](https://github.com/SHIJS1999/cloudflare-worker-vless-ip)、Alice Networks LTD、 diff --git a/_worker.js b/_worker.js index 61fc0e2..d62c594 100644 --- a/_worker.js +++ b/_worker.js @@ -31,6 +31,7 @@ let noTLS = 'false'; const expire = 4102329600;//2099-12-31 let proxyIPs; let socks5s; +let go2Socks5s = []; let addresses = []; let addressesapi = []; let addressesnotls = []; @@ -62,7 +63,7 @@ export default { const fakeUserIDMD5 = await MD5MD5(`${userID}${timestamp}`); fakeUserID = fakeUserIDMD5.slice(0, 8) + "-" + fakeUserIDMD5.slice(8, 12) + "-" + fakeUserIDMD5.slice(12, 16) + "-" + fakeUserIDMD5.slice(16, 20) + "-" + fakeUserIDMD5.slice(20); fakeHostName = fakeUserIDMD5.slice(6, 9) + "." + fakeUserIDMD5.slice(13, 19); - console.log(`虚假UUID: ${fakeUserID}`); // 打印fakeID + //console.log(`虚假UUID: ${fakeUserID}`); // 打印fakeID proxyIP = env.PROXYIP || proxyIP; proxyIPs = await ADD(proxyIP); @@ -105,6 +106,13 @@ export default { DLS = env.DLS || DLS; BotToken = env.TGTOKEN || BotToken; ChatID = env.TGID || ChatID; + if( env.GO2SOCKS5 ) { + const go2Socks5 = env.GO2SOCKS5; + var addGo2Socks5 = go2Socks5.replace(/[\r\n]+/g, '\n').replace(/,+/g, '\n'); + if (addGo2Socks5.charAt(0) == '\n') addGo2Socks5 = addGo2Socks5.slice(1); + if (addGo2Socks5.charAt(addGo2Socks5.length - 1) == '\n') addGo2Socks5 = addGo2Socks5.slice(0, addGo2Socks5.length - 1); + go2Socks5s = addGo2Socks5.split('\n'); + } const upgradeHeader = request.headers.get('Upgrade'); const url = new URL(request.url); if (url.searchParams.has('sub') && url.searchParams.get('sub') !== '') sub = url.searchParams.get('sub'); @@ -345,6 +353,14 @@ async function vlessOverWSHandler(request) { * @returns {Promise} 异步操作的 Promise */ async function handleTCPOutBound(remoteSocket, addressType, addressRemote, portRemote, rawClientData, webSocket, vlessResponseHeader, log,) { + async function useSocks5Pattern(address) { + if ( go2Socks5s.includes(atob('YWxsIGlu')) ) return true; + return go2Socks5s.some(pattern => { + let regexPattern = pattern.replace(/\*/g, '.*'); + let regex = new RegExp(`^${regexPattern}$`, 'i'); + return regex.test(address); + }); + } /** * 连接远程服务器并写入数据 * @param {string} address 要连接的地址 @@ -394,8 +410,10 @@ async function handleTCPOutBound(remoteSocket, addressType, addressRemote, portR remoteSocketToWS(tcpSocket, webSocket, vlessResponseHeader, null, log); } + let useSocks = false; + if( go2Socks5s.length > 0 && enableSocks ) useSocks = await useSocks5Pattern(addressRemote); // 首次尝试连接远程服务器 - let tcpSocket = await connectAndWrite(addressRemote, portRemote); + let tcpSocket = await connectAndWrite(addressRemote, portRemote, useSocks); // 当远程 Socket 就绪时,将其传递给 WebSocket // 建立从远程服务器到 WebSocket 的数据流,用于将远程服务器的响应发送回客户端 @@ -1164,7 +1182,7 @@ const 啥啥啥_写的这是啥啊 = 'dmxlc3M='; function 配置信息(UUID, 域名地址) { const 协议类型 = atob(啥啥啥_写的这是啥啊); - const 别名 = 域名地址; + const 别名 = FileName; let 地址 = 域名地址; let 端口 = 443; @@ -1180,14 +1198,14 @@ function 配置信息(UUID, 域名地址) { const 指纹 = 'randomized'; if (域名地址.includes('.workers.dev')){ - 地址 = 'www.wto.org'; + 地址 = 'visa.cn'; 端口 = 80 ; 传输层安全 = ['',false]; } const v2ray = `${协议类型}://${用户ID}@${地址}:${端口}?encryption=${加密方式}&security=${传输层安全[0]}&sni=${SNI}&fp=${指纹}&type=${传输层协议}&host=${伪装域名}&path=${encodeURIComponent(路径)}#${encodeURIComponent(别名)}`; const clash = `- type: ${协议类型} - name: ${别名} + name: ${FileName} server: ${地址} port: ${端口} uuid: ${用户ID} @@ -1242,26 +1260,37 @@ async function getVLESSConfig(userID, hostName, sub, UA, RproxyIP, _url) { } if ( userAgent.includes('mozilla') && !subParams.some(_searchParams => _url.searchParams.has(_searchParams))) { - let 订阅器 = `您的订阅内容由 ${sub} 提供维护支持, 自动获取ProxyIP: ${RproxyIP}`; const newSocks5s = socks5s.map(socks5Address => { if (socks5Address.includes('@')) return socks5Address.split('@')[1]; else if (socks5Address.includes('//')) return socks5Address.split('//')[1]; else return socks5Address; }); + + let socks5List = ''; + if( go2Socks5s.length > 0 && enableSocks ) socks5List = `SOCKS5(白名单): \n ${go2Socks5s.join('\n ')}\n` + + let 订阅器 = ''; if (!sub || sub == '') { - if (!proxyIP || proxyIP =='') { - if (enableSocks) 订阅器 += `您的订阅内容由 内置 addresses/ADD 参数提供, 当前使用的Socks5: ${newSocks5s.join(', ')}`; - else 订阅器 = '您的订阅内容由 内置 addresses/ADD 参数提供, 当前使用的ProxyIP为空, 推荐您设置 proxyIP/PROXYIP !!!'; - } else { - 订阅器 = `您的订阅内容由 内置 addresses/ADD 参数提供, 当前使用的ProxyIP: ${proxyIPs.join(', ')}`; - } - } else if (RproxyIP != 'true'){ - if (enableSocks) 订阅器 += `, 当前使用的Socks5: ${newSocks5s.join(', ')}`; - else 订阅器 += `, 当前使用的ProxyIP: ${proxyIPs.join(', ')}`; + if (enableSocks) 订阅器 += `CFCDN(访问方式): Socks5\n ${newSocks5s.join('\n ')}\n${socks5List}`; + else if (!proxyIP || proxyIP =='') 订阅器 += `CFCDN(访问方式): ProxyIP\n ${proxyIPs.join('\n ')}\n`; + else 订阅器 += `CFCDN(访问方式): 无法访问, 需要您设置 proxyIP/PROXYIP !!!\n`; + 订阅器 += `\n您的订阅内容由 内置 addresses/ADD* 参数变量提供\n`; + if (addresses.length > 0) 订阅器 += `ADD(TLS优选域名&IP): \n ${addresses.join('\n ')}\n`; + if (addressesnotls.length > 0) 订阅器 += `ADDNOTLS(noTLS优选域名&IP): \n ${addressesnotls.join('\n ')}\n`; + if (addressesapi.length > 0) 订阅器 += `ADDAPI(TLS优选域名&IP 的 API): \n ${addressesapi.join('\n ')}\n`; + if (addressesnotlsapi.length > 0) 订阅器 += `ADDNOTLSAPI(noTLS优选域名&IP 的 API): \n ${addressesnotlsapi.join('\n ')}\n`; + if (addressescsv.length > 0) 订阅器 += `ADDCSV(IPTest测速csv文件 限速 ${DLS} ): \n ${addressescsv.join('\n ')}\n`; + } else { + if (enableSocks) 订阅器 += `CFCDN(访问方式): Socks5\n ${newSocks5s.join('\n ')}\n${socks5List}`; + else if (!proxyIP || proxyIP =='') 订阅器 += `CFCDN(访问方式): ProxyIP\n ${proxyIPs.join('\n ')}\n`; + else if (RproxyIP == 'true') 订阅器 += `CFCDN(访问方式): 自动获取ProxyIP\n`; + else 订阅器 += `CFCDN(访问方式): 无法访问, 需要您设置 proxyIP/PROXYIP !!!\n` + 订阅器 += `\nSUB(优选订阅生成器): ${sub}`; } + return ` ################################################################ -Subscribe / sub 订阅地址, 支持 Base64、clash-meta、sing-box 订阅格式, ${订阅器} +Subscribe / sub 订阅地址, 支持 Base64、clash-meta、sing-box 订阅格式 --------------------------------------------------------------- 快速自适应订阅地址: https://${proxyhost}${hostName}/${userID} @@ -1279,6 +1308,18 @@ https://${proxyhost}${hostName}/${userID}?sb https://${proxyhost}${hostName}/${userID}?singbox --------------------------------------------------------------- ################################################################ +${FileName} 配置信息 +--------------------------------------------------------------- +HOST: ${hostName} +UUID: ${userID} +FKID: ${fakeUserID} +UA: ${UA} + +${订阅器} +SUBAPI(订阅转换后端): ${subProtocol}://${subconverter} +SUBCONFIG(订阅转换配置文件): ${subconfig} +--------------------------------------------------------------- +################################################################ v2ray --------------------------------------------------------------- ${v2ray} diff --git a/worker.zip b/worker.zip deleted file mode 100644 index df392891abbf7453d870a915fc17765f84d8396d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20034 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