ทำ DNS proxy ด้วย pdnsd

ในการเชื่อมต่อ LAN เข้ากับอินเทอร์เน็ต นอกจากจะมี เกตเวย์ แล้ว ก็อาจจะตั้ง DNS server ไว้ใช้ในเครือข่ายด้วย เพื่อลดปริมาณการ query ออกข้างนอก ซึ่งทางเลือกก็มีหลายทาง เช่น ใช้ bind หรือ dnsmasq โดย bind นั้นเป็น DNS server แบบเต็มตัว ส่วน dnsmasq เป็น caching DNS อย่างเดียว แต่บทความนี้จะเสนออีกทางเลือกหนึ่ง คือ pdnsd

pdnsd เป็น caching DNS เหมือน dnsmasq แต่ที่ต่างคือ มันจะเก็บแคชลงดิสก์ด้วย ในลักษณะเดียวกับที่ squid ทำกับ HTTP ทำให้ในระบบที่ไม่ได้เปิดเซิร์ฟเวอร์แบบต่อเนื่อง 24 ชั่วโมง ยังสามารถใช้แคชข้ามวันได้ รวมทั้งสามารถใช้ DNS จากแคชไปพลางได้ในวันที่ DNS ของ ISP มีปัญหาได้ด้วย (ซึ่งเจอบ่อยสำหรับ ISP บ้านเรา ผมเคยแก้ปัญหาด้วยการ hard code IP ต่าง ๆ ที่เข้าบ่อยเก็บไว้ใน /etc/hosts แต่ไม่ต้องแล้ว ถ้าใช้ pdnsd)

ติดตั้งกันเลย

# apt-get install pdnsd

ในการ config จะมีตัวเลือกให้เลือก ว่าจะใช้ DNS server จากแหล่งไหน

  • จาก resolvconf ซึ่งจะเปลี่ยน DNS ไปตาม config ของเครือข่ายผ่านแพกเกจ resolvconf (ดู บทความเก่า)
  • ใช้ root server โดยจะไป query ที่ root server ของโลก โดยไม่พึ่งพา DNS server ของ ISP เลย
  • Manual ไม่ต้องตั้งค่าตอนนี้ เดี๋ยวไปแก้ config file เอง

ถ้า DNS ของ ISP ของคุณค่อนข้างเสถียร ก็อาจจะเลือกแบบ resolvconf หรือจะเลือกแบบ manual แล้วไปกำหนดเองก็ได้ สำหรับผมแล้ว ผมต้องการจะตั้งให้ระบบของผมใช้บริการ pdnsd นี้ใน resolvconf ด้วย เพราะฉะนั้น ถ้าเลือก resolvconf ก็คงจะวนกลับมาหาตัวเอง ก็เลยเลือกแบบ manual

จากนั้นก็มาแก้ config:

  1. แก้ /etc/default/pdnsd:
    START_DAEMON=yes
    
  2. แก้ /etc/pdnsd.conf:
    • server_ip ภายใต้หัวข้อ global เป็น IP ที่จะรอรับ DNS query ค่าปริยายเป็น 127.0.0.1 ซึ่งโอเคถ้าคุณจะตั้งบริการไว้ใช้คนเดียว เช่น ในโน้ตบุ๊กส่วนตัว แต่ถ้าคุณจะตั้งไว้ให้ใช้ใน LAN ก็อาจจะเปลี่ยนเป็น eth0 (หรืออินเทอร์เฟซที่ต่อกับ LAN:
      global {
         ...
         server_ip = eth0;  // Use eth0 here if you want to allow other
                            // machines on your network to query pdnsd.
         ...
      
      }
      
    • หัวข้อ server กำหนด DNS server ที่ pdnsd จะ query เช่น สมมุติว่าจะใช้ของ OpenDNS ก็:
      server {
         label="opendns";
         ip = 208.67.220.220,208.67.222.222;
      }
      
  3. แก้ /etc/resolv.conf หรือ /etc/network/interfaces เพื่อให้มาใช้บริการของ pdnsd โดยตั้งไปตาม IP ที่คุณกำหนด server_ip ไว้
    • กรณีที่ใช้ resolvconf ก็แก้ที่ /etc/network/interfaces (อ่านคำอธิบายได้ใน บทความเก่า):
      iface ... inet ...
         ...
         dns-nameserver 127.0.0.1 # หรือ IP ของ eth0 ตามแต่กรณี
      
    • กรณีที่ไม่ได้ใช้ resolvconf ก็แก้ที่ /etc/resolv.conf โดยตรงเลย:
      nameserver 127.0.0.1 # หรือ IP ของ eth0 ตามแต่กรณี
      

ถ้าคุณติดตั้ง squid ไว้ การตั้งให้ squid มาใช้ pdnsd ก็ช่วยเพิ่มความเร็วในการบริการขึ้นได้อีก ซึ่งโดยปกติแล้ว squid จะใช้ DNS server ที่ระบุใน /etc/resolv.conf อยู่แล้ว แต่ในกรณีที่มันไม่ยอม ก็สามารถบังคับขืนใจได้ โดยกำหนดค่า dns_nameservers ใน /etc/squid/squid.conf:

dns_nameservers 127.0.0.1 # หรือ IP ของ eth0 ตามแต่กรณี

ทดสอบ

config เสร็จแล้ว ก็ start pdnsd ก่อน:

# invoke-rc.d pdnsd start

จากนั้นก็ลอง query DNS ด้วย dig แล้วดูเวลาตอบสนอง:

$ dig debianclub.org
...
;; Query time: 367 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Feb  8 17:24:11 2009
;; MSG SIZE  rcvd: 159

จากนั้น ลอง query ครั้งที่สอง:

$ dig debianclub.org
...
;; Query time: 2 msec
;; SERVER: 192.168.1.1#53(192.168.1.1)
;; WHEN: Sun Feb  8 17:26:03 2009
;; MSG SIZE  rcvd: 159

จะเห็นว่าเวลาลดลง เป็นอันใช้การได้

ที่มา: Speeding Up DNS Access in Regions With Very Low Infrastructure (มีรายละเอียดเรื่องการ fine tune อยู่ที่ท้ายบทความ)

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้