Skip to content

常见问题

本文档整理了 DNS-Go 部署和使用过程中的常见问题及解决方案。

安装部署问题

Q: 启动时提示 "配置文件不存在"

原因: 首次启动时没有找到配置文件

解决方案:

  1. 自动生成配置:

    bash
    # 运行程序,会自动生成配置模板
    ./dns-go-linux-amd64
    
    # 根据提示修改 config/config.toml
    vim config/config.toml
  2. 手动下载配置:

    bash
    mkdir -p config
    curl -o config/config.toml \
      https://gitee.com/liumou_site/dns-go/raw/master/vitepress/public/config.example.toml

Q: 数据库连接失败

错误信息:

failed to connect to database: connection refused

解决方案:

  1. 检查数据库服务状态:

    bash
    # PostgreSQL
    sudo systemctl status postgresql
    
    # MySQL
    sudo systemctl status mysql
  2. 检查数据库监听地址:

    bash
    sudo netstat -tlnp | grep -E '5432|3306'
  3. 验证连接信息:

    bash
    # PostgreSQL
    psql -h localhost -U dnsgo -d dns_go -c "SELECT 1;"
    
    # MySQL
    mysql -h localhost -u dnsgo -p -e "SELECT 1;"
  4. 检查防火墙:

    bash
    sudo iptables -L -n | grep -E '5432|3306'

Q: DNS 服务无法绑定 53 端口

错误信息:

bind: permission denied

原因: Linux/macOS 上 1024 以下端口需要 root 权限

解决方案:

方案 1:使用 root 权限运行

bash
sudo ./dns-go-linux-amd64

方案 2:授权程序绑定特权端口

bash
sudo setcap cap_net_bind_service=+ep ./dns-go-linux-amd64
./dns-go-linux-amd64  # 之后可以普通用户运行

方案 3:使用高位端口 + iptables 转发

bash
# 配置 DNS-Go 使用 5353 端口
# 然后配置 iptables 转发
sudo iptables -t nat -A PREROUTING -p udp --dport 53 -j REDIRECT --to-port 5353
sudo iptables -t nat -A PREROUTING -p tcp --dport 53 -j REDIRECT --to-port 5353

Q: 53 端口被占用

检查占用进程:

bash
sudo lsof -i :53
# 或
sudo netstat -tlnp | grep :53

常见占用者及处理:

systemd-resolved:

bash
# 停止 systemd-resolved
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved

# 修改 DNS 配置
sudo rm /etc/resolv.conf
sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf

其他 DNS 服务:

bash
# 停止其他 DNS 服务
sudo systemctl stop named
sudo systemctl stop dnsmasq

使用问题

Q: 登录时提示 "Token 无效"

可能原因:

  1. JWT 密钥已更改
  2. Token 已过期
  3. 浏览器缓存问题

解决方案:

  1. 清除浏览器缓存和 Cookie
  2. 重新登录
  3. 如果修改了 JWT 密钥,所有用户需要重新登录

Q: 域名解析不生效

排查步骤:

  1. 检查 DNS 服务状态:

    bash
    curl http://localhost:8085/api/dns/status
  2. 测试本地解析:

    bash
    dig @localhost www.example.local
  3. 检查域名状态:

    • 确保域名已启用
    • 确保解析记录已启用
    • 检查 TTL 设置
  4. 检查上游配置:

    • 确保上游 DNS 可用
    • 检查上游策略配置

Q: 缓存不生效

可能原因:

  1. Valkey/Redis 未连接
  2. 缓存配置错误
  3. TTL 设置为 0

解决方案:

  1. 检查缓存连接:

    bash
    redis-cli -h localhost ping
  2. 检查缓存配置:

    toml
    [valkey]
    ip = "127.0.0.1"
    port = 6379
  3. 检查程序日志中的缓存相关错误

Q: 如何重置管理员密码

通过数据库重置:

bash
# 生成新密码的 bcrypt 哈希
# 可以使用在线工具或程序生成

# PostgreSQL
sudo -u postgres psql -d dns_go -c "
UPDATE users 
SET password = '\$2a\$10\$...' 
WHERE username = 'admin';"

# MySQL
mysql -u dnsgo -p dns_go -e "
UPDATE users 
SET password = '\$2a\$10\$...' 
WHERE username = 'admin';"

注意: \$ 是转义的 $ 符号

性能问题

Q: DNS 查询响应慢

排查步骤:

  1. 检查上游 DNS 健康状态

    • 进入「上游管理」→「健康检查」
    • 确保上游 DNS 响应正常
  2. 检查缓存命中率

    • 进入「系统监控」
    • 查看缓存命中率统计
  3. 检查系统资源

    • CPU 使用率
    • 内存使用率
    • 网络延迟
  4. 优化建议:

    • 启用 Valkey/Redis 缓存
    • 调整上游策略
    • 优化健康检查间隔

Q: Web 界面加载慢

可能原因:

  1. 后端响应慢
  2. 前端资源加载慢
  3. 数据库查询慢

解决方案:

  1. 检查后端日志,找出慢查询
  2. 为数据库添加索引
  3. 检查网络连接质量

Q: 数据库连接数过多

错误信息:

too many connections

解决方案:

  1. 调整 PostgreSQL 最大连接数:

    conf
    max_connections = 200
  2. 调整 DNS-Go 连接池:

    toml
    [postgres]
    max_open_conns = 50
  3. 检查是否有连接泄漏

升级问题

Q: 如何升级到最新版本

Docker 部署:

bash
# 1. 备份数据
docker exec dns-go cp -r /app/data /app/data.backup

# 2. 拉取新镜像
docker pull ccr.ccs.tencentyun.com/liumou/dns-go:latest

# 3. 停止并删除旧容器
docker stop dns-go
docker rm dns-go

# 4. 启动新容器
docker run -d --name dns-go ...

二进制部署:

bash
# 1. 备份
sudo systemctl stop dns-go
cp /opt/dns-go/dns-go-linux-amd64 /opt/dns-go/dns-go-linux-amd64.backup

# 2. 下载新版本
wget -O /opt/dns-go/dns-go-linux-amd64 ...
chmod +x /opt/dns-go/dns-go-linux-amd64

# 3. 启动
sudo systemctl start dns-go

Q: 升级后数据丢失

预防措施:

  1. 升级前务必备份数据库
  2. 查看升级说明,了解是否有破坏性变更
  3. 先在测试环境验证升级

数据恢复:

bash
# 停止服务
sudo systemctl stop dns-go

# 恢复数据库
pg_restore -h localhost -U dnsgo -d dns_go backup.dump

# 启动服务
sudo systemctl start dns-go

安全相关问题

Q: 如何修改 JWT 密钥

编辑配置文件:

toml
[jwt]
secret_key = "your_new_secret_key_min_32_chars"

注意:

  • 修改后所有用户需要重新登录
  • 使用强随机字符串
  • 定期更换密钥

Q: 如何限制管理界面访问

方案 1:防火墙限制

bash
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 8085 -j ACCEPT
iptables -A INPUT -p tcp --dport 8085 -j DROP

方案 2:Nginx 反向代理

nginx
location / {
    allow 192.168.1.0/24;
    deny all;
    proxy_pass http://127.0.0.1:8085;
}

Q: 如何启用 HTTPS

使用 Nginx 反向代理:

nginx
server {
    listen 443 ssl;
    server_name dns-admin.example.com;
    
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    
    location / {
        proxy_pass http://127.0.0.1:8085;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

其他问题

Q: 日志文件过大

配置日志轮转:

bash
sudo tee /etc/logrotate.d/dns-go <<EOF
/opt/dns-go/logs/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 644 dnsgo dnsgo
    postrotate
        /bin/kill -HUP \$(cat /var/run/dns-go.pid 2>/dev/null) 2>/dev/null || true
    endscript
}
EOF

Q: 如何查看错误日志

Docker:

bash
docker logs -f dns-go

systemd:

bash
sudo journalctl -u dns-go -f

直接运行:

bash
tail -f /opt/dns-go/logs/app.log

Q: 如何导出所有配置

导出脚本:

bash
#!/bin/bash
EXPORT_DIR="/backup/export-$(date +%Y%m%d)"
mkdir -p $EXPORT_DIR

# 导出数据库
pg_dump -h localhost -U dnsgo dns_go > $EXPORT_DIR/database.sql

# 导出配置文件
cp -r /opt/dns-go/config $EXPORT_DIR/

# 打包
tar czf $EXPORT_DIR.tar.gz $EXPORT_DIR
rm -rf $EXPORT_DIR

echo "Export completed: $EXPORT_DIR.tar.gz"

获取帮助

如果以上解决方案无法解决您的问题:

  1. 查看日志:获取详细的错误信息
  2. 检查文档:查看相关功能文档
  3. 提交 Issue:在 Gitee 上提交问题
  4. 社区求助:加入 QQ 群讨论

联系方式:

基于 MIT 许可发布