mobile wallpaper 1mobile wallpaper 2mobile wallpaper 3mobile wallpaper 4
1382 字
4 分钟
智能IP版本重定向系统:基于Cloudflare Worker的动态端口路由
2026-02-26

智能IP版本重定向系统:基于Cloudflare Worker的动态端口路由#

概述#

在现代网络环境中,IPv4 和 IPv6 共存,不同协议版本的客户端可能需要访问不同的后端服务或端口。本教程介绍如何使用 Cloudflare Worker 实现一个智能重定向系统,它能够:

  • 根据客户端的 IP 版本(IPv4 或 IPv6)自动选择对应的目标域名。
  • 对于 IPv6 客户端,进一步根据请求的子域名动态分配不同的端口,实现多服务复用同一个域名。

该系统非常适合用于双栈网络服务、游戏服务器接入、P2P 应用、实时通信等需要精细流量路由的场景。


原始代码分析#

首先,我们分析一个基础的 Cloudflare Worker 脚本,它实现了根据 IP 版本重定向到不同域名和端口的功能。

原始代码#

const CONFIG = {
sourceDomain: 'domain.com',
ipv4TargetDomain: 'stun.domain.com', // IPv4 STUN穿透域名
ipv6TargetDomain: 'v6.domain.com', // IPv6固定端口域名
ipv4Port: '#{port}', // IPv4动态端口(占位符)
ipv6Port: '4443' // IPv6固定端口
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 仅处理匹配源域名的请求
if (!hostname.includes(CONFIG.sourceDomain)) {
return new Response('Not Found', { status: 404 });
}
// 获取客户端真实IP(Cloudflare提供)
const clientIP = request.headers.get('CF-Connecting-IP');
const isIPv6 = clientIP && clientIP.includes(':'); // IPv6地址包含冒号
let targetDomain, targetPort;
if (isIPv6) {
// IPv6客户端 -> 使用IPv6固定端口
targetDomain = CONFIG.ipv6TargetDomain;
targetPort = CONFIG.ipv6Port;
} else {
// IPv4客户端 -> 使用STUN穿透域名和动态端口
targetDomain = CONFIG.ipv4TargetDomain;
targetPort = CONFIG.ipv4Port;
}
// 构建新URL:将源域名替换为目标域名,并添加对应端口
const newHost = hostname.replace(CONFIG.sourceDomain, targetDomain);
const targetUrl = `https://${newHost}:${targetPort}${url.pathname}${url.search}`;
// 返回302重定向
return Response.redirect(targetUrl, 302);
}

工作原理#

  1. IP版本检测
    通过 CF-Connecting-IP​ 请求头获取客户端真实 IP(Cloudflare 会自动添加此头)。若 IP 字符串中包含冒号 :,则判定为 IPv6,否则为 IPv4。
  2. 路由选择
  • IPv4 客户端:重定向到 ipv4TargetDomain,并使用配置的 IPv4 端口(动态占位符,实际部署需替换为具体端口)。
  • IPv6 客户端:重定向到 ipv6TargetDomain​,并使用固定的 IPv6 端口 4443
  1. 域名替换
    将原始主机名中的 sourceDomain​ 部分替换为目标域名,保留子域前缀(如 alist.domin.comalist.v6.domin.com)。同时附加原路径和查询参数。
  2. 302重定向
    浏览器或客户端收到重定向后,会向新 URL 发起请求,从而实现透明的流量导向。

局限性#

原始方案中,所有 IPv6 流量都使用同一个固定端口(4443)。如果同一个域名下托管了多个服务(如 Alist、qBittorrent、Migu),它们无法通过端口区分,导致服务冲突。


需求扩展:根据子域名动态分配 IPv6 端口#

我们希望修改脚本,使得当 IPv6 客户端访问不同的子域名时,能够自动使用对应的端口。例如:

子域名期望 IPv6 端口
alist.domain.com5425
ql.domain.com5700
migu.domain.com13000
其他子域名或根域名4443(默认)

修改方案详解#

1. 定义端口映射表#

创建一个对象 IPV6_PORT_MAP​,将子域名前缀(如 alist)映射到对应的端口号。

const IPV6_PORT_MAP = {
'alist': '5425',
'ql': '5700',
'migu': '13000'
// 可继续添加更多映射
};

2. 提取子域名前缀#

我们需要从请求的 hostname​ 中提取出子域前缀(即源域名前面的部分)。由于源域名是 domain.com,我们可以通过字符串操作获取前缀。

function getSubdomainPrefix(hostname, baseDomain) {
// 如果主机名就是基域名本身,则没有前缀
if (hostname === baseDomain) return '';
// 去掉基域名(包括前面的点)得到前缀部分
const prefix = hostname.replace('.' + baseDomain, '');
// 如果前缀包含多个点(如 a.b.domain.com),只取第一个子域
if (prefix.includes('.')) {
return prefix.split('.')[0];
}
return prefix;
}

3. 根据前缀选择端口#

遍历端口映射表,如果前缀匹配(即主机名以 prefix + '.' + baseDomain 结尾),则返回对应端口;否则返回默认端口。

function getIPv6PortByHostname(hostname) {
for (const [prefix, port] of Object.entries(IPV6_PORT_MAP)) {
if (hostname.includes(prefix + '.' + CONFIG.sourceDomain)) {
return port;
}
}
return CONFIG.ipv6Port; // 默认端口
}

4. 集成到主逻辑#

在 IPv6 分支中,调用 getIPv6PortByHostname(hostname) 动态获取端口,替代原来的固定端口。

if (isIPv6) {
targetDomain = CONFIG.ipv6TargetDomain;
targetPort = getIPv6PortByHostname(hostname);
} else {
targetDomain = CONFIG.ipv4TargetDomain;
targetPort = CONFIG.ipv4Port;
}

完整修改后的代码#

const CONFIG = {
sourceDomain: 'domain.com',
ipv4TargetDomain: 'stun.domain.com',
ipv6TargetDomain: 'v6.domain.com',
ipv4Port: '#{port}', // 需替换为实际IPv4端口
ipv6Port: '4443' // 默认IPv6端口
};
// 子域名前缀 -> IPv6端口映射
const IPV6_PORT_MAP = {
'alist': '5425',
'ql': '5700',
'migu': '13000'
};
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request));
});
async function handleRequest(request) {
const url = new URL(request.url);
const hostname = url.hostname;
// 检查是否匹配源域名
if (!hostname.includes(CONFIG.sourceDomain)) {
return new Response('Not Found', { status: 404 });
}
// 检测客户端IP版本
const clientIP = request.headers.get('CF-Connecting-IP');
const isIPv6 = clientIP && clientIP.includes(':');
let targetDomain, targetPort;
if (isIPv6) {
targetDomain = CONFIG.ipv6TargetDomain;
targetPort = getIPv6PortByHostname(hostname);
} else {
targetDomain = CONFIG.ipv4TargetDomain;
targetPort = CONFIG.ipv4Port;
}
// 替换域名并构建新URL
const newHost = hostname.replace(CONFIG.sourceDomain, targetDomain);
const targetUrl = `https://${newHost}:${targetPort}${url.pathname}${url.search}`;
return Response.redirect(targetUrl, 302);
}
/**
* 根据请求主机名动态获取IPv6端口
* @param {string} hostname - 请求的主机名
* @returns {string} 端口号
*/
function getIPv6PortByHostname(hostname) {
for (const [prefix, port] of Object.entries(IPV6_PORT_MAP)) {
if (hostname.includes(prefix + '.' + CONFIG.sourceDomain)) {
return port;
}
}
return CONFIG.ipv6Port;
}

部署和使用说明#

  1. 注册/登录 Cloudflare
    进入 Cloudflare Dashboard,在左侧菜单选择 Workers & Pages
  2. 创建新的 Worker
    点击 创建应用程序创建 Worker,给 Worker 命名(例如 ip-version-router)。
  3. 粘贴代码
    将上述完整代码粘贴到 Worker 编辑器中,并根据实际需要修改:
  • CONFIG 中的域名替换为你自己的域名。
  • #{port} 替换为 IPv4 服务的实际端口(如果动态端口由其他系统提供,可保留占位符并在部署时替换)。
  • 根据需要增删 IPV6_PORT_MAP 中的映射项。
  1. 保存并部署
    点击 保存并部署,Worker 即生效。
  2. 配置域名路由
    在 Worker 的 触发器 选项卡中,添加路由规则,例如 *.domain.com/*,将子域名流量指向该 Worker。
  3. 验证
    使用不同 IP 版本的客户端访问不同的子域名,检查是否被正确重定向到预期的端口。

扩展与自定义#

  • 添加更多子域名映射:只需在 IPV6_PORT_MAP 对象中添加新的键值对即可。
  • IPv4 动态端口支持:如果 IPv4 也需要根据子域名动态分配端口,可类似地创建 IPV4_PORT_MAP 并在 IPv4 分支中调用相应函数。
  • 路径保留:脚本保留了原始路径和查询参数,可以方便地用于 API 或 Web 服务。
  • 协议选择:目前重定向使用 HTTPS,如需支持 HTTP,可修改 targetUrl 中的协议。

总结#

通过 Cloudflare Worker 的轻量级边缘计算能力,我们实现了一个智能的 IP 版本重定向系统,并扩展了 IPv6 子域名到端口的动态映射。这种方案具有以下优势:

  • 零运维:无需管理服务器,全托管于 Cloudflare 全球网络。
  • 低延迟:在边缘节点执行,减少客户端与服务端的交互次数。
  • 灵活扩展:通过简单的配置即可支持任意数量的子域名和端口。

无论是个人开发者还是企业团队,都可以利用此方案高效地管理多服务、多协议的网络入口。

分享

如果这篇文章对你有帮助,欢迎分享给更多人!

智能IP版本重定向系统:基于Cloudflare Worker的动态端口路由
https://mblog.xian5.de5.net/posts/智能ip版本重定向系统基于cloudflare-worker的动态端口路由/
作者
卓尔伤
发布于
2026-02-26
许可协议
CC BY-NC-SA 4.0

部分信息可能已经过时

相关文章 智能推荐
1
[转载]最快的访问!使用Cloudflare+CDN节点优选+Workers重定向lucky的IPv4-STUN穿透HTTP请求
教程 为了实现内网IPv4的完美访问,之前的方案存在请求/重定向时间长和页面规则过少的痛点问题。新的方案采用Cloudflare的Workers和CDN优选,利用JavaScript脚本实现多个通配符匹配,优化首次请求的响应速度。方案包括配置Cloudflare、腾讯云DNS和lucky三个部分,通过Worker脚本和WebHook实现端口的动态更新,适用于支持302重定向的客户端。
2
我的服务器终于有“私人医生”了!基于CloudFlare零成本搭建XUGOU监控平台全记录
教程 作者作为一个NAS深度用户,之前依靠手动登录NAS查看资源占用和凭感觉来监控服务,导致出现了服务卡顿和容器日志塞爆磁盘等问题。因此,作者决定搭建一个集中监控室,要求能够监控NAS的系统指标和HTTP服务,具有良好的界面,免费且易于部署。经过多番寻找,在GitHub上发现了XUGOU项目,这是一个基于Cloudflare的开源监控平台,能够满足作者的所有需求。作者按照文档一步步部署XUGOU,整个过程大约花了一个小时,包括配置Cloudflare D1数据库、部署后端和前端、安装Agent等步骤。部署完成后,作者测试了XUGOU的功能,包括系统监控、HTTP监控和状态页面等,发现XUGOU能够实时展示监控数据,支持自定义请求和告警通知等。作者认为XUGOU是一个非常适合NAS玩家和个人用户的监控方案,能够
3
告别服务器,拥抱无服务器:我的 Cloudflare Workers 生态项目推荐与部署指南
教程 本文介绍了基于Cloudflare Workers和Pages的开源项目,包括NodeWarden、Rin Blog、CloudFlare-ImgBed、Cloudflare-Clist、flare-stack-blog和edgetunnel。这些项目提供了密码管理、博客、图床、代理和网络加速等功能,且全部开源且可一键部署。通过这些项目,开发者可以轻松构建自己的应用程序,享受Cloudflare全球边缘网络带来的高性能和低延迟。
4
使用批处理脚本一键切换 Windows 系统代理并设置例外网址
教程 本文提供一段批处理脚本,实现 Windows 系统代理的一键切换与例外设置。脚本支持自动检测状态、切换代理并配置服务器地址及排除列表(支持通配符)。使用时需修改脚本配置并以管理员身份运行。该工具无需打开繁杂的 Internet 选项,能有效提升网络调试效率。
5
Proxmox VE中Intel e1000e网卡硬件单元挂起问题终极解决方案
教程 本文详细介绍了Proxmox VE环境中Intel e1000e系列网卡(I218-LM、I219-V等)出现硬件单元挂起(Hardware Unit Hang)问题的完整解决方案。通过日志分析、问题定位、多种解决策略对比以及验证方法,帮助用户彻底解决网卡导致的系统崩溃问题。

目录