一个现代化的动态 DNS 管理系统,用于监控公网 IP 变化并自动更新 Cloudflare DNS 记录。专为家庭服务器、NAS 和动态 IP 环境设计。
- STUN 协议 - 通过 STUN 服务器获取公网 IP,无需依赖第三方 API
- SSH 路由器 - 通过 SSH 连接路由器执行命令获取 IP
- 多提供者支持 - 可同时启用多个 IP 获取源,自动故障转移
- 灵活间隔 - 支持 1 秒至数小时的检查间隔
- Cloudflare 集成 - 自动更新 Cloudflare DNS 记录
- 多账户支持 - 管理多个 Cloudflare 账户
- 批量更新 - 支持多域名、多记录批量更新
- 自动重试 - 失败自动重试,最多 3 次
- 实时同步 - 配置变更后自动触发 DNS 同步
- 现代 UI - 基于 React 19 的现代化界面
- 深色模式 - 支持 Light / Dark / System 三种主题
- 国际化 - 支持中文和英文
- 实时推送 - WebSocket 实时推送 IP 变化,无需刷新
- 数据可视化 - IP 历史图表、DNS 更新统计
- 全屏模式 - 沉浸式数据查看
- Session 认证 - 基于 Cookie 的 Session 认证,支持 HttpOnly 和 SameSite
- CSRF 保护 - Synchronizer Token 模式防护
- API Key 哈希 - SHA-256 + Salt 存储,不明文保存
- 密码加密 - bcrypt (cost=12) 加密存储
- 速率限制 - 可配置的滑动窗口限流
- 安全头 - X-Frame-Options, CSP, X-Content-Type-Options 等
- 可信子网 - 内网 IP 白名单免认证
- SQLite - 默认使用 SQLite,零配置启动
- PostgreSQL - 支持生产级 PostgreSQL 部署
- 历史记录 - IP 变化历史、DNS 更新日志
- 自动清理 - 可配置的历史数据保留时间
# 1. 创建数据目录
mkdir data
# 2. 初始化配置(生成 API Key 和 docker-compose.yml)
docker run --rm -u $(id -u):$(id -g) -v $(pwd)/data:/data:rw ghcr.io/404700/idm:latest --init
# 3. 移动 docker-compose.yml 并启动
mv data/docker-compose.yml ./
docker compose up -d
# 4. 访问 Web 界面
# 打开浏览器访问 http://localhost:8080# 创建数据目录
mkdir data
# 运行容器
docker run -d \
--name idm \
-p 8080:8080 \
-v $(pwd)/data:/data \
-e TZ=Asia/Shanghai \
ghcr.io/404700/idm:latest
# 首次启动会自动生成 API Key,查看日志获取
docker logs idm# 从 Releases 下载对应平台的二进制文件
chmod +x idm
# 创建数据目录
mkdir data
# 运行(首次会生成默认配置)
./idm- 访问
http://localhost:8080 - 首次启动会显示初始化向导,设置管理员密码
- 登录后进入 Dashboard
在 设置 → IP 提供者 页面:
STUN 模式(推荐)
- 无需额外配置,使用公共 STUN 服务器
- 最小检查间隔:30 秒
SSH 路由器模式
- 配置路由器 SSH 连接信息
- 执行命令获取公网 IP(如
curl -s ifconfig.me) - 最小检查间隔:1 秒
- 在 Cloudflare 创建 API Token,权限:
Zone.DNS编辑 - 在 设置 → Cloudflare 账户 添加账户
- 输入 API Token 和需要更新的域名/记录
- 保存后自动触发 DNS 同步
在 设置 → 服务器 配置可信子网:
trusted_subnets:
- "127.0.0.1/32"
- "192.168.1.0/24"
- "10.0.0.0/8"来自这些 IP 的请求无需认证即可访问 API。
| 变量 | 描述 | 默认值 |
|---|---|---|
PORT |
服务端口 | 8080 |
TZ |
时区 | Asia/Shanghai |
DB_TYPE |
数据库类型 | sqlite |
DB_PATH |
SQLite 数据库路径 | /data/idm.db |
DB_HOST |
PostgreSQL 主机 | localhost |
DB_PORT |
PostgreSQL 端口 | 5432 |
DB_USER |
PostgreSQL 用户名 | idm |
DB_PASSWORD |
PostgreSQL 密码 | - |
DB_NAME |
PostgreSQL 数据库名 | idm |
DB_SSLMODE |
PostgreSQL SSL 模式 | disable |
server:
port: 8080
trusted_subnets:
- "127.0.0.1/32"
- "192.168.1.0/24"
websocket_allowed_origins: []
database:
type: "sqlite"
path: "/data/idm.db"
ip_providers:
- type: stun
enabled: true
properties:
servers: "" # 留空使用默认列表
- type: router_ssh
enabled: false
properties:
host: "192.168.1.1"
port: "22"
user: "root"
password: ""
command: "curl -s ifconfig.me"
cloudflare_accounts:
- name: "我的账户"
api_token: "your_cloudflare_api_token"
zones:
- zone_name: "example.com"
records: ["@", "www", "api"]
intervals:
ip_check: "5m" # IP 检查间隔
dns_update: "1m" # DNS 更新间隔
history_retention: "30d" # 历史保留时间
history_cleanup: "1d" # 清理间隔
security:
rate_limit_enabled: true
rate_limit_requests: 100
rate_limit_window: "1m"| 端点 | 方法 | 描述 |
|---|---|---|
/ |
GET | 主页(浏览器返回 SPA,curl 返回当前 IP) |
/ip |
GET | 获取当前公网 IP(纯文本) |
/health |
GET | 健康检查 |
/ws |
GET | WebSocket 连接 |
| 端点 | 方法 | 描述 |
|---|---|---|
/api/auth/csrf-token |
GET | 获取 CSRF Token |
/api/auth/login |
POST | 用户登录 |
/api/auth/logout |
POST | 用户登出 |
/api/auth/status |
GET | 获取认证状态 |
| 端点 | 方法 | 描述 |
|---|---|---|
/api/ip |
GET | JSON 格式 IP 信息 |
/api/status |
GET | 系统综合状态 |
/api/stats/history |
GET | 历史统计数据 |
/api/config |
GET/POST | 配置管理 |
/api/config/export |
GET | 导出 YAML 配置 |
/api/config/import |
POST | 导入 YAML 配置 |
/api/dns/update |
POST | 手动触发 DNS 更新 |
| 端点 | 方法 | 描述 |
|---|---|---|
/api/admin/users |
GET/POST | 用户管理 |
/api/admin/users/:id |
DELETE | 删除用户 |
/api/admin/sessions |
GET | Session 列表 |
/api/admin/sessions/:id |
DELETE | 删除 Session |
方式一:Session Cookie(推荐) 登录后自动设置 HttpOnly Cookie。
方式二:API Key
curl -H "X-API-Key: your_api_key" http://localhost:8080/api/config方式三:URL 参数
curl "http://localhost:8080/api/config?key=your_api_key"- Go 1.26+
- Node.js 18+
- SQLite3 或 PostgreSQL
cd idm
# 安装依赖
go mod download
# 运行开发服务器
go run ./cmd/idm
# 构建
go build -o idm ./cmd/idmcd idm/web
# 安装依赖
npm install
# 开发模式(自动代理到后端 :8080)
npm run dev
# 构建
npm run build
# 预览构建结果
npm run previewidm/
├── cmd/idm/main.go # 应用入口
├── config/ # 配置管理
│ ├── config.go # 配置结构与持久化
│ └── validation.go # 配置验证
├── db/ # 数据库层
│ ├── db.go # 连接与表初始化
│ └── config_store.go # 配置存储
├── dns/ # DNS 更新
│ └── cloudflare.go # Cloudflare API
├── ip/ # IP 获取
│ ├── provider.go # Provider 接口
│ ├── stun.go # STUN 协议
│ └── router.go # SSH 路由器
├── server/ # Web 服务
│ ├── server.go # HTTP 路由
│ ├── auth.go # 认证逻辑
│ ├── middleware.go # 中间件
│ └── websocket.go # WebSocket
├── web/ # 前端源码
│ ├── App.tsx # 主组件
│ ├── pages/ # 页面组件
│ └── services/ # API 封装
├── Dockerfile # 多阶段构建
└── docker-compose.yml # 部署配置
- 修改默认端口 - 不要使用默认的 8080 端口
- 配置可信子网 - 限制内网 IP 免认证范围
- 使用 HTTPS - 在反向代理(如 Nginx)启用 SSL
- 定期更换 API Key - 在设置中重新生成
- 启用速率限制 - 防止暴力破解
- 使用 PostgreSQL - 生产环境推荐使用 PostgreSQL
| 表名 | 描述 |
|---|---|
users |
用户账户 |
sessions |
登录会话 |
ip_history |
IP 变化历史 |
dns_updates |
DNS 更新记录 |
error_logs |
错误日志 |
check_logs |
检查日志统计 |
settings |
配置键值对 |
ip_providers |
IP 提供者配置 |
cloudflare_accounts |
Cloudflare 账户 |
欢迎提交 Issue 和 Pull Request!
本项目采用 非商业使用许可证。详见 LICENSE。
个人使用、教育用途、开源项目免费。 商业使用请联系作者获取授权。
- Echo - Go Web 框架
- React - UI 框架
- Cloudflare - DNS 服务
- Pion STUN - STUN 协议实现