隨便聊聊
咱們知道,網絡上傳輸的數據包是一層一層的包起來的,典型的是mac地址層,ip層,tcp/udp層,應用層數據 這麼幾個層,那用戶在瀏覽器中打開www.baidu.com數據包如何傳到baidu的後端服務器呢?咱們這個數據包沒有ip層的目標ip啊,http請求怎麼知道往哪裏發?這個時候,dns系統就介入了,dns系統首先會把這個www.baidu.com的ip地址給找出來! dns系統主要是依靠權威dns,和遞歸dns來工做的,那權威dns和遞歸dns都是幹嗎的呢?windows
權威dns(Authority dns)
首先咱們來聊一聊權威dns。 權威dns作的事情主要是管理某個或多個特定域的dns服務。通常大一點的公司,都有本身的權威dns後端
好比全部」.alipay.com」結尾的域名都由alipay來管理全部」.alibaba.com」結尾的域名都由alibaba來管理(alipay和alibaba實際又是同一家公司來管理)全部「.baidu.com」結尾的域名都由baidu來管理alibaba和baidu各管各的,沒有交互。<>那整個域名系統,如何跑起來的呢,否則你說你管理alibaba.com的全部域名,我說我也管理alibaba.com的全部域名,不就亂套了麼。瀏覽器
光說是沒有用的,必需要到相關注冊局機構去註冊。緩存
- 最上面是根域。
- 一級域要去根上註冊,像com域,net域就屬於一級域
- Com域(也就是全部以「.com」結尾的老祖com域)要去根上註冊com域的域名服務器(nameserver)列表。
- Net域(也就是全部以」.net」結尾的老祖net域)要去根上註冊net域的域名服務器(nameserver)列表。
- 二級域通常要到一級域上去註冊
- alibaba.com要到com域去註冊本身的域名服務器nameserver列表
- baidu.com也要到com域去註冊本身的域名服務器nameserver列表
那你說a.b.c這個域名的一級域是誰,固然是「c」了,可是c域就沒有在根上面去註冊,因此這個域名是個無效的域名。 這樣的一些實際管理域名系統的dns都是權威dns就這樣一級一級的註冊。服務器
整個域名系統就連起來了,就變成了這麼個東西網絡
因此dns叫作分佈式的域名系統,分佈在世界上面的各個管理域名的公司或機構,有些狀況用戶只想簡單的把本身的ip轉化爲某個域名,而不想管理整個域,那這個時候他就能夠去買域名,有些公司是專門賣域名的。好比alibaba.com徹底能夠賣任何以「.alibaba.com」結尾的域名,只是alibaba.com不會這麼幹,這樣作一些釣魚網站來掛本身的網站,也以alibaba.com結尾的話,用戶不就很容易被釣魚了麼,好比我支付寶付款的時候我只看跳轉後的域名是不是以alipay.com結尾的,若是不是我就不敢付款)負載均衡
遞歸DNS(Recursion DNS)
那用戶訪問www.alibaba.com,請求又是如何到alibaba的權威dns服務器上面找到www.alibaba.com的ip呢?tcp
這個時候遞歸dns(咱們通常叫作local dns)就介入了。分佈式
用戶首先要直接配置本身的dns服務器,通常你撥號上網,或者在公司裏面上網,咱們windows系統都已經預想配置好了遞歸dns服務器的ip地址,固然本身也能夠修改網站
RHEL Linux系統是/etc/resolv.conf配置文件來配置。
一個用戶訪問www.alibaba.com的過程以下(可放大圖片觀察)
其中有幾點補充
- 遞歸dns也就是咱們常說的緩存dns,local dns,公共dns(提供專門遞歸服務的dns),這樣一步步的從根「.」到"com",再到「alibaba.com」,最後到「www.alibaba.com」的過程叫作遞歸過程
- Dns請求通常是udp報文(也能夠是tcp的報文),因此一樣也是要有源ip,目標ip,等等這些網絡數據包的底層信息,遞歸過程的每一步,目標ip都必須是很明確的
- 各個域的namserver其實是有多臺的,好比根的namserver的ip有13個,com的namserver的ip也有13個,遞歸dns在進行遞歸時須要選擇其中一個ip做爲目標ip進行下一步請求便可(目前主流dns實現軟件,如bind會選擇延時最小的那個ip做爲下一步請求的目標ip)
- 你們不用擔憂根域,或者com域就那麼幾個ip,能不能接受的了全球的dns請求能不能抗的住的問題。這只是個目標ip,基於ip的負載均衡技術多的很,dns中用的多的是anycast技術,一個ip實際上對了不少個物理服務器,到各個權威nameserver上,也有lvs,ospf等等一些負載均衡技術把同一個ip對應到多個物理服務器上面。
- 遞歸dns還會把圖中遞歸第一步,第二步,第三步向各級權威dns發起的請求結果給緩存到本身的內存中,直到這條結果的ttl超期失效(超期時間通常爲幾分鐘到幾小時幾天等等),在這個ttl超期以前,任何其餘用戶發起的www.alibaba.com的dns請求,遞歸dns都會直接從本身的內存中把緩存結果直接返回給客戶端(不會去遞歸了)。若是ttl超期了,纔會去從新遞歸。
- 有的dns既是權威dns,又是遞歸dns,這並不衝突,這種dns在遇到域名是本身管理的域的後綴結尾時,會直接進行應答(不管是否存在結果),若是不是本身管理的域的後綴域名,則進行遞歸,一樣吧遞歸結果進行緩存。
聊聊dns攻擊
咱們順便聊聊dns攻擊問題,典型的有拒絕服務攻擊,dns劫持等。
- 拒絕服務攻擊這種是對各類應用(不止是dns應用)都很常見的攻擊,你們也都知道,咱們構造數據包直接調用驅動,或者使用現成的pktgen改吧改吧,或者用dpdk,或者乾脆多一點肉機,隨意僞造源ip,dns請求(或者什麼http請求,arp請求等等),一秒鐘打出幾百萬或者幾千萬個包打出很大流量的請求來,不是什麼難的事情(不是全部公司的系統都有很強的防攻擊措施),而帶寬就這麼大,硬件的能力也好操做系統的能力也好就這麼大,正常的客戶請求就進不來而沒法服務了,從而達到了攻擊。
- Dns劫持攻擊也有,僞造dns響應是很簡單的,或者直接在上級dns上面配置泛域名,可是容易被發現,可是即便容易被發現,一旦進行了劫持,後果也是不堪設想的,好比前段時間根被劫持了,咱們從上圖的遞歸dns向各級權威dns詢問www.alibaba.com的ip是多少,根的nameserver或者com的nameserver原本是不該該直接告訴遞歸dns www.alibaba.com的ip究竟是多少的,必需要到alibaba.com的權威dns才能獲得最終結果,但是根卻在第一步遞歸過程當中,就告訴遞歸dns我知道www.alibaba.com的ip(當時好像是任何域名請求到根的namserver,根的namserver都直接給返回了同一個錯誤的ip),是y.y.y.y(一個錯誤的ip)了,這樣最後產生http請求的時候,目標ip就徹底不對了,而因爲各個遞歸dns ttl超期以後都會先從根遞歸,這樣全部域名就都被劫持了,整個互聯網也就崩潰了。
- 另外泛域名這種,舉個簡單的例子,若是我是根的namserver,我配置一個泛域名 ,讓其ip爲1.1.1.1,那麼全部到根進行查詢的任何域名查詢,都會獲得直接響應說ip是1.1.1.1,那打開任何網頁,數據包的目標ip就都是1.1.1.1了,不堪設想。小點來講若是我是com的namserver,配置一個泛域名,.com,那全部以」.com」結尾的域名也都不堪設想了,根本走不到各個公司去作dns查詢這一步。
若有錯誤,歡迎指正。