从心动到绝望再到等待:我的本地服务器迁移折腾记
希望的开始,发现树莓派开发板
最近刷到不少关于树莓派以及各类国产开发板的分享,看着大家用小巧的板子搭建起自己的本地服务,那种“我的数据我做主”的掌控感瞬间戳中了我。
联想到自己一直在用的腾讯云服务器,每年还要花一笔不小的费用,一个大胆的想法在我心里冒了出来:把服务器迁移回本地,用开发板搭建专属服务!

心动不如行动,晚上直接开启了“熬夜模式”,在各大购物平台上疯狂浏览各种“派”的开发板。
从配置参数到价格对比,再到网友的使用测评,看得我热血沸腾。当场就下单了orange pi 4 pro,买完之后我突然冷静下来——万一本地网络不支持,那不是摆设了?
想想还是退掉了,决定先拿家里的台式机做个测试,看看网络环境到底行不行。

开始验证可行性
第二天一早就忙活起来,在台式机上部署了一个简单的静态页面。本以为能顺利通过外网访问,结果浏览器显示“无法访问此网站”。家庭宽带默认是没有公网IP的,外网根本找不到我的设备。
拨通了电信客服的电话,说明想要申请公网IP的需求。客服态度还算不错,说可以办理,挂电话前我还特意反复确认了好几遍,确保已经成功开通。
本以为这样就能顺利推进,结果测试下来还是无法访问,瞬间有种被泼了冷水的感觉。
没办法,只能再次联系电信报修。没过多久,维修师傅回我电话,告诉我问题出在SDN网关上,这种网关下即便开通了公网IP也没法实现外网访问,除非升级到更高费用的宽带套餐。
一听就无语了,心里直接开始骂娘了。。。

实在不甘心,又跟师傅反复沟通了半天,说明自己只是个人测试使用,升级套餐实在不划算。
也许是我的坚持起了作用,师傅最终松口说,还有个办法——让我自己买个路由器,他们把SDN网关桥接到我的路由器上,这样或许能解决问题。
我赶紧回家翻出之前用的华为路由器,发现只有一个网线口,没办法只能重新买一个。
当天晚上我就直奔商场,对比了几款路由器后,最终入手了小米的AX3000E。拎着新路由器回家的路上,我一路都在畅想成功后的场景,脚步都轻快了不少。

回家后立刻动手设置,按照师傅说的方法进行桥接配置,尝试拨号上网,一次就成功了!
然后就是各种wifi链接、家里各种设备都要重新连接。。。折腾了一气

都弄好了,再部署静态页面,设置好端口转发,打开浏览器输入路由器的WAN IP——页面竟然成功加载出来了!那一刻我兴奋得差点跳起来,以为这下总算搞定了。
解决了访问问题,接下来就是域名解析了。
我之前在腾讯云注册过一个域名,直接登录后台把域名解析到了当前的IP上。
不过家庭宽带的公网IP大多是动态的,说不定什么时候就变了,到时候域名就失效了。我还特意去研究了小米路由器的SSH访问权限破解方法,折腾了好一阵子才成功解锁。
之后我又单独写了一个DDNS动态解析的shell脚本,测试了一下,发现只要IP发生变化,脚本就能自动把新的IP更新到域名解析记录里。
#!/bin/sh
# 腾讯云DDNS更新脚本(带IP变化判断,适配小米路由器)
SECRET_ID="xxxxx"
SECRET_KEY="xxxxxxxx"
DOMAIN="www.xxxxx.com" # 你的子域名
RECORD_ID="xxxxxx" # 你的A记录ID
RECORD_TYPE="A"
TTL="600"
# 定义IP缓存文件(保存上一次的公网IP)
IP_CACHE_FILE="/data/last_ddns_ip.txt"
# 定义日志文件
LOG_FILE="/data/ddns.log"
# ========== 1. 获取公网IP(保留之前的可靠方式) ==========
# 方式1:从小米路由器WAN口直接获取公网IP
NEW_IP=$(ubus call network.interface.wan status | jsonfilter -e '@["ipv4-address"][0]["address"]')
# 检查IP是否获取成功
if [ -z "$NEW_IP" ]; then
echo "[$(date)] 错误:公网IP获取失败!" >> $LOG_FILE
exit 1
fi
# ========== 2. 新增:IP变化判断逻辑 ==========
# 读取旧IP(若缓存文件不存在,旧IP为空)
OLD_IP=""
if [ -f "$IP_CACHE_FILE" ]; then
OLD_IP=$(cat "$IP_CACHE_FILE")
fi
# 对比新旧IP
if [ "$NEW_IP" = "$OLD_IP" ]; then
# IP未变化,仅记录日志,不执行更新
echo "[$(date)] 公网IP未变化(当前IP:$NEW_IP),无需更新DNS。" >> $LOG_FILE
exit 0
else
# IP已变化,执行更新操作
echo "[$(date)] 公网IP已变化(旧IP:$OLD_IP → 新IP:$NEW_IP),开始更新DNS..." >> $LOG_FILE
fi
# ========== 3. 执行腾讯云DNS更新 ==========
RESULT=$(curl -s -X POST "https://dnsapi.cn/Record.Ddns" \
-d "login_token=${SECRET_ID},${SECRET_KEY}" \
-d "format=json" \
-d "domain=${DOMAIN#*.}" \
-d "sub_domain=${DOMAIN%%.*}" \
-d "record_id=${RECORD_ID}" \
-d "record_type=${RECORD_TYPE}" \
-d "record_line=默认" \
-d "value=${NEW_IP}" \
-d "ttl=${TTL}")
# ========== 4. 验证更新结果并更新缓存文件 ==========
# 检查更新是否成功(腾讯云API返回json中包含"code":"1"表示成功)
if echo "$RESULT" | grep -q '"code":"1"'; then
# 更新成功,写入新IP到缓存文件
echo "$NEW_IP" > "$IP_CACHE_FILE"
echo "[$(date)] DNS更新成功!新IP:$NEW_IP,腾讯云返回:$RESULT" >> $LOG_FILE
else
# 更新失败,不修改缓存文件
echo "[$(date)] DNS更新失败!新IP:$NEW_IP,腾讯云返回:$RESULT" >> $LOG_FILE
exit 1
fi
当我用域名成功访问到本地部署的页面时,那种成就感真的难以言表,感觉之前所有的折腾都值了。

然而,快乐并没有持续多久。突然想到,之前测试用的都是家里的WiFi,要是用手机流量访问会怎么样?赶紧关掉手机无线,再次输入域名——页面竟然又打不开了!我反复试了好几次都不行,赶紧去查看路由器设置,这才发现路由器的WAN IP竟然是100.xx开头的。

查了资料才知道,这根本不是真正的公网IP,而是电信大NAT网络下的内网IP。一瞬间,之前的兴奋和成就感全没了,只剩下深深的绝望,只能寄希望于第二天再问问电信师傅。
绝望还是等待。。。
第三天,迫不及待地给电信师傅打了电话。没想到师傅的回复直接让我气不打一处来,他竟然说“你别用电信了,去用移动或者联通吧”,还说他们这边都配置好了,也不知道是什么原因。我又耐着性子跟他磨了半天,他才不情不愿地说,等元旦过了同事上班了,再帮我问问。
挂了电话,看着电脑屏幕上的配置记录,心里满是无奈。从最初的心动,到中间的兴奋,再到现在的哭笑不得,这几天的折腾就像一场过山车。现在也只能乖乖等元旦假期结束,希望到时候能有个解决方案吧。唉,折腾之路漫漫,我还在继续等待……