Pi-hole DNS Ad Blocker บน VPS
Security DNS 14 กันยายน 2569

ติดตั้ง Pi-hole บน VPS: บล็อกโฆษณา DNS ทั้งเครือข่าย

Pi-hole คือ DNS sinkhole แบบ open-source ที่บล็อกโฆษณาและ tracker ในระดับ DNS ก่อนที่ request จะถึงอุปกรณ์ปลายทาง ต่างจาก browser extension ตรงที่ Pi-hole ทำงานกับ ทุกอุปกรณ์ ในเครือข่าย — ตั้งแต่มือถือ แท็บเล็ต Smart TV ไปจนถึง IoT อุปกรณ์ต่างๆ

การรัน Pi-hole บน VPS แทน Raspberry Pi ทำให้เข้าถึงได้จากทุกที่ผ่าน VPN ใช้งานได้ตลอด 24 ชั่วโมง และไม่ต้องกังวลเรื่อง hardware ล้มเหลว บทความนี้จะพาคุณตั้งค่าตั้งแต่ต้นจนใช้งานได้จริง

สิ่งที่ต้องเตรียม

ขั้นตอนที่ 1: เตรียมระบบ

อัพเดทระบบและติดตั้ง dependency ก่อน:

sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget git

ตรวจสอบว่า port 53 ไม่ได้ถูกใช้โดย systemd-resolved:

sudo ss -tulpn | grep :53

ถ้าเห็น systemd-resolved ใช้ port 53 อยู่ ต้องปิดก่อน:

sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/' /etc/systemd/resolved.conf
sudo systemctl restart systemd-resolved
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

ขั้นตอนที่ 2: ติดตั้ง Pi-hole

ใช้ automated installer script ของ Pi-hole:

curl -sSL https://install.pi-hole.net | sudo bash

ระหว่างติดตั้ง installer จะถามคำถามหลายข้อ:

เมื่อติดตั้งเสร็จ จะแสดง admin password ให้บันทึกไว้

ขั้นตอนที่ 3: เปิด Port ด้วย UFW

sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 80/tcp
sudo ufw reload
Note: ถ้าต้องการให้ Pi-hole เข้าถึงได้เฉพาะผ่าน VPN ให้ lock port 53 ให้รับเฉพาะ IP ของ VPN interface เท่านั้น เช่น sudo ufw allow from 10.0.0.0/8 to any port 53

ขั้นตอนที่ 4: เข้าใช้งาน Web Admin

เปิด browser ไปที่ http://YOUR-VPS-IP/admin แล้วล็อกอินด้วย password ที่ได้รับตอนติดตั้ง

หรือเปลี่ยน password ใหม่ด้วยคำสั่ง:

pihole -a -p YOUR_NEW_PASSWORD

ขั้นตอนที่ 5: ตั้งค่า DNS บนอุปกรณ์

เปลี่ยน DNS server ของอุปกรณ์หรือ router ให้ชี้ไปที่ IP ของ VPS:

หากต้องการใช้งานจาก Internet ผ่าน VPN ให้ตั้งค่า WireGuard หรือ OpenVPN ก่อน แล้วชี้ DNS ไปที่ VPN IP

ขั้นตอนที่ 6: เพิ่ม Blocklist

Pi-hole รองรับ blocklist เพิ่มเติมผ่าน Group Management → Adlists ใน Web UI หรือผ่าน command line:

# เพิ่ม blocklist URL
sqlite3 /etc/pihole/gravity.db "INSERT INTO adlist (address, enabled) VALUES ('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts', 1);"

# อัพเดท gravity (ดึง blocklist ใหม่)
pihole -g

Blocklist ที่แนะนำ:

Blocklistจำนวน domainเหมาะสำหรับ
StevenBlack Unified~130,000ทั่วไป (default)
OISD Full~150,000ครอบคลุมกว่า
Hagezi Pro~200,000โฆษณา + Malware
1Hosts Pro~300,000ครอบคลุมมาก

ขั้นตอนที่ 7: ตั้งค่า DNS-over-HTTPS (DoH)

เพิ่มความเป็นส่วนตัวด้วยการใช้ cloudflared เป็น upstream DNS:

# ติดตั้ง cloudflared
wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb

# ตั้งค่า cloudflared สำหรับ DoH
sudo mkdir -p /etc/cloudflared
sudo tee /etc/cloudflared/config.yml << 'EOF'
proxy-dns: true
proxy-dns-port: 5053
proxy-dns-upstream:
  - https://1.1.1.1/dns-query
  - https://1.0.0.1/dns-query
EOF

# ติดตั้ง service
sudo cloudflared service install
sudo systemctl enable --now cloudflared

จากนั้นเปลี่ยน upstream DNS ของ Pi-hole ใน Web UI: Settings → DNS → Custom upstream → 127.0.0.1#5053

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

# ดูสถานะ service
pihole status
systemctl status pihole-FTL

# ทดสอบบล็อก domain โฆษณา
dig doubleclick.net @YOUR-VPS-IP

# ดู query log แบบ real-time
pihole -t

# ดูสถิติ
pihole -c
Tip: ถ้า dig doubleclick.net คืน 0.0.0.0 หรือ NXDOMAIN แสดงว่า Pi-hole บล็อกได้ถูกต้องแล้ว ถ้าคืน IP จริง แสดงว่า domain นั้นไม่อยู่ใน blocklist ให้ไป Adlists แล้ว update gravity

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

Error: "Port 53 already in use"

systemd-resolved ยึด port 53 อยู่ก่อน ต้องปิด stub listener:

sudo systemctl stop systemd-resolved
sudo sed -i 's/#DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
sudo systemctl restart systemd-resolved
pihole restartdns

Error: "pihole-FTL failed to start"

FTL daemon มักล้มเหลวเพราะ port ชน หรือ permission ผิด ลองวิธีนี้:

sudo systemctl stop pihole-FTL
sudo rm -f /run/pihole/FTL.pid
sudo chmod 755 /run/pihole
sudo systemctl start pihole-FTL
journalctl -u pihole-FTL -n 50 --no-pager

Error: "gravity.db: database is locked"

เกิดเมื่อรัน pihole -g พร้อมกันหลาย process หรือ gravity update ค้าง:

# ตรวจสอบ process ที่ค้าง
sudo lsof /etc/pihole/gravity.db

# Kill process ที่ค้าง
sudo kill -9 PID_NUMBER

# รัน gravity update ใหม่
pihole -g

Error: "Web interface not loading" (ERR_CONNECTION_REFUSED)

lighttpd web server อาจไม่ทำงาน ตรวจสอบและรีสตาร์ท:

sudo systemctl status lighttpd
sudo systemctl restart lighttpd

# ตรวจสอบ config
sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf

Error: "SERVFAIL" เมื่อ query DNS

upstream DNS ที่ตั้งไว้ไม่ตอบสนอง หรือ DoH endpoint ไม่ได้รับการเชื่อมต่อ:

# ทดสอบ upstream DNS โดยตรง
dig @1.1.1.1 google.com

# ทดสอบ cloudflared DoH
dig @127.0.0.1 -p 5053 google.com

# ดู log ของ cloudflared
journalctl -u cloudflared -n 30 --no-pager

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

Pi-hole บน VPS ต่างจาก Pi-hole บน Raspberry Pi อย่างไร?

หลักการทำงานเหมือนกันทุกอย่าง ต่างกันที่ hardware และ accessibility: VPS เข้าถึงได้จากทุกที่ผ่าน Internet (ผ่าน VPN) ไม่มีปัญหาไฟดับหรือ SD card เสีย แต่ต้องระวังเรื่อง port 53 ที่เปิดสู่สาธารณะ — ควรล็อก firewall ให้รับเฉพาะ client ที่เชื่อถือได้เท่านั้น

Pi-hole ช้า Internet ไหม?

ไม่ช้า — Pi-hole มี DNS cache ทำให้ query ที่เคยถามแล้วตอบได้เร็วกว่า DNS ทั่วไปด้วยซ้ำ สถิติจากผู้ใช้จริงพบว่า latency DNS ลดลง 20-40% หลังเปิดใช้งาน Pi-hole เพราะ domain ที่บล็อกถูกตอบด้วย NXDOMAIN ทันทีโดยไม่ต้อง forward ไป upstream

อัพเดท Pi-hole ทำอย่างไร?

รันคำสั่งเดียว:

pihole -up

Pi-hole จะดึง version ใหม่และอัพเดทโดยอัตโนมัติ ไม่ต้องหยุดใช้งาน downtime น้อยมาก