0027 | ปัญหาโลกแตกกับ DNS

Thursday, July 24th, 2008 Posted in IP Network | 2 Comments »

ว่าไปก็เห็นจะโลกแตกจริงๆ แฮะ
กับปัญหาล้านแปด แต่ดั๊นมาเซตผิดอยู่ที่เดียวอะไรอย่างนี้
เลยกลายเป็น lookup ไม่ออกมั่ง ออกแต่ ip มั่วมั่ง อะไรพวกนี้บ่อยไปครับ

ก่อนอื่นก็ต้องมาไล่กันที่ระบบ Root DNS ก่อน

Tracing to icez.net[a] via I.ROOT-SERVERS.NET, maximum of 1 retries
I.ROOT-SERVERS.NET (192.36.148.17)
|\___ I.GTLD-SERVERS.net [net] (192.43.172.30)
|     |\___ ns6.thzhost.com [icez.net] (203.146.170.140) Got authoritative answer
|      \___ ns2.thzhost.com [icez.net] (203.146.129.182) Got authoritative answer
…..
|\___ K.GTLD-SERVERS.net [net] (192.52.178.30)
|     |\___ ns6.thzhost.com [icez.net] (203.146.170.140) (cached)
|      \___ ns2.thzhost.com [icez.net] (203.146.129.182) (cached)
\___ J.GTLD-SERVERS.net [net] (192.48.79.30)
|\___ ns6.thzhost.com [icez.net] (203.146.170.140) (cached)
\___ ns2.thzhost.com [icez.net] (203.146.129.182) (cached)

ns2.thzhost.com (203.146.129.182)       icez.net -> 203.146.129.182
ns6.thzhost.com (203.146.170.140)       icez.net -> 203.146.129.182

นี่แหละครับ วิธี lookup ของระบบ DNS
ไอ้เจ้า I.ROOT-SERVERS.NET นี่เป็น server ของ ICANN ครับ
ทำหน้าที่รองรับ DNS request ของระดับ TLD
คือเป็น authoritive zone ของ TLD ทุกอัน
หากเกิด TLD ใหม่ขึ้นมาก็มาถามที่นี่ได้ครับว่ามันชี้ไปที่ไหนต่อ
จริงๆ ROOT SERVERS นี่มีเยอะครับ แต่เผอิญว่า I.ROOT-SERVERS.NET มันอยู่ในไทย (ที่ กสท) ก็เลยใช้ตัวนี้ซะเลย

ลำดับต่อมา พอได้ DNS ของ TLD มาแล้ว ก็ไปถามต่อว่า domain เราอยู่ DNS ไหน
(จริงๆ มันถามแค่ที่เดียวนะครับ นี่พอดีใช้ tool ช่วยนิดหน่อย มันเลยขึ้นมาหมดเลย)
อย่างกรณี .com .net พวกนี้จะมี GTLD-SERVERS.NET ของ verisign เป็นผู้ดูแล
ของไทยก็เป็น THNIC ดูแลอยู่ อะไรประมาณนี้แหละครับ

ทีนี้ เวลาได้ “ชื่อ” ของ nameserver มาแล้วเนี่ย เซิฟเวอร์มันจะบอก “IP” มาให้ด้วยเลย
ตามที่เราได้ลงทะเบียน nameserver ไว้นั่นแหละครับ
นั่นหมายความว่า ไม่ใช่ว่าอยู่ดีๆ เราจะตั้ง nameserver ทั่วไปได้เลย
ยังไงก็ต้องลงทะเบียนกับผู้ให้บริการจดโดเมนก่อน
ถ้าเอา “ชื่อ” ของ nameserver ไป lookup ดูมันก็จะได้อย่างนี้ครับ

Tracing to ns2.thzhost.com[a] via I.ROOT-SERVERS.NET, maximum of 1 retries
I.ROOT-SERVERS.NET (192.36.148.17)
|\___ F.GTLD-SERVERS.NET [com] (192.35.51.30) Got answer
|     |\___ ns6.thzhost.com [thzhost.com] (203.146.170.140) Got authoritative answer
|      \___ ns2.thzhost.com [thzhost.com] (203.146.129.182) Got authoritative answer
|\___ E.GTLD-SERVERS.NET [com] (192.12.94.30) Got answer
|     |\___ ns6.thzhost.com [thzhost.com] (203.146.170.140) (cached)
|      \___ ns2.thzhost.com [thzhost.com] (203.146.129.182) (cached)
……
|\___ I.GTLD-SERVERS.NET [com] (192.43.172.30) Got answer

|     |\___ ns6.thzhost.com [thzhost.com] (203.146.170.140) (cached)
|      \___ ns2.thzhost.com [thzhost.com] (203.146.129.182) (cached)
|\___ H.GTLD-SERVERS.NET [com] (192.54.112.30) Got answer
|     |\___ ns6.thzhost.com [thzhost.com] (203.146.170.140) (cached)
|      \___ ns2.thzhost.com [thzhost.com] (203.146.129.182) (cached)
\___ G.GTLD-SERVERS.NET [com] (192.42.93.30) *

H.GTLD-SERVERS.NET (192.54.112.30)      ns2.thzhost.com -> 203.146.129.182
I.GTLD-SERVERS.NET (192.43.172.30)      ns2.thzhost.com -> 203.146.129.182
K.GTLD-SERVERS.NET (192.52.178.30)      ns2.thzhost.com -> 203.146.129.182
M.GTLD-SERVERS.NET (192.55.83.30)       ns2.thzhost.com -> 203.146.129.182
A.GTLD-SERVERS.NET (192.5.6.30)         ns2.thzhost.com -> 203.146.129.182
D.GTLD-SERVERS.NET (192.31.80.30)       ns2.thzhost.com -> 203.146.129.182
E.GTLD-SERVERS.NET (192.12.94.30)       ns2.thzhost.com -> 203.146.129.182
ns2.thzhost.com (203.146.129.182)       ns2.thzhost.com -> 203.146.129.182
ns6.thzhost.com (203.146.170.140)       ns2.thzhost.com -> 203.146.129.182
F.GTLD-SERVERS.NET (192.35.51.30)       ns2.thzhost.com -> 203.146.129.182

เห็นมั้ยครับว่า พอลงทะเบียน nameserver แล้ว
ไอ้ GTLD SERVERS แทนที่จะตอบว่า domain นี้มี dns อะไร
มันก็เลยตอบพ่วง IP มาให้ด้วยเลย

ตรงจุดนี้คือจุดที่ผิดพลาดกันอันดับแรกๆ เลยครับ
ก็คือ สมมติ domain icez.net ชี้ไปที่ ns2.thzhost.com กับ ns6.thzhost.com
แต่ใน domain thzhost.com ไม่มี record ของ ns2.thzhost.com กับ ns6.thzhost.com
ก็อาจทำให้ไม่สามารถ lookup ได้ เพราะ dns บางตัวจะไม่เอา ip มาจาก gtld-servers คือจะไป lookup หาเองตรงๆ
แล้วมันหา ip ของ nameserver ไม่เจอ หรือ IP ไม่ตรงกันกับที่ลงทะเบียนไว้ ก็เน่าครับ

———————————————

มากันที่จุดที่สอง: ว่าด้วย “NS record”
เหมือนจะง่ายครับ
แค่ชี้ใน domain ให้ตรงกับที่ lookup ขึ้นมาได้
อย่างของ icez.net ก็คือ ns2.thzhost.com กับ ns6.thzhost.com
ก็เข้าไปตั้งค่าใน DNS Server ตามนี้เลยครับ

icez.net. IN NS ns2.thzhost.com.
icez.net. IN NS ns6.thzhost.com.

———————————————

จุดที่สาม: IP ของ nameserver
นอกจากที่เราไปลงทะเบียน nameserver ไว้กับที่จดโดเมนแล้ว
เราก็ต้องมาเซตที่เครื่อง dns server เราด้วยครับ
ns2.thzhost.com กับ ns6.thzhost.com คือ subdomain ของ domain thzhost.com
ก็เข้าไปที่ DNS Server ของ thzhost.com
ไปเพิ่ม record ตามนี้ครับ

ns2 IN A 203.146.129.182
ns6 IN A 203.146.170.140

———————————————

จบ เห้อ ยาวดีจัง ไม่ได้เขียนอะไรยาวๆ แบบนี้มาพักนึงและ
ไม่รู้เรื่องอย่าว่ากันนะครับ (ฮา) เขียนตอนเช้าก็เงี้ย

Tags: ,

0022 | สร้าง subdomain แบบสิ้นคิด

Sunday, June 15th, 2008 Posted in Web Server | 8 Comments »

เล่นง่ายมากเลยครับวันนี้
พี่เอก bluegy.com ให้มา config แปลงจาก subfolder เป็น subdomain
สมมติ URL เดิม http://www.icez.net/blog/
ก็ให้มันเข้าจาก http://blog.icez.net/ แทนได้เลย
เราก็นึกก่อนเลย htaccess rewrite เอาก็จบ เสร็จแล้วก็เลยสิ้นคิดมากมาย
นั่ง search หาข้อมูลกันแบบงงๆ เล็กน้อย มั่วเอาจาก wordpress mu
สุดท้ายก็ได้ตัว .htaccess ตัวนี้มาครับ

RewriteEngine On
RewriteBase /

RewriteCond %{REQUEST_URI} !\.php$
RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule . – [L]

RewriteCond %{HTTP_HOST} !www.icez.net
RewriteCond %{HTTP_HOST} !^icez.net

RewriteCond %{HTTP_HOST}<>%{REQUEST_URI} ^([^.]+)\.icez\.net(:80)?<>/([^/]*) [NC]
RewriteCond %1<>%3 !^(.*)<>\1$ [NC]
RewriteRule ^(.*)$ /%1/$1 [L,QSA]

เจอปัญหาอย่างนึงว่า ถ้าสมมติเข้าเว็บ อย่าง http://something.icez.net/
แล้วไม่มี folder ชื่อนี้อยู่ในระบบเนี่ย
มันจะเด้งหน้า Internal Server Error ขึ้นมาเลย

แก้ได้แล้วค้าบบบบ ไม่เจอแล้ว เย้ๆๆๆๆๆๆๆๆๆ
(ถ้าไม่เจอ subdomain จะขึ้นหน้า 404 ธรรมดาแทน)

อ้อ ถ้าใครจะเอาไปทำ อย่าลืมเพิ่ม config apache ลงใน virtual host ด้วยนะครับ

ServerAlias *.icez.net

ตามนี้เลยฮะ (แก้ตัวสีน้ำเงินด้วยน่อ)
แล้วก็อย่าลืมไป add DNS record ด้วยนะจ๊ะ

*.icez.net. IN A 203.146.129.182

.

.

แก้ไขเพิ่มเติมจ้าาาา ด้านบนเลย ^^”

Tags: , ,