ตั้ง BIND9 DNS Server บน VPS Ubuntu

ตั้ง BIND9 DNS Server บน VPS Ubuntu

มิถุนายน 2026 · อ่าน 8 นาที

BIND9 (Berkeley Internet Name Domain) คือ DNS server ที่ใช้งานกันมากที่สุดในโลก การตั้ง authoritative DNS server บน VPS ของตัวเองช่วยให้ควบคุม DNS record ได้เต็มที่ ไม่ต้องพึ่ง DNS provider ภายนอก เหมาะสำหรับ internal domain, split-horizon DNS หรือกรณีที่ต้องการ custom TTL และ zone management

ติดตั้ง BIND9

sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y

# ตรวจ version
named -version

# ตรวจ status
sudo systemctl status bind9

ตั้งค่า named.conf.options

sudo nano /etc/bind/named.conf.options
options {
    directory "/var/cache/bind";

    // ใครที่สามารถ query DNS ได้
    allow-query { any; };

    // Recursion เฉพาะ internal network (ถ้าเป็น authoritative-only ให้ตั้งเป็น none)
    recursion yes;
    allow-recursion { 127.0.0.1; 10.0.0.0/8; };

    // Forward ไปที่ upstream DNS
    forwarders {
        1.1.1.1;
        8.8.8.8;
    };
    forward only;

    dnssec-validation auto;
    listen-on { any; };
    listen-on-v6 { any; };
};

สร้าง DNS Zone สำหรับโดเมน

sudo nano /etc/bind/named.conf.local
zone "yourdomain.com" {
    type master;
    file "/etc/bind/zones/db.yourdomain.com";
    allow-transfer { none; };  // เพิ่ม secondary NS IP ถ้ามี
};

// Reverse zone (PTR records)
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};

สร้าง Zone File

sudo mkdir -p /etc/bind/zones
sudo nano /etc/bind/zones/db.yourdomain.com
$TTL 3600
@   IN  SOA ns1.yourdomain.com. admin.yourdomain.com. (
            2026061401  ; Serial (YYYYMMDDnn)
            3600        ; Refresh
            1800        ; Retry
            604800      ; Expire
            300 )       ; Negative Cache TTL

; Name Servers
@       IN  NS  ns1.yourdomain.com.
@       IN  NS  ns2.yourdomain.com.

; A Records
@       IN  A   203.0.113.10
ns1     IN  A   203.0.113.10
ns2     IN  A   203.0.113.11
www     IN  A   203.0.113.10
mail    IN  A   203.0.113.10

; MX Record
@       IN  MX  10  mail.yourdomain.com.

; TXT Records (SPF)
@       IN  TXT "v=spf1 ip4:203.0.113.10 ~all"
sudo named-checkzone yourdomain.com /etc/bind/zones/db.yourdomain.com
sudo systemctl restart bind9
Tip: อัปเดต Serial number ทุกครั้งที่แก้ zone file ใช้รูปแบบ YYYYMMDDnn เช่น 2026061401 เพื่อให้ secondary NS sync record ใหม่ได้ถูกต้อง

ตรวจสอบว่า BIND9 ทำงานถูกต้อง

# ตรวจ config ไม่มี error
sudo named-checkconf
sudo named-checkzone yourdomain.com /etc/bind/zones/db.yourdomain.com

# Query DNS server โดยตรง
dig @127.0.0.1 yourdomain.com A
dig @127.0.0.1 www.yourdomain.com A
dig @127.0.0.1 yourdomain.com MX

# ตรวจสอบ BIND9 log
sudo journalctl -u bind9 -n 50
Tip: ใช้ dig @127.0.0.1 เพื่อ query ตรงไปที่ BIND9 local ไม่ผ่าน system resolver เพื่อให้แน่ใจว่าตอบได้ถูกต้อง

แก้ปัญหาที่พบบ่อย

Error: "zone yourdomain.com/IN: loading from master file failed"

Zone file มี syntax error ตรวจสอบด้วย named-checkzone:

อย่าลืมเช็คช่องโหว่ Zone Transfer ด้วย เครื่องมือทดสอบ AXFR ของ dnsxray.com — ถ้าเปิด allow-transfer ทิ้งไว้ ใครก็ดึง Zone ทั้งไฟล์ไปดูได้ (เห็นทุก subdomain และ IP ภายใน) ควรได้ผลเป็น REFUSED เท่านั้นถึงจะปลอดภัย

sudo named-checkzone yourdomain.com /etc/bind/zones/db.yourdomain.com
# จะบอก error และ line number

# ตรวจ permission ของไฟล์
sudo chown bind:bind /etc/bind/zones/db.yourdomain.com
sudo chmod 640 /etc/bind/zones/db.yourdomain.com

DNS query timeout / ไม่ตอบสนอง

ตรวจว่า port 53 เปิดอยู่และ firewall ไม่บล็อก:

sudo ss -tulnp | grep :53
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
# ทดสอบ query จากภายนอก
dig @YOUR-VPS-IP yourdomain.com

SERVFAIL เมื่อ query จากภายนอก

มักเกิดจาก recursion ถูกเปิดแต่ไม่มี forwarder หรือ allow-recursion กัน IP ภายนอก:

sudo nano /etc/bind/named.conf.options
# แก้ให้ recursion none; ถ้าเป็น authoritative-only
# หรือเพิ่ม IP ใน allow-recursion
sudo systemctl reload bind9

Serial number ไม่อัปเดตทำให้ secondary ไม่ sync

Secondary NS จะ refresh เฉพาะเมื่อ Serial เพิ่มขึ้น ตรวจสอบ:

# ดู serial ปัจจุบัน
dig @127.0.0.1 yourdomain.com SOA
# Serial ต้องมากกว่าของ secondary เสมอ

คำถามที่พบบ่อย

BIND9 กับ Unbound ต่างกันอย่างไร?

BIND9 เป็น full-featured DNS server รองรับทั้ง authoritative และ recursive Unbound เป็น recursive resolver เน้นความเร็วและ DNSSEC สำหรับใช้เป็น authoritative DNS ของโดเมนจริง BIND9 เป็นตัวเลือกมาตรฐาน

ต้องมี 2 nameserver ไหม?

registrar ส่วนใหญ่บังคับต้องมีอย่างน้อย 2 NS เพื่อ redundancy ถ้ามี VPS เดียวสามารถใช้ NS ของ Cloudflare เป็น secondary ได้โดยตั้ง slave zone ที่ Cloudflare ชี้มา BIND9 ที่เป็น master

DNSSEC ควรตั้งไหม?

ควร DNSSEC ป้องกัน DNS spoofing โดย sign zone ด้วย cryptographic key BIND9 รองรับ DNSSEC นอกกล่อง แต่ต้องอัปโหลด DS record ไปที่ registrar ด้วยเพื่อสร้าง chain of trust ครบ