为网站开启IPv4访问
网站现已支持IPv4访问
前言
作为一名站长,让自己的网页能在任何网络环境下被稳定访问到是基本的要求。之前网站一直只支持纯IPv6访问,好处就是无需过多复杂的配置,每个客户端都是直连的,速度快,且IPv6没有那么多人扫,也安全一点。缺点就是,少部分没有IPv6设备无法访问,一些用户会出现在外面能访问(流量),在家不能访问(宽带没有IPv6)的奇景。受这篇文章启发(在此谢谢这位大佬),为了彻底解决此问题,决定新增访问网站的方式。
IPv4从哪来?
家庭宽带通常难以申请公网IPv4地址,PPPoE得到的地址往往是CGNAT后的地址,我的ISP还是上海移动,公网IP更是不可能,光猫超级密码都不给的,这种情况下就得探讨曲线救国选项,这时候就是介绍STUN出场的时候了,虽然路由器获取不到公网IPv4,但是上网还是需要一个公网IPv4地址的,不过是好多个用户共用一个IPv4地址罢了,配合lucky套件STUN工具可以映射一个公网IPv4地址的端口到路由器的指定端口,虽然公网IP:端口是变化的,但是映射到的路由器端口是不变的,在此端口上配置web服务,端口转发后,即可实现公网IP:端口号访问到路由器后的服务。
准备工作
首先买好域名,托管到克劳德·弗莱尔 Cloudflare,一个装好lucky的路由器。下述过程以我的域名为例。
Lucky设置-1
进入lucky的stun内网穿透界面,添加一个tcp4的穿透规则,名称随意,本地端口任意我这里是19527,尽量大于10000,免得遇见奇奇怪怪的限制。勾选不使用lucky内置的端口转发,使用路由器提供的内核级转发,效率更高。不一定非要用upnp,natpmp也行,也可以两个都不选,等到出现公网ipv4+端口的蓝底黑字后,这一步就完成了。

进入动态域名界面,添加一个DDNS任务,托管服务商选择CF,填入token,打开IPv4Addr,通过接口获取公网,新建子规则,域名填写 *.stun.yourdomain.com

CF设置
在dash.cloudflare.com上添加一个DNS记录,注意: 不可使用二级域名如*.sub作为名称,否则cf配置不了ssl证书,会报错(用户到cf服务器这一段,源站仍然可以正常配置ssl)

点击规则->页面规则,创建一条页面规则,配置如下,并保存和部署页面规则。

随后单击获取您的API令牌,创建令牌,下拉找到创建自定义令牌,按照下图填入,记得把域名改为你自己的。

点击继续以显示摘要,创建令牌,记下来这一串字符串。
回到概述页面,找到区域id复制下来

接下来在终端输入
curl -X GET "https://api.cloudflare.com/client/v4/zones/区域id/pagerules" -H "Authorization: Bearer 刚刚保存的页面规则令牌" -H "Content-Type: application/json"
返回值长这样
{
"result": [
{
"id": "xxxxxxxxxxxxxxxxxxx",
"targets": [
{
"target": "url",
"constraint": {
"operator": "matches",
"value": "*.778511.xyz/"
}
}
],
"actions": [
{
"id": "forwarding_url",
"value": {
"url": "https://$1.stun.778511.xyz",
"status_code": 302
}
}
],
"priority": 1,
"status": "active",
"created_on": "2025-08-17T01:41:37.000000Z",
"modified_on": "2025-08-24T06:19:52.000000Z"
}
],
"success": true,
"errors": [],
"messages": []
}
记住"id"后面的这个xxxxxxxxxxxxxxxxxxx
Lucky设置-2
回到lucky,在刚刚的stun内网穿透界面,找到自己创建的穿透规则,启用webhook,关闭仅在地址和上一次不同时触发Webhook,接口地址填
https://api.cloudflare.com/client/v4/zones/你的区域ID/pagerules/你的xxxxxxxxxx,就是规则id
请求方法PATCH
请求头
Authorization: Bearer 你的页面规则令牌
Content-Type: application/json
请求体
{
"actions": [
{
"id": "forwarding_url",
"value": {
"url": "https://$1.stun.yourdomain.xyz:#{port}",
"status_code": 302
}
}
]
}
调用成功包含字符串"success":true

单击修改,等蓝底黑字出来之后,再次
curl -X GET "https://api.cloudflare.com/client/v4/zones/区域id/pagerules" -H "Authorization: Bearer 刚刚保存的页面规则令牌" -H "Content-Type: application/json"
看看返回值里的端口号和lucky上显示的是否一致。一致就代表页面规则成功了。
Lucky WEB服务设置
接下来访问blog.778511.xyz就相当于访问blog.stun.778511.xyz:stun穿透后端口,就相当于访问路由器19527端口,在另外一个端口设置web服务后,配置好端口转发就能通过域名和IPv4访问服务了。
可以用nginx作为在这个“另一个端口”提供服务的的web服务器,也可以用lucky自带的web服务,我这里用lucky自带的,路由器比较新的话,性能是够用的。
首先创建web规则,我这里用19528作为“另一个端口”,启用了tls,仅需在ssl/tls证书页面申请*.stun.778511.xyz的证书即可,这是一个常用功能,我不做过多介绍。
默认规则就是域名没有匹配到时的行为,可以选择关闭连接,也可以像我一样文本输出。

再添加一个子规则,选择服务类型为反向代理,子规则前端写你的访问域名,对于lucky来说你的访问域名是+了stun的,我这里写blog.stun.778511.xyz,后端地址为你的内网服务所在的地址,勾选万事大吉,一个子规则就完成了。后续可以按照这种样子添加更多服务。

OpenWrt设置
由于我们设置了高端口,一般是不用放行防火墙端口的,仅需简单添加一个端口转发就行.
按照下图,将你stun穿透的那个端口转发到你web服务的"另一个端口"就行。
