Domain Name System (DNS) คือระบบที่เอาไว้จัดการบริหารชื่อ Domain อย่างที่เราใช้ๆ กันบนอินเทอร์เน็ต การตั้งค่า DNS สำหรับคนที่เพิ่งจะเริ่มทำเว็บเป็นเรื่องน่างนงงมากเพราะว่ามีอะไรให้ตั้งเยอะแยะมากมาย วันนี้เลยจะมาเขียนแบบกระชัดสำหรับคนที่ยังงงๆ เอาแบบอ่านรวดเดียวรู้เรื่อง โดยสรุปสิ่งที่จะเล่าวันนี้ก็คือวิธีการตั้งค่า Domain Name ของเราว่า ถ้าเข้ามาที่ชื่อนี้ ให้ไปเรียกหา Server ที่ไหนต่อนั่นเอง ซึ่งเดี๋ยวจะอธิบายถึงชนิดของ record ที่จำเป็นต้องรู้แต่ละอัน
มีเริ่มกันที่โครงสร้างบนอินเทอร์เน็ตเวลาเปิดเว็บก่อน เอาแบบยังไม่มี DNS ก็คือ เวลาผู้ใช้จะใช้งาน Web Server ผู้ใช้ก็พิมพ์ที่อยู่ (IP Address) ของ server ลงไปแล้วเปิดผ่านทาง Web Browser ทีนี้ก็จะเกิดการเชื่อมต่อโอนย้ายข้อมูลได้เป็นปรกติ แต่โลกความเป็นจริงก็คือใครมันจะไปนั่งจำ IP Address กัน เขาก็เลยตั้งสิ่งที่เรียกว่า DNS ขึ้นมา โดยใช้ชื่อแทนเพื่อให้จำง่าย ต่อมาพอมีชื่อก็ต้องมีคนเก็บข้อมูลว่าชื่อไหนต้องส่งไปที่ไหน สิ่งนั้นก็เรียกว่า DNS Server นั่นเอง (DNS Servers นี่เขาจะเชื่อมต่อหากันอย่างยิ่งใหญ่ ช่วยกันทำงานแทบทั้งโลก) แต่ประเด็นมันมีอยู่ว่าปรกติแล้ว 1 Domain จะมีฟังก์ชั่นมากมายหลายอย่าง DNS Server จะมีประเภทของ Record ให้ใช้หลายอย่าง และนั่นเป็นเหตุแห่งความงงนั่นเอง ซึ่งเดี๋ยวจะอธิบายทีละอัน
กลับมาที่ Domain จะเห็นว่าจะมีการจด Domain บลาๆ อะไรกัน โดยสรุปอย่างไวในเรื่องนี้ก็คือ จะมีหน่วยงานกลางที่จัดการควบคุมความเป็นเจ้าของ Domain โดยให้มันไปเชื่อมกับคนหรือองค์กรนั่นเอง ซึ่งในความเป็นจริงแล้วก็คือจะมี Provider ระดับล่างลงมาที่ได้รับสิทธิ์ในการดูแลเรื่องพวกนี้แทนองค์กรข้างบนดังกล่าว แต่จะต้องปฏิบัติให้ถูกต้องกฎต่างๆ และองค์กรระดับล่างนี่ล่ะเราเรียกว่า Domain Provider ซึ่งเราจะไปจด Domain กับเขา ทีนี้เวลาเราได้ Domain มา มันก็จะให้เราเซทสิ่งที่เรียกว่า Name Server (NS) ซึ่งมักจะมีมากกว่า 1 ช่อง สิ่งที่เราจะกรอกลงไปก็คือ DNS Servers ของเรานั่นเอง ซึ่งสามารถหา DNS Servers ได้จาก DNS Provider หวังว่ายังตามทันนะ 555
ต่อมาก็จะมาถึงจุดที่เราสนใจแล้ว นั่งก็คือ DNS Server นั่นเอง พอผู้ใช้เรียก Domain เหล่า DNS Servers เขาก็จะช่วยกัน Resolve เพื่อให้ DNS Server ต้นทาง ซึ่งมันจะวิ่งไปหา Domain Provider จากนั้น Domain Provider ก็จะให้ชื่อของ DNS Server ที่เราลงชื่อเอาไว้ แล้วก็ Resolve ต่อไปจนถึง DNS Server นั่นเอง ทีนี้ก็เป็นหน้าที่ของ DNS Server ที่จะบอกว่า Domain (รวมถึง Subdomain) ที่ผู้ใช้ขอมา จะต้องเรียกไปหา Server ที่ IP อะไร ถ้าผู้ใช้เรียกขอใช้งานปรกติดี ก็จะได้ IP กลับมาเพื่อใช้งานนั่นเอง 🙂
ต่อมาสำหรับคนทำเว็บ (จริงๆ ต้องบอกว่า Server Admin) ก็จะต้องไปลงทะเบียนว่าเว็บของตน Domain อะไร และจะให้ชื่อไหน ส่งไปที่ IP (หรือ domain) อะไร แน่นอน สิ่งแรกทีต้องมีก็คือ DNS Provider ในที่นี้ผมจะยกตัวเองเว็บตัวเองนี่ล่ะที่ DNS Provider เป็นของ Cloudflare ซึ่งความเป็นจริงแล้ว Cloudflare บริการหลักของเขาเป็น CDN แต่เขาก็มี DNS Service ให้เราใช้งานด้วย (มันเป็นของคู่กัน) และที่สำคัญ ฟรีและดีมากๆ 🙂
วิธีใช้ก็แสนง่าย ไปสมัคร Cloudflare เสร็จแล้วใส่ Domain ที่จะใช้ลงไป จากนั้นก็ย้าย NS จาก Domain Provider มาหาที่ Cloudflare ซึ่งจะมีบอกว่าให้ย้าไปใช้ชื่ออะไร ไม่นานพอย้ายเรียบร้อยก็จะใช้งานได้ เสร็จแล้วก็เข้ามาสิ่งของ DNS แล้วก็จะเห็นหน้าตาประมาณนี้
ขอเริ่มเล่าจากข้างล่างก่อน นั่งก็คือ Cloudflare Nameservers นั่นเอง จะเห็นว่ามันจะมี NS อยู่ 2 อัน อันนี้เป็นสิ่งที่เขาเซทมาให้อยู่แล้ว ซึ่งจะตรงกับที่เราเซทใน Domain Provider นั่นเอง
ต่อมาจะเข้าสู่สิ่งที่อยากจะเขียนจริงๆ ละ สังเกตข้างบนดู จะเห็นแถบเอาไว้ให้กรอก มีตั้งแต่ช่อง search (เป็นการบอกโดยนัยว่าบางทีมันมีเยอะมากจนต้องใช้ search เลยทีเดียว) ลงมาข้างล่างจะเป็นชนิดของ record แล้วก็เป็น field ของ data ซึ่งจะเปลี่ยนไปตามชนิด ต่อมา TTL (Time to Live) เป็นการบอกว่าให้เก็บไว้บนเครื่องนานเท่าไหร่ (Caching) จะส่งผลให้ผู้ใช้ไม่ต้องมาถามใหม่บ่อยๆ ช่วยให้เข้าเว็บได้เร็วขึ้น แต่ก็ส่งผลเสียเวลาเปลี่ยนข้อมูล เพราะต้องรอ Caching หมดอายุถึงจะอัพเดท สุดท้ายเป็นก้อนเมฆส้มๆ เป็นการบอกว่าถ้าเขามาที่ record นี้ให้วิ่งผ่าน Cloudflare นะ ถ้ากดอีกทีจะเป็นสีเทา คือให้ส่งมาที่ Server เราเลย Cloudflare ทำหน้าที่เป็น DNS Provider พอ
ขอทำความเข้าใจก่อนนิดนึง Name ที่จะพูดถึงต่อจากนี้เป็นต้นไปก็คือ Domain Name ซึงรวมไปถึง Subdomain ด้วย โดยปรกติแล้วที่ Root Domain (domain ที่ไม่มี sub เช่น spicydog.org) เขาจะใช้เครื่องหมาย @ เป็นตัวแทน อันนี้ขึ้นอยู่กับ DNS Provider แต่ Cloudflare ใช้ชื่อเต็มๆ เลย ส่วนชื่ออื่นๆ ที่เห็นอันนั้นคือเป็น subdomain แล้ว ตัวอย่างเช่น ถ้าเห็น Name = www หมายความว่า มันชี้ไปหา www.spicydog.org นั่นเอง
เรามาเริ่มกันที่ Record Types ถ้ากดออกมาก็จะเห็นว่ามีให้เลือกหลายชนิด ที่ต้องรู้จริงๆ มีแค่ NS, A, AAA, CNAME, MX, TXT เท่านั้นล่ะ ที่เหลือเป็นระดับสูงซึ่งไม่อธิบายในที่นี้ โอเค มาเริ่มกันเลย
- NS (Name Server)
อันนี้ได้พบเจอกันไปแล้ว นั่นก็คือเขาที่นี่ให้ชี้ไปหา DNS Server ไหนนั่นเอง
เวลาเลือกมันก็จะมีให้ใส่ 2 fields ก็คือ Name กับ Name Server
ปรกติอันนี้ไม่ค่อยได้ใช้ ถ้าไม่ทำ DNS Server หลาย Level ก็ข้ามไป ไม่ต้องสนใจ - A (IPv4)
นี่เป็น Type ที่สำคัญที่สุด มันจะบอกว่า ถ้าเขามาหาที่ Name นี้แล้วใช้ชี้ไปหา IP (v4) อะไร ซึ่งตรงตามหลักการสุดๆ ใส่ชื่อลงไป แล้วก็ใส่ IP ลงไป ทุกๆ Domain อย่างน้อยจะต้องมี A 1 record สำหรับชี้หา Root Domain นั่นเอง - AAA (IPv6)
อันนี้คล้ายๆ กับ A แต่ว่าจะใช้สำหรับ IPv6 สำหรับ Web Server ใครที่รองรับ IPv6 แล้วและเปิดใช้งาน ก็สามารถมาตั้งค่าใส่ลงไปที่นี่ได้เลย - CNAME (Canonical Name)
อันนี้เป็น Record ที่ใช้งานเยอะที่สุดสำหรับเว็บเล็กๆ จะให้พูดเป็นภาษาง่ายๆ ก็คือ Record นี้บอกว่า ถ้าเข้ามาที่ Name นี้แล้วให้ไปหาที่ Domain Name ไหนต่อ ลองดูตัวอย่างที่ชัดเจนสุดๆ ก็คือ Name: www จะเห็นว่ามันชี้ไปหา spicydog.org นั่นหมายความว่า เมื่อเข้า www.spicydog.org แล้ว มันจะ Resolve ไปหา spicydog.org ให้ ซึ่งพอไปถึงจุดนั้นแล้วก็จะไปเจอกับ Record A และได้ IP กลับมานั่นเอง
เหตุที่ Type นี้ใช้งานเยอะก็เป็นเพราะว่าหลายๆ เว็บจะมี Subdomains หลายๆ อัน เช่น mail, ftp และอื่นๆ ซึ่งล้วนแต่ชี้ไปหาเครื่องเดียวกัน เวลาตั้งค่าแทนที่จะใช้ A แล้วเขียน IP ซ้ำๆ ลงไปรัวๆ ก็มาใช้ CNAME ชี้ไปหา A แทน ทีนี้เกิดย้าย IP Server เวลาแก้ก็มาแก้ที่ A อันเดียวจบเลยแสนสบาย
สังเกตว่า CNAME สามารถส่งออกไป Domain อื่นที่ไม่ใช่ของเราได้ด้วย ลองดูที่ Record: money-counter ผมให้มันส่งไปหาโฮสที่อยู่บน Firebase ซึ่งทางโน้นได้เซทไว้แล้วว่าให้รอรับ Request จาก Domain: money-counter.spicydog.org - MX (Mail Exchanger)
อันนี้เป็น Records สำหรับชี้ไปหา Mail Servers (อย่าสับสนระหว่าง Mail Server กับ Web Mail คนละเรื่องกัน) เวลามีการส่ง SMTP อะไรพวกนี้ มันก็จะมาถามหาที่ MX เนี่ยล่ะ สังเกตว่าของผมมีหลายอันมาก เป็นเพราะว่าใช้บริการของ GApps แล้วเขามี Mail Servers หลายตัว เอาไว้เวลาล่มมันก็จะส่งไปหาตัวอื่นๆ ให้นั่นเอง ค่าพวกนี้ Google บอกให้ว่าให้เซทว่าอะไร แต่ถ้าใครใช้ Mail Server ของตัวเองก็ใส่ Domain Name ลงไปเฉย (เหมือนกับ CNAME) สังเกตว่ามาสิ่งที่เยอะขึ้นมาจากปรกติก็คือ Priority อันนี้เป็นการบอกว่า ให้ส่งหา Server นี้มากกว่าอันอื่นๆ นั่นเอง (Preference) โดยเลขน้อยคือมีความสำคัญมาก - TXT (Text)
อันสุดท้ายก็จะแนะนำในทีนี้ก็คือ TXT ซึ่งไม่ได้ส่งผลอะไรกับการ Resolve DNS ทั้งสิ้น ส่วนใหญ่จะใช้สำหรับการยืนยันความเป็นเจ้าของ Domain และ Config ต่างๆ เช่นการรับอีเมล์ SPF, DKIM, DMARC อะไรพวกนี้
ในของผมจะเห็นว่าจะมีของ Firebase อยู่เช่นกัน แบบนี้ล่ะที่เอาไว้บอกว่าใช้สำหรับยืนยันความเป็นเจ้าของ Domain เพราะมันจะมีแต่เจ้าของ Domain เท่านั้นที่สามารถแก้การตั้งค่าตรงนี้ได้
โอเค จบเรื่องชนิดของ DNS Records ไปเรียบร้อย หวังว่าจะเข้าใจวิธีการเซทกันแล้วว่าควรจะทำอะไรยังไง เอาจริงๆ ก็ลอกๆ ของเก่าแก้ค่าให้ถูกเอาซะส่วนใหญ่ แต่เวลาเจอเคสใหม่ๆ เช่นเปิด Subdomain ใหม่ก็ควรจะทำกันให้เป็นนะ 🙂
ต่อมาจะอธิบายเรื่องการตรวจสอบการตั้งค่า DNS Server ซึ่งจะใช้โปรแกรม dig ที่มีติดมาให้อยู่แล้วบนระบบปฏิบัติการตระกูล *nix ทั้งหลาย ชุดคำสั่งที่ใช้หลักๆ ก็ประมาณนี้
1 |
dig DOMAIN_NAME TYPE @NAME_SERVER |
โดยที่
- DOMAIN_NAME คือชื่อที่จะ Resolve
- TYPE คือ DNS Record Type นั่งเอง โดย A เป็น Default
- NAME_SERVER คือให้ไปใช้ NAME_SERVER ไหน Default ก็คือที่มันชี้ออกมาปรกตินั่นแหละ อันนี้สำคัญมากเพราะบางทีเรากำลังย้าย Name Server แต่ยังไม่ใช้ NS มาที่อันใหม่ ต้องการจะตรวจสอบความสมบูรณ์พร้อมใช้งานจริงก็ใส่ @ ลงไปเพื่อบังคับเลือก DNS Server
ตัวอย่างเช่น dig spicydog.org จะได้คำตอบคือ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
; <<>> DiG 9.8.3-P1 <<>> spicydog.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1239 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;spicydog.org. IN A ;; ANSWER SECTION: spicydog.org. 299 IN A 54.179.177.195 ;; Query time: 62 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Jan 15 17:09:04 2017 ;; MSG SIZE rcvd: 46 |
ส่วนสำคัญคือ
- QUESTION SECTION บอกว่าเราส่งไปเข้าไป
- ANSWER SECTION บอกว่าได้อะไรกลับมา
ต่อมาลอง dig www.spicydog.org บ้าง
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
; <<>> DiG 9.8.3-P1 <<>> www.spicydog.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5619 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.spicydog.org. IN A ;; ANSWER SECTION: www.spicydog.org. 299 IN CNAME spicydog.org. spicydog.org. 299 IN A 54.179.177.195 ;; Query time: 70 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Jan 15 17:09:08 2017 ;; MSG SIZE rcvd: 64 |
จะเห็นว่ามันไปได้ CNAME มาก่อนว่า www.spicydog.org => spicydog.org
จากนั้นจึงไปแก้ spicydog.org => 54.179.177.195 ออกมา
ต่อมาลองแบบมี Type บ้าง dig spicydog.org TXT
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
; <<>> DiG 9.8.3-P1 <<>> spicydog.org TXT ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27696 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;spicydog.org. IN TXT ;; ANSWER SECTION: spicydog.org. 299 IN TXT "globalsign-domain-verification=krP11YYMRJfhrMXijpvgf-E6PTx2PecX95_r_8TPQX" spicydog.org. 299 IN TXT "firebase=money-counter-3997c" spicydog.org. 299 IN TXT "v=spf1 include:_spf.google.com ~all" ;; Query time: 77 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Jan 15 17:24:47 2017 ;; MSG SIZE rcvd: 205 |
สังเกตว่าได้ออกมาหมดเลยที่เป็น Type TXT และเชื่อมอยู่กับ spicydog.org
ต่อมาลองผิดๆ ดูบ้าง เช่น dig xxx.spicydog.org
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
; <<>> DiG 9.8.3-P1 <<>> xxx.spicydog.org ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24226 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;xxx.spicydog.org. IN A ;; AUTHORITY SECTION: spicydog.org. 1799 IN SOA aron.ns.cloudflare.com. dns.cloudflare.com. 2023614123 10000 2400 604800 3600 ;; Query time: 84 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Jan 15 17:18:46 2017 ;; MSG SIZE rcvd: 96 |
อันนี้จะเห็น AUTHORITY SECTION กลับมาด้วย (ความเป็นจริงสั่งให้มันขึ้นก็ได้) เป็นการบอกว่าไปได้ข้อมูลมาจาก DNS Servers เครื่องไหน บางทีเราทำ Multiple DNS Servers เผื่อว่าบางที DNS Provider นี้ล่มก็ให้หลบไปใช้อีก Provider แทน เว็บจะได้ยังเข้าได้อยู่แม้จะล่มไปแล้วเจ้าหนึ่งก็ตาม เวลา Request แบบนี้รัวๆ เราก็จะเห็นว่ามันเปลี่ยนไปเรื่อยๆ แบบสุ่ม เป็นการกระจายโหลดในตัว แต่เว็บผมไม่ได้ต้องขนาดนั้น เพราะผมมั่นใจใน Cloudflare และความเป็นจริงก็คือล่มก็ล่มไป ไม่ได้มีคนเข้าอยู่แล้วปะ -_-
เคส DNS Provider ล่มนี่อย่ามองเป็นเรื่องตลก ผมเคยเจอมาแล้วครั้งนึงกับ Digital Ocean ตอนนั้นพี่แกล่มไป Server เบื้องหลังของระบบที่ทำดันเซทไว้ไม่ดี ไม่ได้ล็อค IP อาศัย DNS Server เอาก็เลยพากันล่มไปกันหมดเลย ถ้าได้ทำ Replica เอาไว้ก็คงยังรอดอยู่ ตอนหลังย้ายมาใช้ Cloudflare หมดและ เพราะเขาคุยว่า DNS Servers ของเราโยงใยกันเทพมาก ไม่ล่มแน่นอน!
โอเค น่าจะเพียงพอสำหรับการจัดการ DNS Server แล้ว ก็ขอจบเพียงเท่านี้ละกัน DNS Configuration ความจริงไม่ได้ยาก แต่ถ้าเริ่มจากไม่มีความรู้อะไรเลย กว่าจะเดาทางถูกก็ใช้เวลานานอยู่ อีกอย่าง DNS Provider แต่ละเจ้าก็ดันมีตั้งค่าหน้าตาไม่เหมือนกัน แต่สุดท้ายผมเชื่อว่าถ้าเราเข้าใจ Concept ซะอย่าง ไปใช้ที่ไหนก็ไร้ปัญหา 🙂