Skip to content

Commit 49d42b4

Browse files
committed
feat: 添加 DNS64 服务器支持,增强 NAT64 地址解析功能
1 parent 606eb45 commit 49d42b4

2 files changed

Lines changed: 29 additions & 18 deletions

File tree

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@
143143
| HTTP | `user:password@127.0.0.1:8080``127.0.0.1:8080` || 优先作为访问CFCDN站点的HTTP代理(支持多HTTP代理之间使用`,``换行`作间隔) | |
144144
| SOCKS5 | `user:password@127.0.0.1:1080``127.0.0.1:1080` || 优先作为访问CFCDN站点的SOCKS5代理(支持多socks5, socks5之间使用`,``换行`作间隔) | [Video](https://www.youtube.com/watch?v=s91zjpw3-P8&t=826s) |
145145
| GO2SOCKS5 | `blog.cmliussss.com`,`*.ip111.cn`,`*google.com` || 设置`SOCKS5``HTTP`变量之后,可设置强制使用socks5访问名单(设置为`*`可作为全局代理) ||
146+
| NAT64 | `dns64.cmi.ztvi.org``2001:67c:2960:6464::/96` || 作为PROXYIP失效后的应急兜底,自行查询[nat64.xyz](https://nat64.xyz/)`DNS64 Server``NAT64 Prefix` ||
146147
| ADD | `icook.tw:2053#官方优选域名` || 本地优选TLS域名/优选IP(支持多元素之间`,``换行`作间隔) ||
147148
| ADDAPI | [https://raw.github.../addressesapi.txt](https://raw.githubusercontent.com/cmliu/WorkerVless2sub/main/addressesapi.txt) || 优选IP的API地址(支持多元素之间`,`或 换行 作间隔) ||
148149
| ADDNOTLS | `icook.hk:8080#官方优选域名` || 本地优选noTLS域名/优选IP(支持多元素之间`,``换行`作间隔) ||

_worker.js

Lines changed: 28 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import { connect } from 'cloudflare:sockets';
33

44
let userID = '';
55
let proxyIP = '';
6+
let DNS64Server = '';
67
//let sub = '';
78
let subConverter = atob('U1VCQVBJLkNNTGl1c3Nzcy5uZXQ=');
89
let subConfig = atob('aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0FDTDRTU1IvQUNMNFNTUi9tYXN0ZXIvQ2xhc2gvY29uZmlnL0FDTDRTU1JfT25saW5lX01pbmlfTXVsdGlNb2RlLmluaQ==');
@@ -88,7 +89,7 @@ export default {
8889
proxyIP = env.PROXYIP || env.proxyip || proxyIP;
8990
proxyIPs = await 整理(proxyIP);
9091
proxyIP = proxyIPs[Math.floor(Math.random() * proxyIPs.length)];
91-
92+
DNS64Server = env.DNS64 || env.NAT64 || (DNS64Server != '' ? DNS64Server : atob("ZG5zNjQuY21saXVzc3NzLm5ldA=="));
9293
socks5Address = env.HTTP || env.SOCKS5 || socks5Address;
9394
socks5s = await 整理(socks5Address);
9495
socks5Address = socks5s[Math.floor(Math.random() * socks5s.length)];
@@ -2411,9 +2412,9 @@ async function resolveToIPv6(target) {
24112412

24122413
// 查询NAT64 IPv6地址
24132414
async function queryNAT64(domain) {
2414-
const socket = connect(atob('ZG90Lm5hdDY0LmRrOjg1Mw=='), {
2415-
secureTransport: 'on',
2416-
allowHalfOpen: false
2415+
const socket = connect({
2416+
hostname: isIPv6(DNS64Server) ? `[${DNS64Server}]` : DNS64Server,
2417+
port: 53
24172418
});
24182419

24192420
const writer = socket.writable.getWriter();
@@ -2542,25 +2543,34 @@ async function resolveToIPv6(target) {
25422543
return answers;
25432544
}
25442545

2545-
try {
2546-
// 判断输入类型并处理
2547-
if (isIPv6(target)) {
2548-
return target; // IPv6直接返回
2546+
function convertToNAT64IPv6(ipv4Address) {
2547+
const parts = ipv4Address.split('.');
2548+
if (parts.length !== 4) {
2549+
throw new Error('无效的IPv4地址');
25492550
}
25502551

2551-
let domain;
2552-
if (isIPv4(target)) {
2553-
domain = target + atob('LmlwLjA5MDIyNy54eXo='); // IPv4转换为NAT64域名
2554-
} else {
2555-
// 域名先解析IPv4再转NAT64
2556-
const ipv4 = await fetchIPv4(target);
2557-
domain = ipv4 + atob('LmlwLjA5MDIyNy54eXo=');
2558-
}
2552+
// 将每个部分转换为16进制
2553+
const hex = parts.map(part => {
2554+
const num = parseInt(part, 10);
2555+
if (num < 0 || num > 255) {
2556+
throw new Error('无效的IPv4地址段');
2557+
}
2558+
return num.toString(16).padStart(2, '0');
2559+
});
2560+
2561+
// 构造NAT64
2562+
return DNS64Server.split('/96')[0] + hex[0] + hex[1] + ":" + hex[2] + hex[3];
2563+
}
25592564

2560-
return await queryNAT64(domain);
2565+
try {
2566+
// 判断输入类型并处理
2567+
if (isIPv6(target)) return target; // IPv6直接返回
2568+
const ipv4 = isIPv4(target) ? target : await fetchIPv4(target);
2569+
const nat64 = DNS64Server.endsWith('/96') ? convertToNAT64IPv6(ipv4) : await queryNAT64(ipv4 + atob('LmlwLjA5MDIyNy54eXo='));
2570+
return isIPv6(nat64) ? nat64 : atob('cHJveHlpcC5jbWxpdXNzc3MubmV0');
25612571
} catch (error) {
25622572
console.error('解析错误:', error);
2563-
return `解析失败: ${error.message}`;
2573+
return atob('cHJveHlpcC5jbWxpdXNzc3MubmV0');;
25642574
}
25652575
}
25662576

0 commit comments

Comments
 (0)