网站现已支持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+端口的蓝底黑字后,这一步就完成了。

stunlucky.png

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

ddnslucky.png

CF设置

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

cfdns.png

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

pagerulecf.png

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

apitoken.png

点击继续以显示摘要,创建令牌,记下来这一串字符串。

回到概述页面,找到区域id复制下来

zoneidcf.png

接下来在终端输入

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

webhookluck.png
单击修改,等蓝底黑字出来之后,再次

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的证书即可,这是一个常用功能,我不做过多介绍。

默认规则就是域名没有匹配到时的行为,可以选择关闭连接,也可以像我一样文本输出。

webinluck.png

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

webbloglucky.png

OpenWrt设置

由于我们设置了高端口,一般是不用放行防火墙端口的,仅需简单添加一个端口转发就行.

按照下图,将你stun穿透的那个端口转发到你web服务的"另一个端口"就行。

redirectopenwrt.png