CoreDNS trên Linux: Thay thế Bind9 để vận hành Microservices mượt mà hơn

Network tutorial - IT technology blog
Network tutorial - IT technology blog

6 tháng chia tay Bind9 và bài học từ CoreDNS

Sau nửa năm vác CoreDNS lên production, mình rút ra kết luận: Nếu Bind9 là chiếc xe tải cũ nồi đồng cối đá, thì CoreDNS chính là một chiếc Tesla – nhanh, nhạy và cực kỳ ít phải bảo trì. Nếu bạn từng đau đầu vì cú pháp zone file loằng ngoằng của Bind9 hay việc reload cấu hình mất hàng giây, CoreDNS sẽ thay đổi hoàn toàn trải nghiệm đó.

CoreDNS viết bằng Go, cực nhẹ (chỉ tốn khoảng 15-30MB RAM cho cluster nhỏ) và vận hành dựa trên cơ chế Plugin. Cần ghi log? Dùng plugin. Muốn forward DNS sang Google? Có plugin. Thậm chí, nó là DNS mặc định của Kubernetes. Điểm ăn tiền nhất là file cấu hình (Corefile) rất trực quan, đọc qua là hiểu ngay luồng xử lý request đi đâu về đâu.

Triển khai nhanh CoreDNS trong 5 phút

Thay vì nói lý thuyết, chúng ta sẽ cài bản binary trực tiếp lên Ubuntu/CentOS để thấy nó đơn giản thế nào.

1. Tải và cài đặt

# Tải bản release (Ví dụ v1.11.1)
wget https://github.com/coredns/coredns/releases/download/v1.11.1/coredns_1.11.1_linux_amd64.tgz

# Giải nén và chuyển vào bin hệ thống
tar -xzvf coredns_1.11.1_linux_amd64.tgz
sudo mv coredns /usr/local/bin/

2. Tạo file cấu hình Corefile

Tạo một file tên Corefile. Đây là nơi chứa toàn bộ logic điều hướng DNS của bạn:

.:53 {
    forward . 8.8.8.8 1.1.1.1
    log
    errors
}

3. Chạy thực tế

# Chạy với quyền sudo để chiếm port 53
sudo coredns -conf Corefile

Hãy mở terminal mới và gõ dig @localhost google.com. Nếu terminal CoreDNS nhảy log tức thì, bạn đã cấu hình đúng. Tốc độ phản hồi thường chỉ tính bằng mili giây.

Giải mã cấu trúc Corefile

Cấu trúc CoreDNS xoay quanh Server Blocks. Mỗi block đại diện cho một zone hoặc một port cụ thể. Bên trong đó là các Plugins đóng vai trò như các trạm kiểm soát.

Một lưu ý quan trọng: Thứ tự plugin ghi trong Corefile không ảnh hưởng đến thứ tự thực thi. Thứ tự này đã được hard-code trong file plugin.cfg khi biên dịch. Điều này nghe có vẻ gò bó nhưng lại giúp hệ thống cực kỳ ổn định, tránh việc các plugin đá nhau.

Cấu hình DNS nội bộ (Internal Domain)

Giả sử bạn có dàn server .itfromzero.lan. Khi chia subnet cho dàn này, nếu lười tính toán thủ công, mình hay dùng IP Subnet Calculator để lấy nhanh dải IP và Broadcast. Việc này giúp file cấu hình network chuẩn xác ngay từ đầu.

Đây là cách mình map domain nội bộ trong Corefile:

itfromzero.lan {
    hosts {
        10.0.0.10 web.itfromzero.lan
        10.0.0.11 api.itfromzero.lan
        fallthrough
    }
    log
}

. {
    forward . 8.8.8.8
    cache 30
}

Trong đó:

  • Domain itfromzero.lan được xử lý riêng qua plugin hosts.
  • Mọi request khác được đẩy sang Google DNS.
  • cache 30 giúp giảm tải đáng kể cho đường truyền quốc tế bằng cách lưu kết quả trong 30 giây.

Tối ưu cho môi trường Production

Vận hành như một Systemd Service

Để CoreDNS tự sống lại sau khi server reboot, hãy tạo service file. Trước đó, nhớ tạo user riêng bằng lệnh sudo useradd -r -s /usr/sbin/nologin coredns để đảm bảo bảo mật.

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
User=coredns
ExecStart=/usr/local/bin/coredns -conf /etc/coredns/Corefile
Restart=on-failure

Plugin Rewrite: “Cứu cánh” khi đổi tên Service

Có lần mình cần đổi tên API từ cũ sang mới mà không muốn sửa code ở hàng chục client. Plugin rewrite đã xử lý trong 1 nốt nhạc:

rewrite name old-api.lan new-api.lan

Kinh nghiệm thực chiến

1. Luôn bật Plugin Health: Thêm health :8080 vào Corefile. Các công cụ như Uptime Kuma hay Load Balancer sẽ dựa vào endpoint này để biết DNS có đang “thở” hay không.

2. Giám sát bằng Prometheus: Chỉ cần dòng prometheus :9153, bạn sẽ có ngay dashboard xịn xò để soi latency và tỷ lệ request lỗi.

3. Xử lý xung đột Port 53: Trên Ubuntu, systemd-resolved thường chiếm port 53. Nếu CoreDNS báo lỗi address already in use, bạn cần tắt nó đi bằng lệnh sudo systemctl stop systemd-resolved.

4. Chặn tấn công DNS: Sử dụng plugin acl để chỉ cho phép các dải IP nội bộ query, tránh việc server bị lợi dụng để tấn công khuếch đại DNS (DNS Amplification).

Tóm lại

CoreDNS là lựa chọn hàng đầu nếu bạn cần sự linh hoạt và nhẹ nhàng. Việc quản trị nó nhàn hơn Bind9 rất nhiều. Bạn hãy thử cài đặt cho môi trường lab trước khi đưa lên production. Nếu gặp khó khăn khi chia subnet hay cấu hình zone, cứ để lại bình luận phía dưới nhé!

Share: