家宽公网 IP 变了怎么办?手搓一个 DDNS + TG Bot 控制面板

DDNS工作原理示意图

DDNS 动态解析与公网 IP 变更示意图

对于喜欢在家里拿小主机跑服务的朋友来说,运营商的动态公网 IP 绝对是最大的痛点之一。

虽然市面上有不少现成的 DDNS 方案,比如云厂商自带的、路由器插件之类的,但作为一名爱折腾的极客,总觉得少了点什么。要是能集成到我们每天都在用的 Telegram 里,发一条消息就能获取 IP、更新解析,甚至查看服务状态,那该多爽?

今天就来分享如何低成本、高效率地手搓一个属于自己的 DDNS + Telegram Bot 面板

为什么选择自建面板?

你可能问,现成的花生壳、Docker 一键包不好吗?

  1. 隐私掌控:数据都在自己手里,不用担心第三方服务跑路或泄露隐私。
  2. 高度定制:你可以随意扩展功能,比如加上 CPU 监控、简单的开关机指令,甚至把 Bot 变成你的「服务器遥控器」。
  3. 无 UI 依赖:有时候终端界面比花花绿绿的 Web 面板更高效,尤其是在手机上,打开 TG 发个指令比登录后台快多了。

核心思路解析

其实这个项目的原理非常简单,主要分为三个部分:

  1. IP 获取模块:负责定时检测当前的公网 IP 地址。
  2. 域名解析模块:通过 DNS 服务商(如 Cloudflare、阿里云等)提供的 API,将域名指向新的 IP。
  3. Telegram Bot 接口:作为「中间人」,接收你的指令,触发脚本执行,并把结果回传给你。

准备工作

在开始码代码之前,你需要准备好以下几样东西:

  • 一台 24 小时运行的设备:可以是家里的小主机(N1、OpenWrt 软路由等),也可以是便宜的 VPS。
  • 一个域名:用于做 DDNS 解析。
  • Telegram Bot Token:找 @BotFather 申请一个新 Bot,拿到 Token。
  • 你的 Telegram User ID:为了安全,只接受你自己的指令。
  • DNS API Token:以 Cloudflare 为例,需要在后台获取 Global API Key 或编辑特定域名的 API Token。

实战部署步骤

这里推荐使用 Python 或 Node.js 来编写,因为它们对 HTTP 请求的处理非常友好。下面以逻辑流程为主,具体实现可根据自己熟悉的语言调整。

第一步:构建简易的 DDNS 核心

Telegram Bot 交互示例

通过 Telegram 指令控制 DDNS 和服务器状态的示例

不管你用什么语言,核心逻辑就是:

# 伪代码逻辑
old_ip = read_from_file('ip.txt')
current_ip = get_public_ip() # 访问 ip.sb 或类似服务获取

if current_ip != old_ip:
    result = call_dns_api(domain, current_ip) # 调用 Cloudflare API
    if result['success']:
        write_to_file('ip.txt', current_ip)
        send_tg_message(f"IP 更新成功:{current_ip}")
    else:
        send_tg_message(f"更新失败:{result['msg']}")
else:
    pass # IP 未变动,无需操作
``

**坑点提醒**:
获取公网 IP 时,建议多备几个 API 接口(如 ip.sb, ipinfo.io 等),防止单个服务挂掉导致脚本报错。

### 第二步:接入 Telegram Bot

这一步是让脚本「活」起来的关键。

1.  **长轮询 还是 Webhook?**
    *   如果是跑在 VPS 上且有域名配置 SSL,推荐 **Webhook**,实时性高且省资源。
    *   如果是跑在家宽设备且没有公网 IP(或者 80/443 端口被封),老老实实用 **Long Polling**(轮询)。虽然稍微耗点电,但胜在部署简单。

2.  **指令设计**
    设计几个简单的指令,例如:
    *   `/ip`:立即触发检查并回传当前 IP。
    *   `/update`:强制更新 DNS 解析,忽略本地缓存。
    *   `/status`:返回设备简单的运行状况(如 CPU、内存占用),帮你判断是不是该重启了。

### 第三步:进程守护与定时任务

脚本写好了,不能让他挂掉。

*   **Systemd**:写一个简单的 `.service` 文件,设置 `Restart=on-failure`,保证崩溃自动重启。
*   **Cron**:虽然 Bot 指令可以触发更新,但最好也加一个 Cron 任务(比如每 10 分钟)静默检查一次 IP。毕竟有时候网络波动,IP 悄悄变了你却不知道。

## 进阶玩法与思考

当你完成了基础的 DDNS 功能后,其实这已经不仅仅是一个 DDNS 工具了,而是一个通用的 **Telegram 服务器管理入口**。

*   **结合 Docker**:你可以扩展指令,让 Bot 帮你重启某个 Docker 容器。比如发 `/restart plex`,Bot 调用 shell 命令执行 `docker restart plex` 并回复结果。
*   **安全加固**:一定要校验 User ID,并在代码里做异常处理,防止被恶意刷流量导致 API 额度耗尽。
*   **多域名支持**:如果你有好几个域名,可以设计一个配置文件,Bot 启动时读取,支持通过参数指定更新哪个域名,例如 `/update domain1.com`。

## 总结

造轮子最大的乐趣不在于功能本身,而在于理解其背后的运行机制。

通过这个项目,你不仅解决了家宽动态 IP 的烦恼,还顺便掌握了 Telegram Bot 的开发、DNS API 的调用以及简单的进程守护技巧。整个过程下来,比直接用别人的 Docker 镜像要有成就感得多。

如果你是新手,建议先从 Python 的 `python-telegram-bot` 库入手,配合 Cloudflare 的 API 文档,半天时间就能搞定。

赶紧去试试吧,下次 IP 变了,你的手机会第一时间收到消息通知!

标签: none

评论已关闭