使用SVCB/HTTPS解析和HTTP3搭配Lucky的STUN穿透实现无端口号自用完美访问Web服务

参考文章:https://blog.xavierskip.com/2023-07-06-dns-svcb-https/

之前的文章发布了很多关于lucky的stun穿透的方式和技巧,但是都是围绕重定向或中间代理来实现访问,但是这些方法都有一个弊端,就是都是需要依赖中间服务器来进行转发或跳转。

最近在研究http3使用的quic协议的时候发现了一个比较新的DNS解析:SVCB/HTTPS,这个DNS记录和A/AAAA记录类似,可以记录一些ip与服务器的一些信息,通常是用于加密和防止域名被嗅探使用的。但是其有一个特点就是可以返回一个端口号,与SRV解析类似,因此具备类似Minecraft那种SRV直连的特点,并且其天生就是为了http而服务的,由此我们可以利用其来帮我们实现一些http直连的操作。不仅如此,SVCB/HTTPS解析天然是为了http3/quic协议而发展的,我们还能体验到搭载可靠UDP传输带来的优势,让你的网站打开更快。其他更多关于SVCB/HTTPS可以浏览顶部参考文章的内容学习。

说了这么多废话,本篇文章的目的就是分享一个可以无重定向、无端口号、无中转直连家庭内网的http服务的方法。

一、前提提要

在学习本教程之前,请务必学习了并且已经实现正常的重定向直连,如果还没有学习过的,可以点击下列文章进行学习

我会在原来的重定向直连基础上进一步地操作。即:已经可以使用*.a.com重定向到*.b.net:6666

这个方法需要具备两个域名

  • 主域名a.com,给不支持HTTPS解析记录时候正常重定向访问
  • 副域名b.net,负责直连端口号,自用免端口号访问

至于为什么需要两个域名是因为HTTPS/SVCB解析如果在默认访问端口上存在服务的话会直接访问该服务而不进行跳转。因此使用HTTPS/SVCB解析需要将默认访问端口443空出来。不过刚好我们的副域名b.net的443端口是没有服务的

二、配置Lucky

点击STUN内网穿透->添加穿透规则来添加一条stun端口,按照下列规则填写

  • 规则名称:HTTP3
  • 穿透类型:IPv4-UDP
  • 穿透通道本地端口:60000
  • 防火墙自动放行
  • 目标地址:127.0.0.1
  • 目标端口:16666

这里其实和之前创建的stun-tcp规则是一样的,唯一的不同就是穿透类型变成了udp的了。

但是由于STUN自身特性,即使穿透绑定的本地端口和stun-tcp是同一个,但是出口的公网IP也是不一样的

如果希望拥有更好的转发性能的话也可以勾选“不使用Lucky内置端口转发”,手动添加服防火墙和转发规则,因为已经有重定向基础了,这里就不在过多叙述

在动态域名->原来的DNS记录处添加子记录来添加一条DNS记录,按照下列规则填写

  • 备注:https
  • 记录名:*.b.net
  • 记录类型:HTTPS
  • 记录内容:
1 . alpn="h3,h3-29" ipv4hint="{ipv4Addr}" ipv6hint="{ipv6Addr}" port="{STUN_HTTP3_PORT}" 
JavaScript

这里我解释一下这些参数的意思:

  • 1:第一个数字表示优先级的意思,如果存在多个相同的HTTPS/SVCB解析会根据优先级来访问,越小优先级越高,1为最高;其还有一个0模式,表示alias别名模式,和cname差不多,不过是http的cname,我们用不到
  • 点:是的,这个点是不能省略的,其意味着需要解析的记录地址的多少;HTTPS/SVCB解析和SRV解析一样,不仅仅需要HTTPS记录,还需要一个A/AAAA记录来解析实际访问域名的地址;
    它可以为指定域名,例如:1 ipv4.a.com. alpn="h3,h3-29,h2",并且ipv4.a.com已经解析A记录到了你的实际访问的IP;也可以只保留”点”,即,解析自身访问域名的A/AAAA记录,这个的前提的你的*.b.net是解析了A记录的
  • alpn=”h3,h3-29″:这个就是为了告诉客户端服务器支持的协议为HTTP3,至于h3-29http3为http3的第29个提案,因为http3协议的标准还没有确定下来,还在修改;也可以在里面添加h3,h3-29,h2,表示服务器同时支持http2/3,不过我们现在开启的是stun-udp,因此没办法使用tcp的http2
  • ipv4hint=”{ipv4Addr}” ipv6hint=”{ipv6Addr}”:这个是表示服务器预解析地址,作为加速域名查询过程;理论上只要有这个ipv4hint就可以不解析域名查询,但是还是建议同时具备,以防无法连接服务器的问题
    {ipv4Addr}和{ipv6Addr}是lucky的变量,代表本机ipv4/6地址
  • port=”{STUN_HTTP3_PORT}”:访问非标准端口,默认https协议访问的话是隐藏了443端口的,这个就相当于覆写了隐藏的端口为{STUN_HTTP3_PORT}变量

这样就可以实现HTTPS记录的解析了,可以使用dig +short https *.b.net进行查询,如果没有结果的话可能是因为dns缓存的问题,可以尝试换一台设备测试或者使用在线网站进行测试

更多关于HTTPS/SVCB解析内容可以前往DNS SVCB/HTTPS 记录介绍进行学习

lucky默认的Web服务是支持HTTP3解析的,需要在定制模式里面开启

当然你也可以选择使用其他支持HTTP3的分析第三方Web服务例如caddy,带插件的Nginx

ECH是一种域名防嗅探机制,在TLS的握手阶段,数据包会在头部增添上包含 SNI (服务器名称指示)与TLS 版本,支持的密码套件,这些都是以明文传输的,很容易被别人嗅探到设备在访问哪一个域名和网站,从而暴露个人偏好及隐私。使用ECH就可以在握手阶段就加密这些明文信息。

但是开启ECH是需要客户端和服服务端同时支持才可以。目前大部分主流浏览器都支持解析ECH,因此需要我们的服务端也要开启ECH

参考文章:lucky:Web服务启用ECH

在lucky->Web服务->编辑Web规则->定制模式里面开启ECH

首次添加的话就在ECH代理域名处填写已经在lucky的SSL/TLS证书内存在的域名地址,如果存在了*.a.com的SSL证书,可以在里面填入www.a.com;只要填入一个支持访问为HTTPS的域名即可。

填写完成后保存,重新点进去就会自动生成密钥对了,点击复制ECH配置列表

去到动态域名,修改之前创建的https解析记录,将记录内容修改为

1 . alpn="h3,h3-29" ipv4hint="{ipv4Addr}" ipv6hint="{ipv6Addr}" port="{STUN_HTTP3_PORT}" ech="你复制到的ECH配置列表"
JavaScript

这样在下次解析HTTPS记录的时候会同时识别的服务器支持ECH了

三、客户端浏览器解析

因为这个HTTPS的解析是比较新的DNS解析记录,因为还有很多浏览器并不支持直接解析。经实测,目前只有火狐浏览器和苹果的Safari浏览器的支持解析该解析记录的。特别的,苹果的Safari浏览器是原生支持HTTPS记录的解析,不需要配置任何设置即可支持;相反,火狐浏览器着需要配置Doh才可以正常解析;

在设置->隐私与安全->基于HTTPS的DNS->启用策略修改为增强保护,并且填入国内腾讯云的Doh地址https://doh.pub/dns-query。Doh默认使用的是cloudflare的Doh,在国内的话没办法正常解析DNS结果。

此时再去尝试访问https://test.b.net就能直接访问到没有端口号的ipv4网络了

手机的话也可以使用火狐浏览器来打开,不过默认官方的版本是不支持Doh,甚至连about:config也是没办法进去的。不过Github上有第三方火狐客户端Iceraven,其使用火狐内核进行二次开发,支持完整的about:config高级设置,可以进入about:config来修改Doh地址

安装好Iceraven后,在搜索栏输入about:config来打开配置编辑器

搜索network.trr.mode,将其设置为2,优先使用Doh进行查询,没有结果则回退到传统DNS解析。这里的mode=2和PC上设置的增强保护是一样的,mode=3则为只使用Doh,如果没有解析到将会无法访问,与PC上的最大保护效果一致。

network.trr.mode值解释

接着输入network.trr.uri修改Doh地址为https://doh.pub/dns-query,这样手机也可以实现无端口号直连web站点了

四、QoS困境?

如果你的家庭网络对于跨运营商结算或者对于UDP传输的QoS非常严重,可以不使用HTTP3协议。这样的话你还会省去很多配置Lucky的步骤。

只需要在原来stun-tcp重定向的基础上添加一条https规则的动态域名即可(对应二、配置Lucky->2、创建HTTPS记录),HTTP3和stun-udp都不需要进行设置

1 . alpn="h2" ipv4hint="{ipv4Addr}" ipv6hint="{ipv6Addr}" port="{STUN_http_PORT}"
JavaScript

但是这样及没办法享受HTTP3带来的速度提升了,也算得一种妥协方式吧

五、总结

通过使用HTTPS/SVCB解析来实现免端口号访问,才是真正意义上的家庭内网直连访问,非常适合搭配内网STUN穿透使用,也算是打破运营商封锁80、443封锁的缓解措施吧。

HTTPS解析协议作为新兴的DNS解析协议,目前的话还有很多任重道远,最主要的问题还是普及率非常低,国内对于HTTPS/SVCB解析的支持还比较少,目前的话阿里云和腾讯云DNS的支持的,国外的话Cloudflare也是支持的;另一方面,对于支持HTTPS解析客户端也是非常的少,只有火狐和safari支持了,Chromium内核的浏览器理论上支持但是实际上并不可用,并且火狐浏览器在使用上还必须搭配Doh来访问,这就导致了其访问方式只能是自用访问,不具备通用性;

此外,在访问的时候必须手动添加https://协议头才可以,否则是没办法实现正常直连,这对于习惯于省略协议头进行web访问的话是需要注意的。当然重定向访问就没这个问题,因为发起重定向后的域名是自动添加上https://协议头进行访问的。

不过好在我们可以利用两个域名来实现互补,主域名负责对外公共重定向访问,副域名负责面端口号访问自用访问,实现真正意义上的无端口号完美访问。但是有时候可能会因为网络问题无法支持解析Doh,会导致直接访问HTTPS解析的副域名无法正常解析,这时候只能手动输入主域名来实现重定向访问。目前博主也没有找到问题所在。


📌 本文由 FishBoss_Tca 原创,转载请注明作者和原文链接。
原文链接:https://www.ytca.top/stun/2331/

评论

  1. lr
    1 月前
    2025-9-16 10:56:37

    谢谢大佬的研究,距离伪公网更进一步了,只可惜还是不支持像wireguard这种udp或者tcp应用,只能通过魔改的TXT记录曲线救国

    • 博主
      lr
      已编辑
      1 月前
      2025-9-16 11:21:49

      只是自用的话使用VNT就够了
      https://www.ytca.top/stun/2064/

    • 博主
      lr
      1 月前
      2025-9-16 11:26:01

      目前的话我使用的是腾讯云的edge one CDN,不限流量,并且吊打国内其他免费CDN,不过也和其他免费CDN一样,需要国内的CDN都需要备案域名,可以尝试用一下国际版的edge one,搭配优选效果比cloudfalre cdn好
      https://www.ytca.top/stun/2193/

  2. q
    1 月前
    2025-9-18 5:34:27

    看你博客这么多方案,哪种最安全最好啊?

    • 博主
      q
      已编辑
      1 月前
      2025-9-18 7:52:40

      没有最好,只有更好,目前的话我都是在一步一步迭代
      底层原理都一样,就是实现方式的不同而已,各有优缺点,也说不上做好
      但是你非得说要一个最好的,我可以提供一下我目前在用的方案:vnt内网访问➕EdgeOne回源的web访问,一个主内,一个主外
      当然本章节的内容我也有在用,主域名cdn回源访问,子域名使用svcb访问

      • q
        FishBoss_Tca
        1 月前
        2025-9-19 19:01:10

        EdgeOne回源,只有IPV6,IPV4访问不了吧,

        • 博主
          q
          已编辑
          1 月前
          2025-9-19 19:19:17

          是的,协议和回源协议是一致的
          因此建议使用ipv4

          • q
            FishBoss_Tca
            1 月前
            2025-9-19 19:40:15

            我看到EdgeOne里面也有边缘函数,能不能利用边缘函数写一个反代,就像floudflare workers一样。这样就能使IPV4也能访问

  3. 博主
    1 月前
    2025-9-19 19:43:38

    edgeone不是无限量流量吗?那为什么还要用重定向?

    • q
      FishBoss_Tca
      1 月前
      2025-9-19 19:54:51

      不是重定向,是反代,类似cloudflare workers反代

      • 博主
        q
        1 月前
        2025-9-19 19:58:36

        那cdn自带的回源不能满足你的需求吗?非得搞边缘函数

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇