生锈的dns
动态DNS客户端,支持人工智能助手的MCP。
一个轻量级的、基于Rust的DDNS客户端,支持多个提供者,并通过模型上下文协议(MCP)与AI助手集成。
特性
- 多提供商支持:Cloudflare、Namecheap、DuckDNS、GoDaddy
- MCP集成:通过Claude Code或其他AI助手进行配置和管理
- 守护程序模式:作为后台服务运行,检查间隔可配置
- 环境变量:通过以下方式保护机密
$VAR_NAME语法 - 远程管理:支持Raspberry Pi/服务器管理的SSH隧道
安装
# Build from source
cargo build --release
# Install
cp target/release/rusty-dns ~/.local/bin/快速开始
- 创建配置文件:
mkdir -p ~/.config/rusty-dns
cat > ~/.config/rusty-dns/config.toml |check| PUB[Public IP Services]
PUB -->|"ipify/icanhazip"| IP
end
subgraph Update
IP -->|"changed?"| CMP{Compare}
CMP -->|yes| PROV[Providers]
CMP -->|no| WAIT[Wait interval]
WAIT --> IP
end
subgraph Providers
PROV --> CF[Cloudflare]
PROV --> NC[Namecheap]
PROV --> DD[DuckDNS]
PROV --> GD[GoDaddy]
end
subgraph MCP
MCP_S[MCP Server] -->|stdio| AI[Claude Code]
AI -->|ddns_status| MCP_S
AI -->|ddns_update| MCP_S
endCLI命令
rusty-dns status # Show current IP and provider status
rusty-dns update # Update DNS if IP changed
rusty-dns update --force # Force update even if unchanged
rusty-dns daemon # Run as daemon (default: 5 min interval)
rusty-dns daemon -i 60 # Custom interval (60 seconds)
rusty-dns mcp # Run MCP server over stdio
rusty-dns validate # Validate configuration配置
配置文件
地点: ~/.config/rusty-dns/config.toml
# Check interval (default: 300 seconds)
check_interval_secs = 300
# IP detection services (optional, has sensible defaults)
ip_services = [
"https://api.ipify.org",
"https://icanhazip.com",
"https://ifconfig.me/ip",
"https://ipecho.net/plain"
]
# Cloudflare provider
[[providers]]
type = "cloudflare"
api_token = "$CF_API_TOKEN"
zone_id = "abc123"
record_name = "vpn.example.com"
proxied = false
# Namecheap provider
[[providers]]
type = "namecheap"
domain = "example.com"
host = "vpn"
password = "$NAMECHEAP_DDNS_PASSWORD"
# DuckDNS provider
[[providers]]
type = "duckdns"
domains = "mysubdomain"
token = "$DUCKDNS_TOKEN"
# GoDaddy provider
[[providers]]
type = "godaddy"
api_key = "$GODADDY_API_KEY"
api_secret = "$GODADDY_API_SECRET"
domain = "example.com"
name = "vpn"
ttl = 600环境变量
Secrets可以使用以下方式引用环境变量 $VAR_NAME 语法:
export CF_API_TOKEN="your-cloudflare-token"
export DUCKDNS_TOKEN="your-duckdns-token"MCP集成
通过SSH进行远程配置
sequenceDiagram
participant CC as Claude Code
participant SSH as SSH Tunnel
participant RD as rusty-dns MCP
participant DNS as DNS Providers
CC->>SSH: MCP request (JSON-RPC)
SSH->>RD: Forward to rusty-dns mcp
RD->>DNS: API calls
DNS-->>RD: Response
RD-->>SSH: MCP response
SSH-->>CC: Result在Claude代码中配置(~/.claude/mcp_servers.json):
{
"rusty-dns": {
"command": "ssh",
"args": ["-t", "pi@raspberrypi", "rusty-dns", "mcp"]
}
}可用的MCP工具
| 工具 | 说明 |
|---|---|
ddns_status | 获取当前IP、提供商状态、上次更新时间 |
ddns_update | 强制DNS更新(使用 force: true 即使未更改也要更新) |
ddns_history | 获取最近更新历史记录 |
ddns_test_provider | 测试特定提供商的连接 |
ddns_add_provider | 获取添加提供程序的说明 |
ddns_remove_provider | 获取删除提供程序的说明 |
MCP会话示例
> Use rusty-dns to check my current IP and provider status
The rusty-dns tool shows:
- Current public IP: 203.0.113.42
- Cloudflare (vpn.example.com): 203.0.113.42 (healthy)
- DuckDNS (home.duckdns.org): 203.0.113.42 (healthy)
- Last update: 2024-01-15T10:30:00Z
> Force update all DNS records
Updated 2 providers:
- Cloudflare: OK (IP unchanged)
- DuckDNS: OK (IP unchanged)服务安装
Linux(systemd)
# Copy service file
sudo cp systemd/rusty-dns.service /etc/systemd/system/
# Create environment file for secrets
sudo mkdir -p /etc/rusty-dns
sudo cat > /etc/rusty-dns/env << 'EOF'
CF_API_TOKEN=your-cloudflare-token
DUCKDNS_TOKEN=your-duckdns-token
EOF
sudo chmod 600 /etc/rusty-dns/env
# Enable and start
sudo systemctl daemon-reload
sudo systemctl enable --now rusty-dns
# Check status
sudo systemctl status rusty-dns
journalctl -u rusty-dns -fmacOS(launchd)
系统范围守护进程 (以root身份运行,从启动时开始):
# Copy daemon plist
sudo cp launchd/com.rusty-dns.daemon.plist /Library/LaunchDaemons/
# Create working directory
sudo mkdir -p /var/lib/rusty-dns
# Load and start
sudo launchctl load -w /Library/LaunchDaemons/com.rusty-dns.daemon.plist
# Check status
sudo launchctl list | grep rusty-dns
tail -f /var/log/rusty-dns.log用户代理 (以当前用户身份运行,从登录时开始):
# Copy agent plist
cp launchd/com.rusty-dns.agent.plist ~/Library/LaunchAgents/
# Load and start
launchctl load -w ~/Library/LaunchAgents/com.rusty-dns.agent.plist
# Check status
launchctl list | grep rusty-dns
tail -f /tmp/rusty-dns.log卸载:
# System daemon
sudo launchctl unload /Library/LaunchDaemons/com.rusty-dns.daemon.plist
sudo rm /Library/LaunchDaemons/com.rusty-dns.daemon.plist
# User agent
launchctl unload ~/Library/LaunchAgents/com.rusty-dns.agent.plist
rm ~/Library/LaunchAgents/com.rusty-dns.agent.plist提供商
云耀
使用Cloudflare API v4。要求:
- 带有的API令牌
Zone:DNS:Edit许可 - 区域ID(在Cloudflare仪表板中找到)
- 现有DNS记录名称
Namecheap:名便宜
使用Namecheap动态DNS。要求:
- 域名已在Namecheap注册
- 动态DNS密码(来自高级DNS设置)
- 为主机启用动态DNS
DuckDNS
免费DDNS服务。要求:
- DuckDNS子域名
- DuckDNS令牌(来自DuckDNS.org)
GoDaddy
使用GoDaddy域API。要求:
- API密钥和秘密(来自developer.godaddy.com)
- 生产API访问(非OTE)
发展
# Build
cargo build
# Test
cargo test
# Run in development
cargo run -- status
# Build release
cargo build --release许可证
麻省理工学院或阿帕奇-2.0
