前言以及原理

随着时间的推移,家宽中ipv4的发放可以说越来越严格,但是随着ipv6技术的进一步成熟(可能还有运营商的业绩要求),ipv6的公网地址可以说是人人都有了,无需复杂调整,无需软路由,无需openwrt,大多数家庭的设备基本只需要打开ipv6桥接,让光猫接管ipv6,就能获取ipv6地址。

image.png

这里给出的截图是openwrt系统作为参考
理论上家庭服务器中的服务或者路由器接一个ddns就能随意访问了,但是大部分家宽有一个问题,对于常用端口,如80443端口的截断。如何在外网环境(有ipv6)直接使用域名https访问服务以及如何在某些只有ipv4的特殊环境—-校园网,公司WI-FI,来实现只有纯ipv6公网的服务的访问呢。这是本文将要探讨的问题。
总所周知,Cloudflare可以称得上互联网大善人,作者的网站也是一直放在CF上面托管的。CF的CDN代理:即黄色小云朵,其实不只有防ddns的能力。

image.png

nsloookup查看使用了CF代理的子域名ip可以发现,一个网站CF总共提供了4个ip,两个v6的地址和两个v4的地址。并且无论原来的dns绑定的是v4ip还是v6ip。
从这里想到是否可以通过CF的代理实现纯v6地址的v4访问。
谷歌搜索了一下,发现两种方案
1.修改或者反代服务端口到CF默认检查的端口
2.使用回源规则(Origin Rules)代理端口

方法一:反代服务端口到CF默认检查的端口

CF默认检查的端口有:

1
2
3
4
5
6
7
8
9
10
11
12
13
============================================================
默认使用的HTTP端口 默认使用的HTTPS端口 其他端口(禁用缓存)
80 443 2052
8080 2053 2053
8880 2083 2082
2052 2087 2083
2082 2096 2086
2086 8443 2087
2095 2095
2096
8880
8443
============================================================

理论上可以通过lucky,nginx,caddy等进行反代或者直接修改服务到对应端口(注意http和https对应不同端口),笔者通过fnos商店自带的带gui的lucy进行了尝试,代理了2083端口,开启了TLS,但是并没有成功,怀疑所在地区的移动将这些端口也进行了封锁。

参考教程飞牛fnos利用lucky反向代理实现ipv4环境访问ipv6公网nas

方法二:使用回源规则(Origin Rules)代理端口

准备工作

  1. 拥有一个通过CF管理的域名
  2. 设置AAAA域名解析绑定到自己的家庭v6公网服务器,并且不设置CF代理(小灰云),并且在服务器端设置好ddns来应付家宽几天一变的ip。这个域名用来纯v6访问以及保证其他服务器能正常访问。

image.png

image.png|500

设置用来v4访问的域名

最好直接通过cname指向之前设置的纯v6域名。

image.png

理论上说这时候如果我们的服务没有封锁任何端口,就已经能通过现在设置的域名访问。但是运营商封锁了常用端口,这就需要下面的神奇操作,借用CF的服务器进行中转。

设置回源规则(Origin Rules)

首先打开侧边栏的规则-概述
image.png|500

其次点击右边显示所有规则这里与旧版的界面不同,不能在侧边栏直接找到。CloudFlare的省钱神奇小妙招
image.png|500

找到我们需要的Origin Rules,点击创建规则,名字可如图设置。
设置选项如下图

image.png
image.png

这里重写到fnos默认的https端口5667,记得访问的时候使用https://

这样其实就已经能够访问了,通过https://v4fnos.example.com/
image.png

配置Cloudflare Workers 实现v4走cf中转,v6跳转到纯v6域名直连

配置Workers

首先返回CF主页面,配置Workers

image.png|500

进入Workers 和 Pages,点击创建一个默认的halloworldworkes,image.png|500

创建完成后再点击编辑代码,使用下面代码替换原有代码,注意编辑好自己的域名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
addEventListener('fetch', event => {

event.respondWith(handleRequest(event.request))

})



async function handleRequest(request) {

// 获取并识别客户端的IP地址

const clientIp = request.headers.get('CF-Connecting-IP');

// 获取请求的主机名

const host = request.headers.get('Host');

// 定义主机名v4fnos.example.com的处理逻辑

if (host === 'v4fnos.example.com') {

// 检查IP地址是IPv6还是IPv4

if (clientIp.includes(':')) { // IPv6 address

// 进一步检查IPv6地址是否以fe80开头

if (!clientIp.startsWith('fe80')) {

// 302重定向到有公网且没开CDN代理的地址homefnos.example.com:5667

const url = new URL(request.url);

url.host = 'homefnos.example.com:5667';

return Response.redirect(url.toString(), 302);

} else {

// 如果是fe80开头的IPv6地址,直接返回正常响应

return fetch(request);

}

} else { // IPv4 address

// 如果是IPv4则正常访问,此处正常访问就走了Origin规则

return fetch(request);

}

} else {

// 如果不是你监控的主机名,则继续正常访问

return fetch(request);

}

}

逻辑:判断客户端ip是否为公共v6地址,是则302重定向跳转到https://homefnos.example.com:5667/
不是v6地址则走Origin规则正常代理使用
点击部署

配置域名的Workers路由(匹配域名和Workers)

来到域名管理界面,点击侧边栏Workers 路由
image.png|500

添加路由,匹配v4访问的域名
image.png

这样就完成了所有的配置,实现了v4走CF中转,v6直接直连。

不足

不难发现CloudFlare实现的中转一次只能匹配一个端口,而且在访问速度十分慢,只能用于管理的web界面,影音视频流相关服务基本卡到不可用。

其实可以通过修改fnos默认的nginx配置文件,实现每个通过端口通信的服务都转换成5667端口下的子路径服务(类似飞牛影音)来白嫖飞牛的中转,但是目前fnos还处在公测阶段,每次更新都会洗掉nginx配置文件,所以不建议这么做。

参考地址

  1. 萌新折腾笔记)网络畅行系列——利用CloudFlare实现域名的双网访问
  2. 利用cloudflare让ipv4与ipv6互通
  3. 飞牛fnos利用lucky反向代理实现ipv4环境访问ipv6公网nas
  4. 使用Cloudflare代理为纯IPv6站点添加IPv4访问