Loading... ## 背景 / 需求 关于从办公室访问家里的服务,已经有N多解决方案。在早些年家宽还有公网IP的时候,学着在路由器上做端口转发和DDNS,感觉都是很神奇的事。现在看来,那个时候是多么美好。 后来,家宽都没有了ipv4公网,ipv6看各省心情。 > 电信宽带,有动态 IPv6 地址,至于公网 IPv4 地址,基本要不到 > > 联通宽带,有动态 IPv6 地址,至于动态公网 IPv4 地址,听说很容易要到 > > 移动宽带,有动态 IPv6 地址,至于 IPv4 是不是公网,懂得都懂,目前我正在用 > > 4G、5G 网络,有 IPv6 地址,至于 IPv4 是不是公网,想都别想 另外,咱们折腾设备的大多非网络专业,安全意识淡薄。即使您有公网 IP,鉴于国内大部分都无公网 IP,国内厂商的家用路由器基本都没有配置高级防火墙,您对外暴露的网络资产会受到攻击的风险。 也幸亏我是在运营工作,现在想要固定的公网ip,基本就只有政企客户开的专线,那个真的不是一般价格,基本就是几千块一个月。 那么在没有公网ip的情况下,如何访问家里的服务,基本有以下三种解法: 1. 基于内网穿透的程序,需要有一个公网ip的服务器,使用frp、nps等。这也是我目前穿透的主力,**一直使用frp**,非常稳定,几乎不崩。 2. 互联网提供的穿透服务,包括**Zerotier\Tailscale**等,前期也折腾了很多关于moon节点,总体感受一般。 3. 基于硬件设备的,比如**蒲公英、SD-NAT**等,这些基本设备要钱、服务也要钱。 4. **Stun穿透**,在NAT模式下的一种穿透,说是我也也是刚开始研究。 <div class="tip inlineBlock warning"> 后来经常在张大妈上看,了解到了一款软硬路由公网神器 ——Lucky (大吉) </div> > 项目地址: > > [https://lucky666.cn/](https://lucky666.cn/) > > [https://github.com/gdy666/lucky](https://github.com/gdy666/lucky) 不过这边需要注意的是,此工具新版并不开源。 ![](https://imgki.com/usr/uploads/2024/10/1648939157.png) ## 原理 这种 STUN(Session Traversal Utilities for NAT,NAT 会话穿越应用程序)内网穿透技术,可以帮助解决因 NAT 技术所带来的网络连接问题 STUN 技术允许 NAT1 用户获取公网端口,通过路由端口转发或者 LUCKY 内置转发,将内网服务端口暴露到外网,从而实现内网穿透的目的 ![](https://imgki.com/usr/uploads/2024/10/578457367.png) ### 好处 这个技术有以下几个好处: > * 不需要一台有公网 IPv4 服务器做端口转发 > * 无需付费,最多就是购买个域名 > * 配置简单,最多浏览器 F12 抓抓包 > * 速度快,受限于你宽带的上传带宽 > * 延迟低,和你游戏联机的技术一样 不过也有一些缺点: > * 访问地址不固定,穿透后端口千变万化 > * 无法 DDNS,DNS 无法设置解析 > * 稳定性未知,保活比较难做 对于前两点,可以配合 WebHook 调用相关 API,搭配 Cloudflare 的页面规则等进行 301/302 跳转,可以近似实现 DDNS 的功能 > **重要:**这种方案打洞之后的流量 **都被运营商看作 UDP**,可能**会被运营商 QoS**,尤其是**跨省跨运营商**,所以**有能力最好还是申请公网 IP** 。如果您的运营商有这种行为,那么您基本可以关掉这篇文章了,考虑其它的方式了 > > 目前经过测试,部分运营商就连 TCP 协议的 FRP 都会被 DPI 识别并 QoS,因此还是建议大家拥抱 IPv6 吧 ## 前提条件 为了能打洞成功,需要保证**您的宽带默认为 FullCone NAT(全锥型 NAT,NAT1)**,如果为您的宽带为对称性 NAT,那么不好意思,本方法不适合您 此方法的原理类似 PCDN,**各大运营商都在大力打击**,将原先的 NAT1 改为 NAT4,所以无法使用此方法穿透,解决方法就是换一家运营商 本文提供的方法仅供家庭用户**轻量级**使用,**不会对运营商的网络设施造成破坏性干扰** <div class="tip inlineBlock info"> 从我实际测试来看,即使不是NAT1,我家里也是成功的 </div> ### 网络结构 先说说我家里的网络结构,跟很多人一样是旁路由结构。简单说说: ![image.png](https://imgki.com/usr/uploads/2024/10/3174408698.png) ## 如何设置 **原理将明白,划重点:** 1. 在软路由上部署Lucky,它可以把一个公网端口()绑定到Lucky服务内网端口 2. 再把Lucky服务内网端口通过Upnp服务映射到硬路由和内网服务,或者用Lucky的内置端口转发。 举个例子: 下面是一个Stun穿透的示例,公网端口是`22025`,Stun绑定`22025`到内网Lucky的`37621`端口,在通过Lucky的内置端口将`37621`转发到内网`10.0.0.2:3300`服务,这样就完成了一个转发。 ![image.png](https://imgki.com/usr/uploads/2024/10/1411736732.png) #### 具体设置 原理搞明白了,具体设置就好了。看下图: > 1. 名字随便起 > 2. 这里是指Stun的端口,随机就行,我们不关心。上文来就就是37621这个端口 > 3. 从Stun端口到内网服务端口,这里可以使用Lucky的内置转发(用手工或硬路由的UPNP),我这里用路由器的UPNP,一定要提前打开哦,并指向硬路由。 > 4. 硬路由的地址 > 5. 内网服务的ip和端口 ![image.png](https://imgki.com/usr/uploads/2024/10/2633239824.png) ### 关于Webhook 意的是,此时的端口号非永久,IP 地址也非永久,注意是两个各自非永久,即使 DDNS 了 IP 也无法 DDNS 端口,需要设置 DNS 的 **URL 记录**才能实现 目前没有 DDNS 程序支持设置 DNS 的 URL 记录,however,luckily,Lucky 支持 WebHook 和自定义脚本触发,有了 WebHook,可以调用 DNS 服务的 API 接口实现 DDNS(实际上 DDNS 程序的原理也不过如此) ## 关于PT下载 PT下载如果没有公网IP端口,基本属于无法联通状态,特别是大内网的情况下。但是利用Stun可以打通PT下载公网端口,大幅提升上传和下载速度。 但是,唯一的问题是公网端口是动态的,需要利用Qb的API自动修改端口。 ```yaml #接口地址 http://{ip地址:端口}/api/v2/app/setPreferences #请求头(POST) Content-type:application/x-www-form-urlencoded #请求内容 json={"listen_port":#{port}} ``` Last modification:October 21, 2024 © Allow specification reprint Like 如果觉得我的文章对你有用,请随意赞赏