สร้าง DNS Record อัตโนมัติ ใน Bind9 กัน

ปัญหามีอยู่ว่า ผมมีเครื่องโหนด สำหรับสร้าง Virtual Machine จำนวน 400 เครื่อง และ DNS Record ใหม่จะต้องถูกสร้างเมื่อมีการสร้าง VM และ Start VMs เรียบร้อยแล้ว Sub Domain (Public DNS) ที่ได้ ลูกค้าสามารถนำ Public DNS นี้ไปใช้งานโดยการชี้ Record CNAME มายังเครื่อง VMs การสร้าง DNS Record ในลักษณะนี้ทำได้หลายวิธี ตั้งแต่การจัดการด้วยมือ, Script, Monitoring Script, myDNS ซึ่งแล้วแต่ละเลือกใช้ ซึ่งในแต่ละวิธีก็ใช้พลังภายในเยอะพอสมควร ผมมีวิธีง่ายๆ ในการสร้าง DNS Record โดยใช้ Generate Directive กันครับ จากตัวอย่าง VMs ทั้งหมดจะได้ IP Address จากการกำหนดจาก Virtual Network ซึ่งส่วนใหญ่เป็น Range IP ทั้ง Public IP และ Private IP (มีการ์ด 2 ใบ ที่เครื่องโหนด) ดังนั้น เราสามารถสร้าง DNS Zone ที่กำหนด Private และ Public IP ได้ แต่ Record ต้องไล่ใส่ลงไปตาม Range IP ที่กำหนด ได้ใน Virtual Network ซึ่งถ้าจะใส่ให้ครบทุก IP ก็คงมือหงิกกันเลยทีเดียว

Bind9 มี Generate Directive ที่เราสามารถใช้งานได้ โดยกำหนด Rage ของ IP Address และรูปแบบที่ต้องการได้ มาดูตัวอย่างกัน VM จะถูก Config ด้วย Private IP จาก Virtual Network (Private Network) และ Public IP จาก Virtual Network (Public Network) นั่นหมายความว่า VMs ทุกตัวจะมี 2 ขา DNS Zone ก็จะมี 2 ชุดคือ Private DNS และ Public DNS ดังนี้

ในส่วน Private DNS จะมี Domain ดังนี้

private-192-168-2-1.example.com. A 192.168.2.1
private-192-168-2-2.example.com. A 192.168.2.2
private-192-168-2-3.example.com. A 192.168.2.3
...

ส่วน Public DNS จะมี Domain ดังนี้

cloud-61-7-253-1.example.com. A 61.7.253.1
cloud-61-7-253-2.example.com. A 61.7.253.2
cloud-61-7-253-3.example.com. A 61.7.253.3
...

ทีนี้เรามา config Bind กัน ในส่วน Private DNS กำหนด Generate Directive ดังนี้

$GENERATE 1-255 private-192-168-2-$.example.com A 192.168.2.$

ส่วน Public DNS กำหนด Generate Directive ดังนี้

$GENERATE 1-255 cloud-61-7-253-$.example.com A 61.7.253.$

หากคุณทราบ IP Address ในส่วน Private IP และ Public IP คุณก็สามารถอ้างอิงจาก Sub Domain ได้แล้ว ยกตัวอย่างเช่น VM ชื่อ ubuntu-mail-server มี Private IP และ Public IP เป็น 192.168.2.23, 61.7.253.35 คุณสามารถใช้ Domain ชื่อ private-192-168-2-23.example.com และ cloud-61-7-253-35.example.com ใช้อ้างอิงได้ :)

อ่านเพิ่มเติมได้ที่ – Bind Manual

ติดตั้ง DNS Server พร้อม Master & Slave อย่างรวดเร็ว

ช่วงนี้เขียน How to บ่อยมากเนื่องจากซ้อมมือ Linux Server กลัวว่าสนิมจะขึ้นเพราะไม่ได้จับนานมากแล้ว 4 ปี เห็นจะได้ ตอนนี้มีเวลาว่างเลยได้ทดลองโน่น ทดลองนี่ ในครั้งนี้ก็จะมาว่ากันด้วยเรื่อง DNS Server ครับ DNS Server ถือเป็นแหล่งอ้างอิง Domain Name เพื่อทำหน้าที่แปลง URL ไปเป็น IP Address ซึ่งหน้าที่หลักของ DNS ก็ประมาณนี้ จริงๆ แล้วถ้าคนเราจำ IP Address ได้ทุกเว็บก็คงจะพิลึกไม่น้อย ;P เอ่อ เขาใช้ Domain กันน่ะครับ ทีนี้การประกาศ Domain Name ต้องอาศัย DNS Server เป็นตัวประกาศว่า Domain นี้ใช้ Name Server อะไร มี sub-domain อะไรบ้าง IP Address อะไร เป็นต้น ถ้าอ่านแล้วยังงงๆ ให้ท่านไปหาอ่านเอาเองที่ http://en.wikipedia.org/wiki/Domain_Name_Server ครับ

ในครั้งนี้จะ มาแนะนำการตั้ง DNS Server แบบเร็วๆ โดยมี 2 เครื่อง คือ master และ slave โดยเครื่อง slave จะทำหน้าที่อัพเดทข้อมูลจาก master อัตโนมัติ (replication) มาเริ่มกันเลย ในตัวอย่างนี้เราจะตั้ง DNS Server เพื่อใช้กับ Domain ชื่อ EXAMPLE.COM (จำง่ายดีครับ) โดยจะมีข้อมูลดังนี้ (ของผมเองนะ เปลี่ยน IP ไปตามที่คุณต้องการ)

Server 1 : ns1.example.com
IP Address : 172.16.19.226
Netmask : 255.255.0.0
Gateway : 172.16.16.1

Server 2 : ns2.example.com
IP Address : 172.16.19.73
Netmask : 255.255.0.0
Gateway : 172.16.16.1

ให้ ติดตั้ง Ubuntu Server ทั้ง 2 เครื่อง เลือกติดตั้ง DNS Server ทั้ง 2 เครื่องครับ ;) เมื่อติดตั้งเสร็จแล้วให้ config IP Address ให้ถูกต้อง
Continue reading

Load Balance ให้ Apache โดยใช้ DNS Round Robin

บังเอิญมีปัญหาเรื่องเซิร์ฟเวอร์ตายบ่อยๆ เพราะคนเข้าเว็บเยอะจนล้น แก้ปัญหาโดยการบีบโดนการใช้ mod_cband ไม่ได้ผลเพราะจะไม่มีใครเข้าเว็บได้เลย ซึ่งอาการหนักพอสมควร กรณีนี้แก้ไขได้โดยใช้ load balancing แต่ขึ้นอยู่ว่าจะ load balance ที่ไหน มาทำความเข้าใจปัญหากันก่อนครับ ตอนนี้ Web Server มีตัวเดียว เครื่องเซิร์ฟเวอร์รองรับ load ไม่ได้มากนัก CPU/RAM เต็มบ่อยๆ จนนิ่ง ปรับแก้ไข Config แล้วก็ตายเช่นเดิม ดังนั้นแก้ไขโดนการเพิ่มเซิร์ฟเวอร์เข้าไปอีก ในกรณีนี้เลือกวิธี load balancing ที่ง่ายสุดคือใช้ DNS load balancing คือ เป็นเว็บเดียวกันแต่มีหลายเครื่องและบอก DNS ว่ามีเซิร์ฟเวอร์หลายเครื่อง หมุน IP Address เอา ลองดูตัวอย่าง Google กัน

host www.google.com

www.google.com is an alias for www.l.google.com.
www.l.google.com has address 64.233.181.105
www.l.google.com has address 64.233.181.106
www.l.google.com has address 64.233.181.147
www.l.google.com has address 64.233.181.99
www.l.google.com has address 64.233.181.103
www.l.google.com has address 64.233.181.104
Continue reading

ประยุกต์ Wildcard DNS กับ Apache

คราวที่แล้วเขียนเรื่อง Wildcard DNS record ไป เพื่อบอกให้ Bind รู้ว่าอะไรที่เกี่ยวข้องหรือตรงกับเงื่อนไขให้อ้างอิง domain นั้นโดยตรง สำหรับ How-To ครั้งนี้จะมาเล่าวิธีกการประยุกต์ใช้? Wildcard DNS และการตั้งค่า VirtualHost เพื่อรองรับการเรียกผ่าน subdomain ใดๆ ใครจำเรื่อง DNS Wildcard ไม่ได้ลองมาพิจารณาดู record ดังนี้

example.com.        A    10.11.12.13
*.example.com.    CNAME    example.com.

หาก เรา dig xyz.example.com เราจะพบว่า DNS จะบอกว่า IP เป็น 10.11.12.13 คือ CNAME ของ example.com นั่นเอง คราวนี้หากเราจะเพิ่ม VirtualHost ให้ Apache จะทำได้อย่างไร และต้องการให้ซัพพอร์ทในทุกๆ subdomain มาลองดูวิธีกันนะครับอันดับแรก เริ่มจากการตั้งค่า DNS กันก่อน ในโซนไฟล์ให้เพิ่ม wildcard สำหรับ domain ดังนี้

*.example.com.    IN      A       192.168.1.1

ผม ยกตัวอย่าง domain ที่ชื่อ example.com นะครับ เมื่อกำหนด wildcard ให้กับ DNS แล้วนั่นหมายความว่า subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะถูกกำหนดเป็น IP 192.168.1.1 ทั้งหมด มาตั้งค่า VirtualHost ให้กับ Apache กันต่อครับ ในไฟล์ VirtualHost ให้เพิ่ม ServerAliase เป็น *.example ดังตัวอย่าง

<VirtualHost *>
ServerName  www.example.com
ServerAlias *.example.com

DirectoryIndex index.html
DocumentRoot /home/www/www.example.com/htdocs

....
</VirtualHost>

จาก ตัวอย่างข้างต้น subdomain ใดๆ ที่อยู่ภายใต้โดเมน example จะมี DocumentRoot อยู่ที่ /home/www/www.example.com/htdocs ตัวอย่างเช่น หากเราเปิด xxx.example.com ก้อจะเปิดไฟล์ index ที่อยู่ในไดเรคทอรี /home/www/www.example.com/htdocs หากต้องการแยก subdomain อยู่คนละ directory สามารถกำหนดเพิ่มได้ในส่วน VirtualHost เรื่อยๆ หากต้องการตั้งค่า VirtualHost เพียงครั้งเดียวเราสามารถใช้ mod_rewrite เพื่อสร้าง redirect ไปยังไดเรคทอรีใดๆ ที่อยู่ใน DocumentRoot ได้ ตัวอย่างเช่น

webmail.example.com??? ชี้ไปที่ http://www.example.com/webmail
scm.example.com??? ชี้ไปที่ http://www.example.com/scm
dm.example.com??? ชี้ไปที่ http://www.example.com/dm
download.example.com??? ชี้ไปที่ http://www.example.com/download

การตั้งค่า ใน VirtualHost เพื่อ redirect ในแต่ละ request ให้เพิ่มข้อมูลดังนี้

RewriteEngine on
RewriteCond %{http_host} .
RewriteCond %{http_host} !^www.example.com [NC]
RewriteCond %{http_host} ^([^.]+)\.example.com [NC]
RewriteRule ^(.*) http://www.example.com/%1/ [R=301,L,QSA]

ใน กรณีที่เราเรียกใช้ subdomain ที่ไม่มีไดเรคทอรีรองรับ เช่น dummy.example.com จะต้องมีไดเรคทอรี dummy อยู่ที่ DocumentRoot หากไม่มีจะพบข้อความ Error 404 ซึ่งเป็นค่า default หากต้องการกำหนด Error Page เฉพาะในแต่ละ VirtualHost สามารถเพิ่มไฟล์แสดงผล Error ในแบบต่างๆ ของเราลงไปได้

Alias /error/ "/home/www/www.example.com/htdocs"
ErrorDocument 400 /error/invalidSyntax.html
ErrorDocument 401 /error/authorizationRequired.html
ErrorDocument 403 /error/forbidden.html
ErrorDocument 404 /error/fileNotFound.html
ErrorDocument 405 /error/methodNotAllowed.html
ErrorDocument 500 /error/internalServerError.html
ErrorDocument 503 /error/overloaded.html

เท่านี้คุณก็สามารถตั้งค่า DNS แบบ Wildcard เพื่อเชื่อมต่อกับ Apache VirtualHost ได้แล้ว ลองนำไปประยุกต์ใช้ดูนะครับ

ตั้งค่า Record แบบ Wildcard ให้ DNS

ผมมีปัญหาเกี่ยวกับ DNS บ่อยมากแล้วคนที่ดูแลเกี่ยวกับ DNS ก้อไม่ใช่ผมซะด้วย จริงๆ เรื่องของเรื่องคือไม่ค่อยได้วางแผนเรื่อง DNS สักเท่าไร วันดีคืนดีก้อคิดจะตั้ง sub domain ใหม่ขึ้นมา ไม่ตั้งค่า Virtual Host บน Apache ไม่เท่าไรครับ เพราะตัวเว็บเซิร์ฟเวอร์เราแก้ไขเองได้ แต่ DNS Server นี่สิมันอยู่คนละเครื่อง กว่าจะรอ Admin มาช่วยจัดการก้อช้าไปซะแล้ว จะแก้ปัญหายังไงดี วิธีง่ายๆ เราสามารถใช้ Wildcard สำหรับ domain record ได้ครับ มาดูตัวอย่างกัน

สมมุติว่าผมมี domain ชื่อ sexy.com แต่ sub domain ของผมไม่ค่อยคงที่สักเท่าไร วันดีคือดีก้ออยากจะมี subdomain เช่น gumara.sexy.com, bigtux.sexy.com เป็นต้น แต่ไม่อยากไปยุ่งกับ DNS ให้มันยุ่งยากมากนัก ไปตั้งค่าเพียง Virtual Host ของ Apache อย่างเดียวก้อพอ เราก้อใส่ Wildcard เข้าไปข้าหน้าแบบนี้เลยครับ *.sexy.com เอ้าไม่ได้ล้อเล่นนะครับ

sexy.com.       A           10.11.12.1
*.sexy.com.     CNAME       sexy.com.

ทีนี้จะให้ใคร dot อะไร sexy.com ก้อได้แล้วครับ :)