หากใน Linux ดูเหมือนว่ายังเชื่อมต่ออินเทอร์เน็ตได้อยู่ แต่เปิดเว็บไซต์ไม่ได้ หรือเชื่อมต่อด้วย IP address ได้แต่เชื่อมต่อด้วยชื่อโดเมนไม่ได้ ปัญหามักเกี่ยวข้องกับการ resolve DNS โดย DNS มีหน้าที่แปลงชื่อโดเมนอย่าง example.com ให้เป็น IP address จริง หากขั้นตอนนี้ล้มเหลว แม้เครือข่ายจะยังทำงานอยู่ แต่การใช้งานอินเทอร์เน็ตทั่วไปก็จะมีปัญหาอย่างมาก
อาการที่พบบ่อย
- เบราว์เซอร์แสดงข้อความว่าไม่พบเซิร์ฟเวอร์
ping 8.8.8.8สำเร็จ แต่ping google.comล้มเหลวapt,dnf,yum,pacmanดาวน์โหลดแพ็กเกจไม่ได้- มีข้อความ
Temporary failure in name resolution
สิ่งที่ควรตรวจสอบก่อน
ก่อนอื่นควรแยกให้ออกว่าปัญหาเกิดกับทั้งเครือข่าย หรือเกิดเฉพาะกับ DNS เท่านั้น
ping -c 4 8.8.8.8
ping -c 4 google.com
ip addr
ip route
ถ้าเข้าถึง 8.8.8.8 ได้ แต่เข้าถึง google.com ไม่ได้ มักหมายถึงปัญหาอยู่ที่ DNS แต่ถ้าแม้แต่ IP address ก็ยังเข้าไม่ได้ ปัญหาอาจอยู่ที่ Wi-Fi, network interface, gateway หรือ routing
สาเหตุหลัก
1. การตั้งค่า /etc/resolv.conf ไม่ถูกต้อง
ใน Linux หลายดิสทริบิวชัน ข้อมูล DNS server จะถูกเก็บไว้ในไฟล์ /etc/resolv.conf หากในไฟล์นี้ไม่มี nameserver ที่ถูกต้อง ก็จะไม่สามารถ resolve ชื่อโดเมนได้
cat /etc/resolv.conf
ตัวอย่าง:
nameserver 8.8.8.8
nameserver 1.1.1.1
หากไฟล์ว่าง หรือชี้ไปยัง local DNS ที่ผิด ก็จะเกิดปัญหาได้ อย่างไรก็ตาม ใน Linux รุ่นใหม่ ไฟล์นี้มักถูกสร้างอัตโนมัติโดย NetworkManager หรือ systemd-resolved ดังนั้นการแก้ไขด้วยมืออาจถูกเขียนทับภายหลัง
2. systemd-resolved มีปัญหา
ในระบบอย่าง Ubuntu มักใช้ systemd-resolved ในการจัดการ DNS และใช้ 127.0.0.53 เป็น local stub resolver หากบริการนี้หยุดทำงาน การ resolve DNS ก็จะล้มเหลว
systemctl status systemd-resolved
resolvectl status
หากมีปัญหา สามารถรีสตาร์ตบริการได้:
sudo systemctl restart systemd-resolved
3. NetworkManager ใช้ค่า DNS ไม่ถูกต้อง
ใน Linux แบบเดสก์ท็อป NetworkManager มักรับค่า DNS ผ่าน DHCP หากโปรไฟล์เครือข่ายเสียหาย หรือเกิดปัญหาระหว่างเชื่อมต่อใหม่ ค่า DNS ที่ถูกต้องอาจไม่ถูกนำมาใช้
nmcli dev show | grep DNS
nmcli connection show
หากจำเป็น สามารถรีสตาร์ตได้:
sudo systemctl restart NetworkManager
4. ผลกระทบจาก VPN, proxy หรือ firewall
VPN อาจส่งคำขอ DNS ไปผิดเส้นทาง หรือ firewall อาจบล็อกพอร์ต 53 ทำให้ระบบดูเหมือนเครือข่ายยังปกติ แต่ไม่สามารถ resolve ชื่อโดเมนได้
5. แคช DNS เสียหรือเก่าเกินไป
หากแคชในเครื่องเก่าหรือเสียหาย อาจทำให้บางโดเมนใช้งานไม่ได้ ในระบบที่ใช้ systemd-resolved หรือ nscd การล้างแคชอาจช่วยได้
sudo resolvectl flush-caches
ขั้นตอนแก้ปัญหาแบบใช้งานจริง
ขั้นตอนที่ 1: ทดสอบถามไปยัง Public DNS โดยตรง
nslookup google.com 8.8.8.8
dig google.com @8.8.8.8
หากคำสั่งนี้ตอบกลับได้ตามปกติ แสดงว่า public DNS ภายนอกทำงานได้ และปัญหาอาจอยู่ที่การตั้งค่าในเครื่อง
ขั้นตอนที่ 2: ตั้งค่า Public DNS ชั่วคราว
sudo sh -c 'printf "nameserver 8.8.8.8\nnameserver 1.1.1.1\n" > /etc/resolv.conf'
วิธีนี้เหมาะกับการกู้ระบบชั่วคราว แต่หลัง reboot หรือ reconnect เครือข่าย ไฟล์นี้อาจถูกเปลี่ยนกลับ สำหรับการแก้ถาวร ควรแก้ที่ NetworkManager, netplan หรือ systemd-resolved
ขั้นตอนที่ 3: ตรวจสอบ netplan บน Ubuntu
sudo nano /etc/netplan/*.yaml
ตัวอย่าง:
nameservers:
addresses: [8.8.8.8,1.1.1.1]
จากนั้นใช้คำสั่ง:
sudo netplan apply
ขั้นตอนที่ 4: ขอข้อมูล DHCP ใหม่
sudo dhclient -r
sudo dhclient
หาก DHCP server แจกข้อมูล DNS ผิด ขั้นตอนนี้อาจช่วยแก้ปัญหาได้
คำสั่งที่มีประโยชน์สำหรับตรวจสอบ
ping -c 4 8.8.8.8
ping -c 4 google.com
cat /etc/resolv.conf
systemctl status systemd-resolved
resolvectl status
nmcli dev show | grep DNS
nslookup google.com
dig google.com
journalctl -u systemd-resolved --no-pager | tail -n 50
วิธีป้องกันไม่ให้เกิดซ้ำ
- อย่าแก้แค่
/etc/resolv.confด้วยมือแล้วจบ - ควรเข้าใจว่า DNS ถูกจัดการโดย DHCP, NetworkManager หรือ systemd-resolved
- หลังติดตั้งหรือใช้งาน VPN ควรตรวจสอบว่า DNS เปลี่ยนหรือไม่
- ในเครื่องเซิร์ฟเวอร์ ควรกำหนด DNS แบบคงที่ให้ชัดเจน
สรุป
เมื่อ Linux ไม่สามารถ resolve DNS ได้ สิ่งสำคัญที่สุดคือตรวจสอบก่อนว่ายังติดต่อผ่าน IP address ได้หรือไม่ เพราะจะช่วยแยกได้ว่าปัญหาอยู่ที่ DNS อย่างเดียว หรือเป็นปัญหาเครือข่ายโดยรวม จากนั้นจึงตรวจสอบ /etc/resolv.conf, systemd-resolved, NetworkManager, DHCP และการตั้งค่า VPN ตามลำดับ ไม่ควรหยุดแค่การแก้ชั่วคราว แต่ควรเข้าใจด้วยว่าระบบของคุณมีองค์ประกอบใดเป็นผู้จัดการ DNS จริง ๆ