Saturday, September 4, 2021

Let's set up your own public authoritative-only dns

             ဒီ article လေးကတော့ ကိုယ့်ဆီမှာ VPS Web Server တစ်ခု ရှိမယ် hosting site က ပေးတဲ့ Managed 

DNS နဲ့  public မထွက်ချင်ဘူး ကိုယ့်ဘာသာကို DNS server setup လုပ်ပြီး Authoritative DNS တစ်ခုလုပ်ကြည့်

မယ် ဆိုတဲ့ စိတ်ကူးရတုန်း စမ်းဖြစ်သွားတဲ့ article လေးဖြစ်ပါတယ်။ 


Before that, What is so called Authoritative-Only DNS?

                 ဒီ article ရဲ့ အဓိက setup ဖြစ်တဲ့ authoritative-only dns ကတော့ သူ manage လုပ်နေတဲ့ dns 

records တွေကိုသာ request လုပ်လာရင် အကြောင်းပြန်ပေးပြီး သူမသိတဲ့ သူဆီမှာမရှိတဲ့ records တွေ 

ရောက်လာရင် refused လုပ်ပြီး တစ်ခြား DNS servers တွေဆီကို forward လုပ်ပေးမှာမဟုတ်သလို မဆိုင်တဲ့ 

dns queries တွေအတွက်လဲ cache သိမ်းထားပေးမှာမဟုတ်ပါဘူး။

               အဲ့တော့  dns queries request တွေကို အကုန်လိုက်ကြည့်ပေးနေစရာမလိုပဲ ကိုယ်နဲ့ ပတ်သတ်တဲ့ 

request တွေကိုပဲ take care လုပ်စရာလိုတဲ့အတွက်  performance အတွက်လဲ ကောင်းတယ် overhead လဲမဖြစ်

တော့ဘူးပေါ့။  နောက်ထပ် DNS မှာ Forwarding DNS and Caching-only DNS ဆိုပြီး တော့လဲ ရှိပါတယ်။ 

Caching-only DNS

               Caching-only DNS ကတော့ သူ့ဆီမှာ တစ်ကယ့် DNS server လို record zones တွေမထားထားဘူး။ 

သူ့ဆီကို ရောက်လာတဲ့ dns queries တွေကို သူကိုယ်တိုင် တစ်ခြား သက်ဆိုင်တဲ့ DNS servers တွေဆီမှာ လိုက်ရှာ

ပေးပြီးတော့ ရပြီဆိုရင် user ကို response ပြန်ပေးပါတယ်။ လိုက်ရှာလို့ ရလာတဲ့ DNS queries တွေကိုလဲ သူဆိီ

မှာ အချိန်တစ်ခု ထိသိမ်းထားပေးပြီး same queries request တွေ ရောက်လာရင် သူ့ဆီကနေပဲ response ပြန််ပေး

ပြီး DNS query time ကို ပိုပြီးတော့  မြန်စေပါတယ်။

Forwarding DNS

           Forwarding DNS ကကျတော့ သူ့ဆီကို DNS query request တစ်ခုရောက်လာတယ် ဆိုပါတော့ ဒီ query 

request က သူ ဆီမှာ cache ရှိနေရင် အကြောင်းပြန်ပေးလိုက်တယ် မရှိဘူးဆိုရင် query request ကို တစ်ခြား 

DNS server ဆီ ပို့ပေးလိုက်တာဖြစ်ပါတယ်။ DNS query request ကို သူကို တိုင် Cache-Only DNS လိုမျိုး လိုက်

ရှာမနေပဲ တစ်ခြား DNS server ကပြန်လာတဲ့ response ကိုသာ cache လုပ်သိမ်းထားပေးပြီးတော့ နောက်တစ်ခါ 

same request ရောက်လာမှသာ forward မလုပ်တော့ပဲ response ပြန်ပေးတဲ့ ပုံစံမျိုး ဖြစ်ပါတယ်။

So, what's the deal? 

            ဒီ article ကို စမ်းဖို့အတွက် domain တစ်ခု (i.e rootofinfo.com) , VPS for DNS servers, web server 

and public ip addresses တွေရှိရပါမယ်။ ကျွန်တော်ကတော့ domain အတွက် godaddy နဲ့ VPS and public 

ipaddress အတွက် Digital Ocean platform ကနေ အသုံးပြုထားပါတယ်။ ကြိုက်နှစ်သက်ရာ platform ကို 

အသုံးပြုလို့ရပါတယ်။

Let's get started

  1. Domain name = rootofinfo.online
  2. Master DNS = ns1.rootofinfo.online
  3. Slave DNS = ns2.rootofinfo.online
  4. Web Server = web01.rootofinfo.online
  5. IP Address = 3 x Public IP Addresses


First thing first

         Domain ကိုတော့ ၀ယ်ထားပြီးပြီလို့ပဲ သဘောထားလိုက်မယ် ပထဆုံးအနေနဲ့က DNS server တွေ set 

up လုပ်ရအောင်။ အရင်ဆုံး DNS မှာ Master/Slave setup လုပ်မယ် Master/Slave ပုံစံကတော့ zones တွေ မှန်

သမျှကို Master ကနေပဲ အဓိက အလုပ်လုပ်မှာပါ  Slave ဖက်က master မှာ တည်ဆောက်ထားတဲ့ zones တွေကို 

maintain လုပ်ပြီး DNS query တွေလာတဲ့အခါ  Master DNS ကို ကူညီပြီး response ပြန်ပေးမှာဖြစ်ပါတယ်။

Let's setup Master DNS first

        အရင်ဆုံး CentOS7 မှာ DNS server အတွက် "bind" packages ကို  install လုပ်ပါတယ်။ 



Configure /etc/named.conf file


        Packages တွေ သွင်းပြီးရင်တော့ dns setup စလို့ရပါပြီ အရင်ဆုံး /etc/named.conf အောက်မှာ 

authoritative mode အတွက် လိုအပ်တာတွေ ပြင်ဆင်ပါမယ်။ အောက်ပုံမှာဆိုရင် 

1. "listen-on port 53" for ipv4 and ipv6 မှာ "any" ဆိုပြီးထည့်ထားလဲ ရတယ် ဒါမှမဟုတ် OS ရဲ့ ip ကိုလဲ 

specific သတ်မှတ်နိုင်ပါတယ်။ Any ကတော OS မှာရှိတဲ့ any network interface ကို ဆိုလိုပါတယ်။

2. Allow-transfer = "none" ဆိုတာက မဆိုင်တဲ့ DNS queries တွေအတွက် ထပ်ပြီး တစ်ခြား DNS တွေဆီကို 

transfer မလုပ်ဘူးလို့ သတ်မှတ်တာဖြစ်ပါတယ်။ Allow-transfer အတွက် သီးသန့် Slave server ကို zone file 

create လုပ်တဲ့အခါ ကြေညာမှာဖြစ်ပါတယ်။

3. Recursion = "no" ကတော့ authoritative dns server ဖြစ်တဲ့အတွက် တစ်ခြား  authoritative dns servers တွေ

နဲ့ အဆက်အသွယ် မလုပ်ဘူးလို့ သတ်မှတ်တာဖြစ်ပါတယ်။ မိမိနဲ့သတ်ဆိုင်တဲ့ dns records တွေကိုသာ ထိန်းသိမ်း

ပေးထားမှာဖြစ်ပါတယ်။




Defining a zone in /etc/named.rfc


                Authoritative DNS အတွက် initial config တွေ ပြီးရင် domain အတွက် zone စတင်သတ်မှတ်မှာဖြစ်

ပါတယ်။ Zone တစ်ခု သတ်မှတ်ဖို့အတွက် /etc/named.rfc1912.zones မှာ သတ်မှတ်ပေးပါမယ်။ အောက်ပုံမှာဆို

ရင် domain name ဖြစ်တဲ့ "rootofinfo.online" အတွက် zone တစ်ခု တည်ဆောက်ထားပြီး Type က "master" 

လက်ရှိ ns1 ကို Master DNS အနေနဲ့ သတ်မှတ်တာ ဖြစ်ပြီး file ကတော့ forward lookup zone file ထားမယ့် 

နေရာကို  ဖော်ပြထားတာဖြစ်တယ် နောက် "Allow transfer" မှာတော့ Slave DNS server ရဲ့ ip ကို  ဖော်ပြပေး

ထားတာဖြစ်ပါတယ်။

                အခု ဒီ lab setup မှာ ကျွန်တော် reverse zone ကို မထည့်တော့ဘူး ဘာဖြစ်လို့လဲ ဆိုတော့ reverse zone

တွေကို cloud providers တွေက handle လုပ်တဲ့ အတွက် forward zone နဲ့ ပဲ set up လုပ်သွားမှာဖြစ်ပါတယ်။





Next step is "creating a forward lookup zone"


                အိုကေ domain အတွက် zone file တစ်ခု create လုပ်ပြီးပြီဆိုရင် အဲ့ domain အတွက် forward lookup

 zone တစ်ခု စတင် create လုပ်ပေးရပါတော့မယ်။ Location ကတော့ /var/named/ အောက်မှာ create လုပ်ရမှာ

ဖြစ်ပါတယ်။ 
                အောက်ပုံမှာဆိုရင် ပထမဆုံး သတိထားရမယ့်အချက်က name record တွေရဲ့ အနောက်မှာ dot "." 

တွေ ထည့်ရမှာဖြစ်ပါတယ်။ Bind DNS ရဲ့ အလုပ်လုပ်ပုံကြောင့် နောက်မှာ dot "." တွေ ပါရမှာဖြစ်ပါတယ်။ 

နောက်တစ်ခုအနေနဲ့က SOA (State of Authority) မှာ Master DNS name နဲ့ domain ရဲ့ email အတွက် name 

ကို ထည့်သွင်းရမှာပါ။ 


                   နောက်တစ်ချက် အနေနဲ့ သတိထားရမှာကတော့ ဒီ forward lookup zone file ကို edit တစ်ခါ ၀င် 

ပြင်တိုင်း "Serial value" ကို zone update to date ဖြစ်ဖို့ရန် အတွက် increment တိုးပေးရမှာဖြစ်ပါတယ်။ ပြီးရင် 

"rndc reload rootofinfo.online" rndc command ကို အသုံးပြုပြီး zone update လုပ်ပေးရမှာပါ။  ကျန်တာတွေ ဖြစ်တဲ့ refresh, expire, etc 

စသည်တို့ကိုတော့  အထူးတလည် မပြောတော့ဘူး detail ကိုတော့ internet မှာ ပိုပြီး ပြည့်ပြည့်စုံစုံ ဖတ်နိုင်ပါ 

တယ်။   
                အဓိက အားဖြင့် nameserver  ဖြစ်တဲ့ ns1 နဲ့   ns2 အတွက် "NS Record" ဆောက်မယ် 

နောက် Host A record တွေ ဆောက်မယ် နောက်ပြီး web server  အတွက် Host A record တွေ တည်ဆောက်ထား

တာ ဖြစ်ပါ

တယ်။ "WWW" ကို CNAME အနေနဲ့ လဲ သတ်မှတ်  နိုင်သလို Host A record အနေနဲ့ လဲ သတ်မှတ်နိုင်တယ်။CNAME 

ဆိုတာ က Host A record ကို alias လုပ်ထားတဲ့ အတွက် dns query လုပ်တဲ့ အခါမှာ ကြန့်ကြာ နိုင်တယ် ဒါကြောင့် 

"WWW" အတွက် Host A တိုက်ရိုက် လုပ်ပေး တာ recommend ပေးကြပါတယ်။


                    အခု forward lookup zone file မှာ သုံးထားတဲ့ IP တွေ က Digital Ocean terms အရ "Floating 

IP" တွေ ဖြစ်ပြီး VPS တွေမှာ map လုပ်ပေးထားတာဖြစ်ပါတယ်။ Digital Ocean အဆိုအရ "Floating IP" တွေ

သာ public accessible တွေ ဖြစ်ပြီး ssh ၀င်တဲ့ public ip ကို public accessible အတွက် အသုံးပြုလို့မရဘူးဖြစ်ပါ

တယ်။ ကျွန်တော် လဲ အစက သတိမထားလို့ ssh ip တွေသုံးပြီး DNSက public မထွက်ဘူး ဖြစ်နေသေးတယ်။ 

Change Group ownership


                အခုတည်ဆောက်လိုက်တဲ့ zone files တွေ ရယ် config file တွေကို  permission စစ်ကြည့်ပြီး 

အကယ်၍ group ownership က "named" group assign မလုပ်ထားဘူးဆိုရင် "chgrp" command ကို အသုံးပြု

ပြီး group ownership ပြောင်းပေးရမှာဖြစ်ပါတယ်။  ပြီးရင်တော့ "systemctl enable --now named" command 

ဖြင့် dns service ကို master မှာ start လုပ် လို့ ရပါပြီ။




Let's move on to Slave DNS Server


                Slave server ဖက်ခြမ်း မှာ dns အတွက် လိုအပ်တဲ့ bind packages တွေ သွင်းမယ် ပြီးရင်တော့ 

/etc/named.conf မှာ Master မှာ setting ချခဲ့ တဲ့ အတိုင်းပဲ သတ်မှတ်မယ်။ ပြီးရင် /etc/named.rfc1912.zones 

file မှာ domain အတွက် record zone တစ်ခု ထည့်ပေးရမယ် ထည့်ပေးတဲ့အခါမှာ "Type" နေရာမှာ "slave", 

masters နေရာမှာ "master dns ip address" ကို ထည့်ပေးရမယ်။ ပြီးရင်တော့ "systemctl enable --now named" ဖြင့် bind service ကို start လုပ်မယ်။ 




It's time for Web Server


            Master/Slave DNS တည်ဆောက်လို့ ပြီးရင် ဒီ dns service ကို အသုံးပြု မယ့် web server တစ်ခု 

တည်ဆောက်လိုက်မယ်။ web server အတွက် လိုအပ်တဲ့ packages, services start, /var/www/html အောက်မှာ 

index file တစ်ခု ဆောက်ထားလိုက်ရင် ရပါပြီ။




What's the next steps?


              Next steps ကတော့ configuration တွေမဟုတ်တော့ဘူး အဓိက domain ၀ယ်တဲ့ godaddy မှာ ပြင်ရ  မ

ယ့် အချက် တစ်ချို့ ရယ် နောက် Digital Ocean ဖက်မှာ "Floating IP" mapping တွဲ တဲ့ ပုံစံရယ် နောက် Firewall 

မှာ လိုအပ်တဲ့ ports တွေ ဖွင့် ပေးဖို့ ရယ် ပဲ ကျန်တော့မယ်။ 

Take a look at Godaddy, What's a Glue Record?


               ပုံမှန်ဆိုရင် Domain register တစ်ခု ဖြစ်တဲ့ godaddy တို့လိုမျိုး providers တွေဆီမှာ domain တစ်ခု 

၀ယ်လိုက်ရင် အဲ့ domain ကို manage လုပ်ဖို့ တစ်ပါတည်း DNS features ပါလာပြီးသားဖြစ်ပါတယ်။ အခုလိုမျိုး 

own public dns server တစ်ခု ဆောက်စရာ မလိုတော့ဘူး ပေါ့။ အခု setup မှာက godaddy က ပေးထားတဲ့ 

DNS ip ကို ကို မသုံးဘူး ဖြစ်တဲ့ အတွက် ဒီ ၀ယ်ထားတဲ့ domain ကို သွားချင်ရင် ကျွန်တော့်တို့ ရဲ့ nameservers 

ip address ကို ညွှန်ပေးရမှာ ဖြစ်ပါတယ်။ အဲ့လိုမျိုး ညွှန် ပေးတာကို "Glue Record" သတ်မှတ်တယ်လို့ ခေါ်ပါ

တယ်။  အောက်မှာ ပြထားတဲ့ ပုံလေး အတိုင်း nameservers ကို ကျွန်တော်တို့ ရဲ့ ns1 and n2 ကို point လုပ်မယ် 

hostname ဆိုတဲ့ နေရာမှာ ns1 and ns2 ရဲ့ public ip ကို ထည့်သွင်း ပေးရမှာဖြစ်ပါတယ်။ အခု လိုမျိုး ပြောင်း

လိုက်တဲ့ အခါမှာ godaddy ကနေ "We can't display your DNS information...." ဆိုပြီး DNS ကို သူတို့ဆီ က ယူ

သုံးထားတာ မဟုတ်တော့ တဲ့ အကြောင်း ကို ပြောထားတာ တွေ့ရမှာ ဖြစ်ပါတယ်။


                                              









Let's go to Digital Ocean


                Digital Ocean မှာတော့ အရင်ဆုံး Floating IP ဘယ်လို သတ်မှတ် မလဲ ဆိုတာ ပြောသွားမယ် အပေါ်

မှာ သုံးခဲ့တဲ့ public ip address တွေ သည် floating ip တွေ ဖြစ်ပါတယ်။ ဆိုတော့ အရင်ဆုံး VPS ဆောက်ပြီးတဲ့

အခါမှာ floating ip ကို map အရင် လုပ်ရမှာပါ။  Digtal Ocean account တစ်ခု ကို "Floating IP" ၃ ခုထိ ရပြီး 

ထပ်လိုချင်ရင်တော့ request လုပ်ရပါမယ်။ ပြီးရင်တော့ Firewall မှာ လိုအပ် တဲ့ dns, http, ssh ports တွေ ဖွင့် 

ထား ပေးရမှာ ဖြစ်ပါတယ်။ 








Testing DNS Query and Web Server



                လိုအပ်တာတွေ လုပ်ပြီး သွားပြီ ဆိုရင်တော့ testing စမ်း ကြည့် ရအောင်။ အပြင်က နေ nslookup 

command နဲ့ query ထောက်ကြည့်မယ်။ နောက် website အတွက် browser ကနေ ခေါ်ကြည့် မယ်။ 





            အခုဆိုရင် ကျွန်တော်တို့ရဲ့ ကိုယ်ပိုင် Authoritative DNS server က အလုပ်လုပ်နေ ပြီ ဖြစ်ပါတယ်။ 

webserver အပြင် နောက်ပိုင်း ကိုယ်ပိုင် email sever တွေ FTP server တွေပါ ကိုယ်ပိုင် DNS server နဲ့ ချိတ် ပြီး 

set up လုပ် နိုင် မှာ ဖြစ်ပါတယ်။


အိုကေ ဒါကတော့ Creating your own authoritative dns server ဖြစ်ပါတယ်.......

That's it 😊

Thank you!!!                
Share:

2 comments:

  1. Hello! Firstly I am really love your topic and I've been searching this kind of authoritative dns and map with public domain name to cloud for a long time. Thanks for sharing!!. In my lab envi, I tried with Azure and godaddy dns. In here, I faced some kind of DNS port issue in azure side although I opened inbound rule for DNS in azure Network Security Group. So I cannot resolve my domain from public :'(. Could you give me any kind of solution for this dns port issue in Azure.
    #calvin

    ReplyDelete
  2. Hello,

    Thanks for reaching out to my blog.
    Have you done checking on your dns server config, linux firewall, selinux status and godaddy redirection to your nameservers?
    When I was testing for this article, even though I did enable ports on firewall and dns services are ok, what I faced is public ip issue, i thought the public ip assigned to my servers was also usable as domain public ip but instead it was intended only for ssh. So, I had to use their so called "floating ip" service map to the servers then only my webpage is published. Even though, i haven't tested on azure yet, here is the youtube link that might be similar to your envi. Good luck on your testing.
    Thanks!!!

    https://www.youtube.com/watch?v=CzqquvXsFag

    ReplyDelete