【教程】搭建 CoreDNS


#!/bin/bash

echo "=== 开始配置 CoreDNS ==="

# 内部固定端口
DNS_PORT=53

# 生成随机端口的函数
generate_random_port() {
    local port
    while true; do
        port=$(shuf -i 10000-65535 -n 1)
        if ! netstat -tuln 2>/dev/null | grep -q ":$port "; then
            echo "$port"
            return 0
        fi
    done
}

# 检查本地配置
if [ -d "coredns-data" ]; then
    echo "警告:检测到本地已存在 CoreDNS 配置"
    read -p "是否清除现有配置并重新初始化?(y/N) " answer
    if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
        echo "清理现有配置..."
        rm -rf coredns-data Corefile docker-compose.yml
        echo "现有配置已清理"
    else
        echo "保留现有配置,退出脚本"
        exit 0
    fi
fi

echo "1. 生成随机端口..."
EXTERNAL_DNS_PORT=$(generate_random_port)

echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"

echo "2. 创建本地配置目录..."
mkdir -p coredns-data
echo "目录创建完成"

echo "3. 创建 CoreDNS 配置文件..."
cat > Corefile << EOL
. {
    bind 0.0.0.0
    forward . 8.8.8.8 8.8.4.4 {
        prefer_udp
        health_check 5s
    }
    cache 30
    reload
    log
    errors
    loadbalance
}
EOL
echo "CoreDNS 配置文件创建完成"

echo "4. 创建 docker-compose.yml..."
cat > docker-compose.yml << EOL
services:
  coredns:
    image: coredns/coredns:latest
    container_name: coredns
    restart: unless-stopped
    ports:
      - "\${EXTERNAL_DNS_PORT}:${DNS_PORT}/udp"
      - "\${EXTERNAL_DNS_PORT}:${DNS_PORT}/tcp"
    volumes:
      - ./Corefile:/Corefile
      - ./coredns-data:/data
    command: -conf /Corefile
    networks:
      - dns-network

networks:
  dns-network:
    driver: bridge
    external: false
EOL

cat > .env << EOL
EXTERNAL_DNS_PORT=$EXTERNAL_DNS_PORT
EOL

echo "配置文件创建完成"

echo "5. 创建管理脚本..."
cat > manage-dns.sh << EOL
#!/bin/bash
source .env

test_dns() {
    echo "测试 DNS 解析..."
    if dig @localhost -p \$EXTERNAL_DNS_PORT example.com +short; then
        echo "DNS 解析测试成功"
        return 0
    else
        echo "DNS 解析测试失败"
        return 1
    fi
}

case \$1 in
    start)
        echo "启动 CoreDNS..."
        docker compose down --remove-orphans 2>/dev/null
        docker compose up -d
        echo "CoreDNS 已启动"
        echo "外部 DNS 端口: \$EXTERNAL_DNS_PORT"
        sleep 2
        test_dns
        ;;
    stop)
        echo "停止 CoreDNS..."
        docker compose down
        ;;
    restart)
        echo "重启 CoreDNS..."
        docker compose restart
        sleep 2
        test_dns
        ;;
    status)
        docker compose ps
        ;;
    logs)
        docker compose logs -f
        ;;
    test)
        test_dns
        ;;
    *)
        echo "用法: \$0 {start|stop|restart|status|logs|test}"
        ;;
esac
EOL
chmod +x manage-dns.sh
echo "管理脚本创建完成"

echo "=== CoreDNS 配置完成! ==="
echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"

echo "你可以:"
echo "1. 编辑 Corefile 修改 DNS 配置"
echo "2. 编辑 docker-compose.yml 修改容器配置"
echo "3. 使用 './manage-dns.sh start' 启动服务"

echo "管理命令:"
echo "- ./manage-dns.sh start     # 启动服务"
echo "- ./manage-dns.sh stop      # 停止服务"
echo "- ./manage-dns.sh restart   # 重启服务"
echo "- ./manage-dns.sh status    # 查看状态"
echo "- ./manage-dns.sh logs      # 查看日志"
echo "- ./manage-dns.sh test      # 测试 DNS 解析"

# 询问是否立即启动服务
read -p "是否立即启动 CoreDNS?(y/N) " answer
if [ "$answer" = "y" ] || [ "$answer" = "Y" ]; then
    echo "启动 CoreDNS..."
    docker compose up -d
    echo "CoreDNS 已启动!"
    echo "外部 DNS 端口: $EXTERNAL_DNS_PORT"
    sleep 2
    ./manage-dns.sh test
fi

如果本文帮助到了你,帮我点个广告可以咩(o′┏▽┓`o)


评论
  目录