动态DNS客户端

一款基于Rust的轻量级动态DNS客户端,支持多提供商和通过模型上下文协议(MCP)与AI助手集成。

  • by conradomateu
  • Rust
  • 本地部署
  • 更新于
在 GitHub 查看 ConradoMateu/rusty-dns

使用说明

生锈的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/

快速开始

  1. 创建配置文件:
mkdir -p ~/.config/rusty-dns
cat > ~/.config/rusty-dns/config.toml << 'EOF'
check_interval_secs = 300

[[providers]]
type = "cloudflare"
api_token = "$CF_API_TOKEN"
zone_id = "your-zone-id"
record_name = "home.example.com"
proxied = false
EOF
  1. 设置环境变量:
export CF_API_TOKEN="your-cloudflare-api-token"
  1. 运行:
rusty-dns status    # Check current status
rusty-dns update    # Update DNS records
rusty-dns daemon    # Run as daemon

建筑

flowchart LR
    subgraph Detection
        IP[IP Detector] -->|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
    end

CLI命令

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 -f

macOS(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