สำหรับ Pi-hole บน Ubuntu Server 24.04 ให้กำหนดเส้นทางการร้องขออัปสตรีมผ่านdnscrypt-proxyและชี้ Pi-hole ไปยังตัวรับฟังภายในเครื่องที่127.0.0.1#5053. การทำเช่นนี้จะเข้ารหัสการรับส่งข้อมูล DNS ระหว่างเซิร์ฟเวอร์ของคุณและตัวแก้ไขอัปสตรีมที่เลือกด้วย DNS-over-HTTPS (DoH) ในขณะที่ Pi-hole ยังคงตอบสนองต่อไคลเอนต์ LAN ของคุณและใช้รายการบล็อกของมัน โดยค่าเริ่มต้น Pi-hole เองไม่ได้ให้บริการการส่งผ่าน DoH ไปยังอัปสตรีม พร็อกซีภายในเครื่องจะเป็นผู้ให้บริการการเชื่อมต่อที่เข้ารหัสนี้
มีรายละเอียดเกี่ยวกับเวอร์ชันปัจจุบันที่ควรทราบก่อน: Cloudflare ได้ลบcloudflared proxy-dnsคำสั่งนี้ออกจากเวอร์ชันใหม่ตั้งแต่วันที่ 2 กุมภาพันธ์ 2026 เป็นต้นไป คู่มือเก่าๆ ที่ติดตั้งคำสั่งนี้อาจใช้ไม่ได้กับcloudflaredเวอร์ชันปัจจุบัน ขั้นตอนด้านล่างนี้ใช้dnscrypt-proxyตามคู่มือ DoH ปัจจุบันของ Pi-hole การตั้งค่านี้เหมาะสมเมื่อ Pi-hole และพร็อกซีทำงานบนโฮสต์ Ubuntu เดียวกัน การตั้งค่า Docker หรือแบบหลายโฮสต์จำเป็นต้องมีการกำหนดที่อยู่ผู้ฟังและกฎไฟร์วอลล์ที่แตกต่างกัน
ระบบนี้ทำอะไรได้บ้าง และทำอะไรไม่ได้บ้าง
โดยปกติแล้ว DNS จะส่งคำขอจากตัวแก้ไข DNS ของคุณไปยังผู้ให้บริการ DNS ต้นทางโดยไม่มีการเข้ารหัสการรับส่งข้อมูล แต่ DoH จะส่งคำขอ DNS ภายใน HTTPS ทำให้ยากขึ้นสำหรับผู้สังเกตการณ์เครือข่ายระหว่างเซิร์ฟเวอร์ Pi-hole ของคุณและตัวแก้ไข DNS ในการอ่านหรือแก้ไขคำขอเหล่านั้น Pi-hole ยังคงเป็นเซิร์ฟเวอร์ DNS ที่ประกาศให้กับอุปกรณ์ในเครือข่ายท้องถิ่นของคุณ มีเพียงเส้นทางต้นทางเท่านั้นที่เปลี่ยนแปลงไป
DoH ไม่ได้ทำให้กิจกรรม DNS มองไม่เห็นสำหรับตัวแก้ไขที่คุณเลือก ผู้ให้บริการต้นทางยังคงได้รับคำขอจากเซิร์ฟเวอร์ของคุณ และ Pi-hole อาจเก็บประวัติคำขอของไคลเอ็นต์ตามการตั้งค่าความเป็นส่วนตัวและการบันทึกข้อมูล นอกจากนี้ HTTPS ยังไม่เข้ารหัสการรับส่งข้อมูลเว็บที่ไม่เกี่ยวข้อง หากเป้าหมายของคุณคือการใช้ตัวแก้ไขเฉพาะ โปรดตรวจสอบนโยบายความเป็นส่วนตัวและเลือกรายการ DoH จากรายการตัวแก้ไขที่รองรับ
ก่อนที่คุณจะเริ่มต้น
- ตรวจสอบให้แน่ใจว่าได้ติดตั้งและใช้งาน Pi-hole บน Ubuntu Server 24.04 เรียบร้อยแล้ว คู่มือนี้จะกำหนดค่า Pi-hole ที่มีอยู่แล้ว ไม่ใช่การติดตั้งใหม่
- ตรวจสอบให้แน่ใจว่าเซิร์ฟเวอร์มีที่อยู่ LAN ที่เสถียร หากที่อยู่เปลี่ยนแปลง ไคลเอ็นต์ DHCP ของเราเตอร์อาจสูญเสียเซิร์ฟเวอร์ DNS ของตนไป
- ควรมีสิทธิ์เข้าถึงในฐานะผู้ดูแลระบบ และมีวิธีติดต่อกับโฮสต์ Pi-hole ได้หาก DNS หยุดทำงานชั่วคราว หลีกเลี่ยงการเปลี่ยนแปลงนี้จากระยะไกลผ่านการเชื่อมต่อที่ต้องพึ่งพา Pi-hole เดียวกันในการแก้ไขชื่อโดเมน
- บันทึกการตั้งค่าอัปสตรีมของ Pi-hole ในปัจจุบันไว้ เพื่อให้คุณสามารถกู้คืนการตั้งค่าเหล่านั้นได้ในระหว่างการย้อนกลับ
พร็อกซีจะเชื่อมต่อเฉพาะกับพอร์ต loopback 5053 เท่านั้น โดยปล่อยพอร์ต 53 ไว้สำหรับ Pi-hole วิธีนี้จะช่วยหลีกเลี่ยงการแย่งใช้พอร์ตกับบริการ DNS ของ Pi-hole และตัวแก้ไขชื่อโดเมนในเครื่องของ Ubuntu อย่าปิดใช้งานsystemd-resolvedพอร์ต loopback แยกต่างหากของพร็อกซีเพียงเพื่อให้การออกแบบนี้ใช้งานได้ เพราะพอร์ต loopback ที่แยกต่างหากของพร็อกซีจะช่วยหลีกเลี่ยงความขัดแย้งนั้นได้
1. ติดตั้ง dnscrypt-proxy จากคลังแพ็กเกจของ Ubuntu
เอกสารโครงการ dnscrypt-proxy อธิบายขั้นตอนการติดตั้งแพ็กเกจใน Ubuntu โปรดตรวจสอบให้แน่ใจว่าที่เก็บแพ็กเกจของ Ubuntu ที่คุณกำหนดค่าไว้นั้นมีแพ็กเกจที่เหมาะสมก่อนทำการติดตั้ง:
sudo apt update
apt-cache policy dnscrypt-proxy
หากผลลัพธ์แสดงเวอร์ชันที่เหมาะสม ให้ติดตั้งเวอร์ชันนั้น:
sudo apt install dnscrypt-proxy
หากไม่พบตัวเลือกใดๆ อย่าเพิ่มที่เก็บข้อมูลของบุคคลที่สามที่ไม่เกี่ยวข้องเพียงเพื่อดำเนินการต่อ ใช้วิธีการติดตั้งที่เชื่อมโยงจากคู่มือ Linux อย่างเป็นทางการของโครงการ dnscrypt-proxy ตรวจสอบรุ่นและสถาปัตยกรรม และปรับการตั้งค่าบริการให้เข้ากับการติดตั้งนั้น หน่วยซ็อกเก็ต systemd และเส้นทางการกำหนดค่าด้านล่างนี้ใช้กับการตั้งค่าแพ็กเกจ Ubuntu ที่จัดทำเป็นเอกสารโดย Pi-hole
2. ย้ายตัวรับฟังพร็อกซีไปที่ localhost พอร์ต 5053
Pi-hole ใช้พอร์ต DNS มาตรฐาน 53 อยู่แล้ว กำหนดค่าซ็อกเก็ตของพร็อกซีให้รับฟังทั้ง TCP และ UDP ที่ ซึ่ง127.0.0.1:5053สามารถเข้าถึงได้จากโฮสต์เดียวกันเท่านั้น สร้าง systemd drop-in:
sudo systemctl edit dnscrypt-proxy.socket
ป้อนข้อความเหล่านี้ลงในโปรแกรมแก้ไขและบันทึก:
[Socket]
ListenStream=
ListenDatagram=
ListenStream=127.0.0.1:5053
ListenDatagram=127.0.0.1:5053
บรรทัดว่างListenStream=และListenDatagram=บรรทัดใหม่จะล้างค่าเริ่มต้นของแพ็กเกจก่อนที่จะตั้งค่าที่อยู่ทดแทน อย่าละเว้นบรรทัดเหล่านี้ มิฉะนั้น systemd อาจเก็บพอร์ตเริ่มต้นไว้นอกเหนือจากตัวรับฟังที่กำหนดเอง
3. เลือกตัวแก้ไข DoH
เปิดไฟล์การกำหนดค่าแพ็กเกจ:
sudoedit /etc/dnscrypt-proxy/dnscrypt-proxy.toml
สำหรับการเปิดใช้งานซ็อกเก็ต systemd ให้ใช้รายการผู้ฟังว่างเปล่าในการกำหนดค่าพร็อกซี เลือกชื่อตัวแก้ไขจากรายการตัวแก้ไขสาธารณะที่ลงนามในปัจจุบัน ตัวอย่างเช่น คำสั่งต่อไปนี้เลือกตัวแก้ไข Cloudflare มาตรฐาน คู่มือ Pi-hole ยังแสดงcloudflare-securityตัวอย่างเมื่อต้องการกรองมัลแวร์ที่ตัวแก้ไขต้นทางด้วย:
listen_addresses = []
server_names = ['cloudflare']
คงค่าการตั้งค่าส่วนที่เหลือของแพ็กเกจไว้เหมือนเดิม ชื่อที่ระบุไว้เป็นserver_namesตัวระบุรีจิสทรี ไม่ใช่ชื่อโฮสต์หรือเส้นทาง URL ที่กำหนดขึ้นเอง หากคุณต้องการใช้ผู้ให้บริการรายอื่น โปรดตรวจสอบว่ารายการตัวแก้ไขปัจจุบันรองรับ DoH หรือไม่ และคัดลอกชื่อที่ถูกต้อง ตัวแก้ไขที่กรองมัลแวร์หรือหมวดหมู่อื่นๆ อาจให้ผลลัพธ์ที่แตกต่างจากตัวแก้ไขที่ไม่ได้กรอง
4. ตั้งค่า Pi-hole ให้ชี้ไปยังพร็อกซีในเครื่อง
ตั้งค่าที่อยู่ DNS ต้นทางของ Pi-hole ให้เป็น Listener ในเครื่อง:
sudo pihole-FTL --config dns.upstreams '["127.0.0.1#5053"]'
คำ#5053ต่อท้ายคือสัญลักษณ์ที่ Pi-hole ใช้แทนพอร์ต DNS ที่ไม่เป็นมาตรฐาน คุณสามารถตรวจสอบได้ในอินเทอร์เฟซผู้ดูแลระบบของ Pi-hole ที่การตั้งค่า > DNSล้างการเลือกอัปสตรีมสาธารณะที่ตั้งไว้ล่วงหน้า และปล่อยให้เซิร์ฟเวอร์แบบกำหนดเอง127.0.0.1#5053เป็นอัปสตรีม การคงตัวเลือกตัวแก้ไขสาธารณะไว้เป็นอัปสตรีมเพิ่มเติมอาจทำให้การสอบถามข้ามพร็อกซีที่เข้ารหัสได้ ดังนั้นให้ลบรายการเหล่านั้นออกหากคุณต้องการให้การสอบถามอัปสตรีมทั้งหมดของ Pi-hole ใช้ DoH
5. รีสตาร์ทบริการและตรวจสอบว่าปัญหาได้รับการแก้ไขแล้วหรือไม่
รีสตาร์ทซ็อกเก็ต บริการพร็อกซี และดีมอน Pi-hole FTL เพื่อให้โหลดการกำหนดค่าใหม่:
sudo systemctl restart dnscrypt-proxy.socket
sudo systemctl restart dnscrypt-proxy.service
sudo systemctl restart pihole-FTL.service
ตรวจสอบสถานะการให้บริการ:
sudo systemctl status dnscrypt-proxy.socket
sudo systemctl status dnscrypt-proxy.service
sudo systemctl status pihole-FTL.service
แต่ละตัวควรทำงานได้โดยไม่มีข้อผิดพลาดในการเชื่อมต่อหรือความล้มเหลวในการเริ่มต้นตัวแก้ไข ทดสอบพร็อกซีโดยตรงผ่านตัวรับฟัง DNS ในเครื่อง:
dig @127.0.0.1 -p 5053 example.com
การตอบกลับ DNS แสดงว่าพร็อกซีในพื้นที่ตอบสนองแล้ว จากนั้นทดสอบ Pi-hole บนพอร์ต 53:
dig @127.0.0.1 example.com
ตรวจสอบบันทึกการสอบถามของ Pi-hole หรือแดชบอร์ดเพื่อยืนยันว่าคำขอส่งถึง Pi-hole แล้ว และตรวจสอบบันทึกของพร็อกซีหากการทดสอบล้มเหลว:
sudo journalctl -u dnscrypt-proxy.service -b --no-pager
เพื่อตรวจสอบเพิ่มเติม ให้ดูในข้อมูลการเริ่มต้นพร็อกซีหรือเอาต์พุตบันทึกเพื่อดูตัวแก้ไขที่เลือกและสถานะโปรโตคอล DoH การที่การเชื่อมต่อสำเร็จdigเพียงอย่างเดียวแสดงว่าการแก้ไข DNS ทำงานได้ แต่ไม่ได้หมายความว่าคำขอใช้ HTTPS เสมอไป
ปัญหาทั่วไปและการฟื้นตัวอย่างปลอดภัย
- “ที่อยู่ถูกใช้งานอยู่แล้ว”:อาจมีกระบวนการอื่นกำลังใช้งานพอร์ต 5053 อยู่ หรือการตั้งค่าการใช้งานซ็อกเก็ตไม่ได้ถูกโหลด ตรวจสอบตัวรับฟังด้วยคำสั่ง `ls`
sudo ss -lntup, ตรวจสอบการเชื่อมต่อด้วยคำสั่ง `ls` systemctl cat dnscrypt-proxy.socket, และยืนยันว่าบรรทัดรีเซ็ตที่ว่างเปล่าอยู่ก่อนรายการ 5053
- พร็อกซีทำงานอยู่ แต่การค้นหาหมดเวลา:ตรวจสอบการเข้าถึง HTTPS ขาออก ชื่อตัวแก้ไข และบันทึกของพร็อกซี เครือข่ายบางแห่งอาจบล็อกการเชื่อมต่อ DNS ผ่าน HTTPS หรือจำกัดพอร์ต TCP 443
- การทดสอบพร็อกซีทำงานได้ แต่ Pi-hole ไม่มีการตอบสนองจากเซิร์ฟเวอร์ต้นทาง:ตรวจสอบให้แน่ใจว่า Pi-hole ตั้งค่าถูกต้องแล้ว
127.0.0.1#5053จากนั้นรีสตาร์ทpihole-FTLตรวจสอบให้แน่ใจว่าช่องทำเครื่องหมายเซิร์ฟเวอร์ต้นทางมาตรฐานไม่ได้ให้เส้นทางอื่นโดยไม่แจ้งให้ทราบล่วงหน้า
- Ubuntu เองไม่สามารถแก้ไขชื่อได้หลังจากทำการเปลี่ยนแปลง:การตั้งค่านี้เปลี่ยนอัปสตรีมของ Pi-hole ไม่ใช่ของโฮสต์
/etc/resolv.confหลีกเลี่ยงการแทนที่ไฟล์นั้นหรือปิดใช้งาน เพื่อใช้ systemd-resolvedเป็นทางลัดในการแก้ไขปัญหา
สำหรับการย้อนกลับ ให้คืนค่าการตั้งค่า DNS ต้นทางที่คุณบันทึกไว้ใน Pi-hole แล้วรีสตาร์ทpihole-FTLเมื่อ Pi-hole ไม่ชี้ไปยังพร็อกซีอีกต่อไป คุณสามารถปิดใช้งานหรือลบออกได้dnscrypt-proxyโดยใช้ตัวจัดการแพ็กเกจ หากเซิร์ฟเวอร์นี้แก้ไข DNS ของตัวเองผ่าน Pi-hole ด้วย ให้เก็บเส้นทางการกู้คืนในเครื่องไว้ก่อนที่จะเปลี่ยนบริการ
ตัวเลือกใดเหมาะสมกับเครือข่ายของคุณ?
ใช้การตั้งค่าพร็อกซีแบบโฮสต์เดียวนี้เมื่อคุณต้องการการกรอง DNS แบบรวมศูนย์ใน Pi-hole และการรับส่งข้อมูลที่เข้ารหัสจาก Pi-hole ไปยังตัวแก้ไขที่เลือกไว้เพียงตัวเดียว การตรวจสอบทำได้ค่อนข้างง่ายเนื่องจากพร็อกซีมีที่อยู่และพอร์ตภายในเครื่องเพียงที่เดียว หากคุณใช้งาน Pi-hole ใน Docker บนเซิร์ฟเวอร์อื่น หรือข้ามเครือข่ายหลายเครือข่าย คุณอาจต้องใช้ที่อยู่เครือข่ายคอนเทนเนอร์แทน loopback และคุณต้องจำกัดตัวรับฟังพร็อกซีเพื่อไม่ให้เปิดเผยเป็นตัวแก้ไขแบบเปิด หากคุณต้องการการกรองตามนโยบาย การระบุตัวตนต่ออุปกรณ์ หรือ DNS ที่เข้ารหัสสำหรับอุปกรณ์ที่ใช้งานนอกบ้าน ให้กำหนดค่าไคลเอ็นต์เหล่านั้นหรือเกตเวย์ที่จัดการแยกต่างหาก การเชื่อมต่อ DoH ต้นทางของ Pi-hole ไม่ได้เข้ารหัสเส้นทางของไคลเอ็นต์แต่ละรายไปยัง Pi-hole โดยอัตโนมัติ
สุดท้ายนี้ โปรดจำไว้ว่าเราเตอร์หรืออุปกรณ์ลูกข่ายสามารถข้ามการทำงานของ Pi-hole ได้หากมีการประกาศเซิร์ฟเวอร์ DNS ตัวที่สอง สำหรับการกรองข้อมูลทั่วทั้งเครือข่าย ให้กำหนดที่อยู่ IP ของ Pi-hole ให้กับอุปกรณ์ลูกข่ายผ่าน DHCP เท่านั้น และคำนึงถึงการประกาศ DNS ทั้ง IPv6 และ IPv4 ด้วย ตรวจสอบกับอุปกรณ์หลายเครื่องหลังจากเปลี่ยนการตั้งค่าเราเตอร์ เนื่องจากแม้การตั้งค่าพร็อกซีที่ถูกต้องบนเซิร์ฟเวอร์ก็ไม่สามารถป้องกันไม่ให้อุปกรณ์ลูกข่ายใช้ตัวแก้ไขชื่อโดเมนอื่นโดยตรงได้
เอกสารอ้างอิงอย่างเป็นทางการ