From 0bb3c178aa7cc45cbe1e19d109560bf4dac0ab80 Mon Sep 17 00:00:00 2001 From: cmliu Date: Sat, 12 Jul 2025 01:40:34 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20SOCKS5=20=E5=9C=B0?= =?UTF-8?q?=E5=9D=80=E8=A7=A3=E6=9E=90=EF=BC=8C=E6=94=AF=E6=8C=81=20IPv6?= =?UTF-8?q?=20=E5=9C=B0=E5=9D=80=E5=B8=A6=E7=AB=AF=E5=8F=A3=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- _worker.js | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/_worker.js b/_worker.js index e3d50ec..f79bfb7 100644 --- a/_worker.js +++ b/_worker.js @@ -1217,15 +1217,24 @@ function socks5AddressParser(address) { // 解析服务器地址部分 const latters = latter.split(":"); - // 从末尾提取端口号(因为 IPv6 地址中也包含冒号) - port = Number(latters.pop().replace(/[^\d]/g, '')); + // 检查是否是IPv6地址带端口格式 [xxx]:port + if (latters.length > 2 && latter.includes("]:")) { + // IPv6地址带端口格式:[2001:db8::1]:8080 + port = Number(latter.split("]:")[1].replace(/[^\d]/g, '')); + hostname = latter.split("]:")[0] + "]"; // 正确提取hostname部分 + } else if (latters.length === 2) { + // IPv4地址带端口或域名带端口 + port = Number(latters.pop().replace(/[^\d]/g, '')); + hostname = latters.join(":"); + } else { + port = 80; + hostname = latter; + } + if (isNaN(port)) { throw new Error('无效的 SOCKS 地址格式:端口号必须是数字'); } - // 剩余部分就是主机名(可能是域名、IPv4 或 IPv6 地址) - hostname = latters.join(":"); - // 处理 IPv6 地址的特殊情况 // IPv6 地址包含多个冒号,所以必须用方括号括起来,如 [2001:db8::1] const regex = /^\[.*\]$/;