碎碎念
平时玩个人服务器的话,其实玩了已经有个两年了,其实一直有一个问题就是,网络可访问性,也就是所谓的有没有公网IP
在和朋友聊天的时候,灵机一动,突然想到一个很好的主意,就赶紧来实践了

之前的话,我就是执着于向运营商讨要公网 IPv4。以至于最开始我在办这个校园宽带的时候就是一直问宽带师傅可不可以以获取动态的公网IP。结果当初师傅答应的满嘴好好好等我把宽带装上之后,师傅就不理我了,也不给我要IP,打了很多次运营商的投诉电话了也没有用,总之就是不给。
中间也尝试了搭建跳板,但是搭建跳板受限与买的云服务器的带宽,一般云服务器带宽只有几兆,速度慢的很。
原本也不是没有想过使用IPV6,但是之前总是发现在一些网络环境下,其实是没有IPV6可以用的。在这种环境下访问ipv6的网页服务的话就很恼火。
但在现在的话的网络基建下,我发现思路该转变了:我可以用!!!!IPv6!!!!,配合动态域名解析+边缘加速节点,才是真正安全、速度快,甚至比P2P访问更好的解法。因为边缘加速节点相当于是把IPV6的流量转换成了IPV4,部署的网页服务和各种HTTP请求几乎在任何网络环境下都可以访问。
顶多实际在·ssh运维访问的时候可能需要用手机流量(边缘加速节点只能加速HTTP协议,如果没有ipv6的环境下,手机流量是稳定的ipv6来源进行其他的协议的访问)
这篇博客记录了我近期,分为“Web 服务加速对外暴露”和“内网核心设备安全穿透”两个部分。
一、 Web 服务提速:双域名回源 + 边缘加速节点
我的工位的环境是校园网,没有公网 IPv4,还有很多其他的地方和环境没有,但我的服务器寝室里的主机以及家里的服务器,拥有原生公网 IPv6 地址。如果直接用 IPv6 裸奔对外提供 Web 服务(比如博客、照片墙、私有云盘),不仅有一定的安全风险,而且一旦遇到没有 IPv6 环境的访客,直接就会失联。
我的当前的解决方案是:“双域名动态回源 + 边缘 CDN 代理”。
1. 核心架构设计
底层基座(DDNS): 实体服务主机跑在 Docker 里的
ddns-go实时监测 IPv6 地址变化,并将其动态解析道到一个专用的域名上(例如ipv6.AAA.com)。(注意,这个域名可以是没有备案的,因为你反正也部署服务尽量不要部署到实体机的80和443端口,避免一些不必要的麻烦)具体的ddns-go部署教程之前有写过
ddns-go 部署教程
对外网关(边缘 CDN): 使用已备案的主域名(例如
www.BBB.com)接入国内的边缘加速节点(或 Cloudflare)。注意,如果想在国内体验到最好的效果的话,只能对域名进行备案,域名备案。具体的边缘加速节点的使用方法,之前也写过了。
边缘加速阶段使用方法
配合: 在 CDN 的控制台中,将“回源地址”填写为上面的专用域名
ipv6.AAA.com。同时,强制指定“回源 Host”为专用域名。
2. 具体效果
这套方案跑通后,带来的效果是比较好的:
1、图片和静态资源基本上是“秒开”: 以前受限于跳板机的中转带宽,加载全是图片的博客首屏需要转圈。现在,高达十几MB 的图片、前端框架被国内的边缘机房物理缓存。再加上 HTTP/2以上的协议 的多路复用加持,多图页面几乎是瞬间打开,比很多大型商业网站还要快。
2、可以实现源站隐身: 物理机器的公网 IPv6 被藏在 CDN加速节点的后面。外部访问的话只能看到边缘节点的 IP,一定程度上可以阻挡部分端口扫描。
3、一定程度缓解运营商限速: 传统 P2P 打洞(如 UDP 穿透)经常被运营商 QoS 限速,现在的话走标准的 TCP/HTTPS 通道。
二、 遇到的BUG,为什么能 Ping 通 IPv6机器,但是却连不上 SSH
解决了 Web 服务的访问,接下来是运维管理的核心:SSH。
我在外网测试时遇到了一个诡异的现象:ping6 宿舍主机的公网 IPv6,延迟极低(3~4ms),说明底层路由极其通畅;但一旦执行 ssh,就会一直卡住直到连接超时。

经过排查,本地防火墙(UFW)是没问题的,ss -tulpn 也显示 22 端口正在监听 [::]:22。

具体原因光猫的 IPv6 SPI 防火墙。
运营商光猫(例如联通光猫)出厂时,为了保护内网安全,默认开启了 Ipv6spi(状态检测防火墙)。它的逻辑是:允许 Ping 测试(ICMPv6),但丢弃所有从外网主动发起的 TCP 连接。
解决办法:
登录光猫的超级管理员后台(或高级配置页面)。
找到【防火墙设置】,取消勾选
Ipv6spi。
所以说我尝试通过公网服务器作为跳板机,访问寝室里面的那台光猫(192.168.0.1)的管理后台。
最开始,我使用的 SSH 本地端口转发:
ssh -L 2022:192.168.0.1:80 yanchang@跳板机IP -p 9022
隧道通了,但在浏览器输入 localhost:2022/cu.html ,浏览器提示400 Bad Request。

为什么会报 400?
询问AI得知,光猫这种嵌入式设备的 Web 服务有 Host 头校验。如果光猫的IP 是 192.168.0.1,但接收到的 HTTP 请求头是 Host: localhost:2022,认为这是跨站伪造或非法请求。
解决方案:SOCKS5 动态端口转发
不要用 -L 强行映射单个端口,而是用 -D 把 SSH 变成一个全能的全局代理。
第一步:修改 SSH 启动命令,开启动态代理
ssh -D 2022 yanchang@跳板机IP -p 9022
这条命令会在本地笔记本上开启一个 127.0.0.1:2022 的 SOCKS5 代理。
第二步:配置浏览器 使用 Proxy SwitchyOmega (或 Zero Omega) 插件,新建一个代理情景模式:
协议(Protocol): 必须选择 SOCKS5(千万别选 HTTP)。
代理服务器:
127.0.0.1端口:
2022

第三步:像在物理内网一样访问,开启代理插件后,直接在浏览器地址栏输入内网的真实 IP: 👉 http://192.168.0.1/cu.html

此时,浏览器发送的 Host 头就是完美的 192.168.0.1。光猫会认为你就是一根网线直接插在它机身上的普通电脑。
然后进行
登录光猫的超级管理员后台(或高级配置页面)。
找到【防火墙设置】,取消勾选
Ipv6spi。
安全警告:
关闭光猫防火墙后,主机相当于彻底裸露在公网。务必立刻在服务器本机开启 UFW 防火墙,仅放行 22 和 443 等必要端口(sudo ufw allow 22/tcp)。
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose