ใน macOS 26 การตั้งค่า DNS แบบกำหนดเอง เช่น `.internal` ใช้งานไม่ได้
(gist.github.com/adamamyl)- ใน macOS 26.3.1 การตั้งค่า DNS รายโดเมนผ่าน
/etc/resolver/ถูกทำให้ใช้ไม่ได้กับ TLD ที่ไม่เป็นมาตรฐาน ส่งผลให้สภาพแวดล้อมการพัฒนาแบบโลคัลเดิมใช้งานต่อไม่ได้ mDNSResponderจัดการคำขอของ TLD แบบกำหนดเองทั้งหมดด้วย mDNS เท่านั้น และไม่อ้างอิง nameserver แบบ unicast ที่ระบุไว้เลย- TLD ที่ไม่มีอยู่ใน IANA root zone จะล้มเหลวทั้งหมด เช่น
.internal,.test,.home.arpa,.lanขณะที่โดเมนมาตรฐาน (google.comเป็นต้น) ยังทำงานตามปกติ - วิธีแก้ชั่วคราวเดียวคือเพิ่มรายการเองใน
/etc/hostsแต่ ไม่สมจริงสำหรับสภาพแวดล้อมแบบไดนามิก เช่น Docker หรือ Kubernetes - เวิร์กโฟลว์ DNS แบบโลคัลที่ชุมชนนักพัฒนา macOS ใช้มายาวนานหยุดทำงานทั้งหมด ส่งผลกระทบในวงกว้างต่อเครื่องมือพัฒนาและฟังก์ชันการทำงานร่วมกับ VPN
ปัญหา DNS regression ที่เกิดขึ้นใน macOS 26
-
ใน macOS 26.3.1 (Darwin 25.3.0, Build 25D771280a) ฟังก์ชันการตั้งค่า DNS รายโดเมนผ่าน
/etc/resolver/เสียหาย- ฟังก์ชันที่ทำงานได้ตามปกติถึง macOS 25.x หยุดทำงานหลังอัปเดตเป็นเวอร์ชัน 26
- แม้จะเป็นฟังก์ชันที่ระบุไว้ในเอกสารทางการของ Apple (
man 5 resolver) แต่ก็ไม่ทำงานกับ TLD ที่ไม่เป็นมาตรฐานอีกต่อไป
-
mDNSResponderดักจับคำขอของ custom TLD ทั้งหมดเป็น mDNS และเพิกเฉยต่อ unicast nameserver ที่กำหนดไว้- แอปทั้งหมดที่ใช้
getaddrinfo()(ping,curl,python3 socket) จะขึ้นข้อผิดพลาด “Unknown host” - จากผล
tcpdumpไม่พบทราฟฟิกไปยัง local DNS (127.0.0.1:53) เลย - ในคำสั่ง
dns-sd -G v4จะเห็นการตอบกลับ “No Such Record” และ TTL ที่ยาวผิดปกติ (ประมาณ 108,002 วินาที)
- แอปทั้งหมดที่ใช้
ขั้นตอนการทดสอบและการทำซ้ำปัญหา
-
ตั้งค่า
dnsmasqที่ติดตั้งผ่าน Homebrew เป็น local DNS resolver และแมปโดเมน*.internalหรือ*.example-privateไปที่ 127.0.0.1- ระบุ
nameserver 127.0.0.1ในไฟล์/etc/resolver/example-private - คำสั่ง
scutil --dnsแสดงว่า resolver ดังกล่าวถูกลงทะเบียนอย่างถูกต้อง - แต่เมื่อรัน
ping probe.example-privateจะพบข้อผิดพลาด “Unknown host”
- ระบุ
-
dig @127.0.0.1และคำสั่งhostตอบกลับได้ตามปกติ แต่แอปที่ใช้ system resolver ล้มเหลวทั้งหมด- สาเหตุคือ
mDNSResponderบล็อก query ภายใน และไม่เรียกใช้ unicast DNS เลย
- สาเหตุคือ
รายการ TLD ที่ได้รับผลกระทบ
| TLD | สถานะ | หมายเหตุ |
|---|---|---|
.internal |
ล้มเหลว | special-use TLD ตามร่าง IETF, ทำงานปกติใน macOS 25 |
.test |
ล้มเหลว | สงวนไว้สำหรับการทดสอบแบบโลคัลตาม RFC 6761 §6.2 |
.home.arpa |
ล้มเหลว | สงวนไว้สำหรับเครือข่ายในบ้านตาม RFC 8375 |
.lan |
ล้มเหลว | ไม่เป็นทางการแต่มีการใช้อย่างแพร่หลาย |
| TLD ที่ไม่ได้จดทะเบียนอื่น ๆ | ล้มเหลว | TLD ทั้งหมดที่ไม่มีอยู่ใน IANA root zone |
- สำหรับ
.testแม้ตาม RFC 6761 จะต้อง ถูก resolve ผ่าน DNS ปกติได้ แต่ macOS 26 กลับจัดการเป็น mDNS-only - ในทางกลับกัน โดเมนที่จดทะเบียนกับ IANA เช่น
google.com,bbc.co.ukยังคงทำงานได้ตามเดิม
ผลกระทบต่อสภาพแวดล้อมและเครื่องมือพัฒนา
-
เวิร์กโฟลว์ DNS สำหรับการพัฒนาแบบโลคัลหยุดทำงานทั้งหมด
- นักพัฒนาที่ใช้
dnsmasq+/etc/resolver/กับ*.test,*.internalเป็นต้น - ฟังก์ชันการ resolve ชื่อคอนเทนเนอร์ ของ Docker Desktop และเครื่องมือประเภทเดียวกัน
- Vagrant, Tailscale, VPN clients ที่สร้างไฟล์
/etc/resolver/อัตโนมัติ - เครื่องมือพัฒนา Kubernetes แบบโลคัล (
minikube,kind,k3dเป็นต้น) สำหรับการ resolve*.cluster.local
- นักพัฒนาที่ใช้
-
เนื่องจากระบบยังแสดงการตั้งค่า resolver ว่าปกติใน
scutil --dnsผู้ใช้จึงสังเกตปัญหาได้ยาก และไม่มี log หรือข้อความผิดพลาดบ่งชี้ชัดเจน
วิธีแก้ชั่วคราวและข้อจำกัด
- วิธีเดียวที่ใช้งานได้คือ เพิ่มการแมปโดเมนด้วยตนเองใน
/etc/hosts- วิธีนี้ข้าม
mDNSResponderไปทั้งหมด - แต่ ไม่สมจริงใน Docker หรือสภาพแวดล้อม DNS แบบไดนามิก และต้องใช้สิทธิ์
sudoทุกครั้งที่มีการเปลี่ยนแปลง
- วิธีนี้ข้าม
ข้อมูลทางเทคนิคและสภาพแวดล้อมที่ใช้ตรวจสอบ
- macOS 26.3.1 (Build 25D771280a), Apple Silicon (arm64)
- ติดตั้ง
dnsmasqผ่าน Homebrew และรับฟังบน 127.0.0.1:53 - คำสั่ง
digและhostตอบกลับได้ปกติ ส่วนping·curl·python3 socket.getaddrinfoล้มเหลว - เอกสารและมาตรฐานที่เกี่ยวข้อง:
man 5 resolver— เอกสารกลไก/etc/resolver/ของ macOS- RFC 6761 — นิยามโดเมน special-use เช่น
.test,.localhost,.invalid,.example - RFC 8375 — นิยามโดเมน
home.arpa - IETF draft-ietf-dnsop-interneti-mdn — ร่าง special-use domain
.internal
3 ความคิดเห็น
เพราะเรื่องนี้ ผมเลยใช้ Tailscale MagicDNS ไม่ได้มาหลายวันแล้ว..
หวังว่า tailscale จะช่วยหลบเลี่ยงปัญหานี้ได้
ความเห็นจาก Hacker News
ผมเลิกใช้ macOS ก็เพราะ ปัญหาจุกจิกเล็กๆ น้อยๆ (papercuts) แบบนี้แหละ
การใช้ LLM เขียนบั๊กรายงานก็พอรับได้ถ้ามีการทบทวนก่อน แต่ถ้าปล่อยให้มีข้อผิดพลาดชัดๆ อย่าง “ใช้ได้บน macOS 25” หลุดไปตรงๆ ความน่าเชื่อถือก็ลดลง
ถ้ารายงานแบบนี้เพิ่มขึ้นเรื่อยๆ สุดท้ายคนก็คงโยน รายงานที่ AI เขียน ทิ้งไปเลยเพราะภาระในการตรวจสอบ
การให้ AI เขียนข้อความในนามของผมมันเป็น การเสียมารยาท ที่ให้ความรู้สึกว่า “เวลาของฉันมีค่ากว่าเวลาของคุณ”
ถ้าการเปิดเผยต่อสาธารณะว่าใช้ AI ทำให้คุณลำบากใจ นั่นก็ควรเป็นสัญญาณให้กลับไปคิดใหม่ว่ากำลังใช้มันไปเพื่ออะไร
จะยกตัวอย่างที่น่าปวดหัวพอๆ กันจาก Linux หรือ Windows ก็ได้ สุดท้ายมันก็เป็นเรื่องของ “จะเลือกพิษแบบไหน”
Microsoft ขึ้นชื่อเรื่อง รักษาความเข้ากันได้ย้อนหลัง ส่วน Apple ขึ้นชื่อเรื่อง กล้าทำให้ของเดิมพัง
ทุกวันนี้ Microsoft ก็ไม่ได้อนุรักษ์นิยมเหมือนเมื่อก่อนแล้ว ส่วน Apple กลับดูเสถียรกว่าในอดีตเสียอีก
อย่าง NixOS แค่เลือกเวอร์ชันก่อนหน้าจากเมนูบูตก็ย้อนทั้งระบบกลับไปได้
บนโน้ตบุ๊กผมใช้ macOS แต่เวลาทำงานจริงส่วนใหญ่ก็ทำอยู่ใน Linux container
macOS 26 เป็นเวอร์ชันที่ ทำลายความเข้ากันได้มากที่สุดเท่าที่เคยมีมา
มีการเปลี่ยนแปลงโดยตั้งใจหลายอย่างจนทำให้การพัฒนาแอปยากมาก
ตัวอย่างเช่นแอป Lunar ไม่สามารถตั้งค่า SDR nits ตามต้องการได้อีกแล้ว ทำให้การควบคุมความสว่างใช้งานไม่ได้ และ
แอป YellowDot ก็ถูกบล็อกไม่ให้ปรับความสว่างของไฟแสดงสถานะไมโครโฟนจนใช้งานไม่ได้
นอกจากนี้ยังมี บั๊กอีกหลายอย่าง เช่นปัญหา mouse event ในหน้าต่างที่ไม่มี title, การใช้ gamma table ไม่ได้,
และปัญหาที่แอปอย่าง Clop สูญเสีย path ของไฟล์ต้นฉบับขณะลากไฟล์
หวังว่า macOS 27 จะเป็นแบบนั้นด้วย (ที่มา)
ปรัชญาของ macOS มันทั้ง ดื้อและยัดเยียดฝ่ายเดียว จนน่าอึดอัด
ผมไม่ได้ใช้ macOS โดยตรง แต่ในทางทฤษฎีมันน่าจะพอทำได้
คงต้องทำใจไปก่อนสักพัก
เป็นมาตรการเพื่อไม่ให้มัลแวร์ซ่อนการเข้าถึงกล้องและไมโครโฟนได้
อีกอย่าง การจำกัดความสว่าง SDR ก็อาจเป็นความตั้งใจเพื่อป้องกันปัญหาแบตเตอรี่ของ จอ OLED ที่กำลังจะตามมาในอนาคตด้วย
ผมยังคงรอวันที่ Apple แยกฮาร์ดแวร์ออกจากซอฟต์แวร์
ผมอยากได้ Apple Silicon แต่ไม่ชอบ OS ของพวกเขา
ถ้าผมรัน kernel กับโมดูลของตัวเองไม่ได้ มันก็ ไม่ใช่อุปกรณ์ของผม
โน้ตบุ๊กอีกเครื่องข้างๆ ผมบูตด้วย coreboot ซึ่งมันสะท้อนปรัชญาของผม
เวลาพัฒนาเว็บแบบโลคัล ผมใช้
*.localhostเบราว์เซอร์สมัยใหม่ทั้งหมดจะ ตีความเป็น 127.0.0.1 อัตโนมัติ จึงไม่ต้องตั้งค่า DNS หรือแก้ hosts
แต่จะไม่ครอบคลุมโปรแกรมนอกเบราว์เซอร์อย่าง python, wget เป็นต้น
*.*.localhostก็รองรับด้วย ทำให้ตอนนี้สามารถ จำลองโครงสร้างโดเมนของโปรดักชันบนเครื่องโลคัลได้ตรงๆArchiveBox ใช้ความสามารถนี้เพื่อแยกโดเมนตามแต่ละ snapshot และ ลดความเสี่ยงด้านความปลอดภัย
.localhostมันยาวไปหน่อยเมื่อก่อนเคยใช้
.localแต่ชนกันบ่อยมากdev.our-root-domain.comโดย แมปจาก public DNS ไปที่ 127.0.0.1ผมใช้การตั้งค่าที่ ให้บริการ local TLD หลายตัว บนเครื่อง Yosemite รุ่นเก่ามานานแล้ว
วิธี
/etc/resolverนั้นจริงๆ ถูกประกาศว่า กำลังจะเลิกใช้ มาตั้งแต่ราวปี 2014 และครั้งนี้ก็ดูเหมือนจะถูกถอดออกไปอย่างสมบูรณ์แล้วทางที่ถูกต้องคือใช้
scutilโดยตรงเพื่อบันทึกการตั้งค่าแทนscutilอย่างเดียวก็ยังไม่พอการ query บางอย่างใน macOS ยังผ่าน mDNSResponder ซึ่งจะเพิกเฉยหรือเขียนทับการตั้งค่านี้อยู่
สุดท้ายแล้วใช้ unbound หรือ dnsmasq กลับง่ายกว่า
ผมเองก็ใช้หลาย TLD ด้วยชุด
/etc/resolver/X+ dnsmasq และไม่มีปัญหาอะไรในไฟล์คอนฟิกผมใส่คำสั่ง
domainไว้เสมอในทางปฏิบัติแทบทุกครั้งก็ต้องมีค่านี้อยู่แล้ว
บางที เพิ่มรายการ
domainเข้าไปแล้วอาจแก้ปัญหาได้ผมใช้ Linux เป็นหลัก แต่ไม่ค่อยเข้าใจว่าทำไมหลายคนถึงบอกว่า ดีไซน์ของ macOS แย่
ถ้ามองแค่ UX แล้ว macOS ให้ความรู้สึก ขัดเกลามาดีทีเดียว
ธีมยอดนิยมหลายตัวของ Gnome ก็ล้วนเลียนแบบสไตล์ macOS กันทั้งนั้น
โดยเฉพาะบน HN ผมยิ่งคิดว่าเป็นแบบนั้น
การปรับขอบหน้าต่างอาจไม่สะดวก แต่ภาพรวมยังน่าพอใจ
สุดท้ายทุก OS ก็มีบั๊กทั้งนั้น
ตัวอย่างชัดๆ ก็คือกล่องโต้ตอบการแจ้งเตือน
เพียงแต่เสียดายที่ ปรับแต่งได้น้อย
การโหยหา UI เก่าๆ แบบ Windows 98 อาจเป็นเรื่องของช่องว่างระหว่างวัยก็ได้
วิธีสลับเข้าโหมดเต็มจอนั้นแปลกดีแต่พอชินแล้วก็สะดวก
แค่ ไม่มี window tiling แล้วลำบาก
ถึงอย่างนั้นผมก็ยังชอบ Linux มากกว่า แม้เรื่อง suspend กับการจัดการพลังงานจะมีปัญหามา 8 ปีแล้วก็ตาม
เมื่อก่อน Apple เคยบล็อก self-signed certificate บน iOS จนการพัฒนา HTTPS แบบโลคัลแทบเป็นไปไม่ได้
ยากจะเข้าใจว่าทำไมถึงไปยุ่งกับเรื่องแบบนั้น
ผมชอบ macOS
มันมี zsh ติดตั้งมาให้เป็นค่าเริ่มต้น และทำให้ผมทำแทบทุกอย่างที่เคยทำบน Linux ได้บนคอมพิวเตอร์ส่วนตัวด้วย
*.localhostใช้งานได้อยู่แล้วโดยปริยายแม้ไม่มี dnsmasq ก็เชื่อมหลาย hostname เข้ากับ 127.0.0.1 ได้
*.example-privateยังจำเป็นสำหรับแยกหลายอุปกรณ์ด้วย private IPถ้าจะใช้แค่ localhost อย่างเดียวก็ใช้ 127.0.0.1 ไปตรงๆ ก็พอ
ส่วนตัวผมใช้ *mDNS แบบ .local เพื่ออาศัยการตั้งค่าอัตโนมัติบนพื้นฐาน DHCP