鐵人賽-30天不中斷!!其實真的很不容易啊~~~
因此,插曲就出現了!!
在開始在參加鐵人賽時,其實有小小的擬好這30天中分享哪些主題!!不過,今天實在太忙碌了,忙到現在都沒時間寫分享的文章!!所以呢,只好把今天遇到的一些問題當作技術文分享給大家囉!!希望大家不要丟雞蛋阿~~~
網路其實是一個很複雜的技術,有太多東西要學了!!
今天在安裝 Ubuntu 12.04 時就遇到一個很神奇的問題-DNS的問題!
之前寫的小工具是會自己去問電腦目前的 DNS Server 為何,然後在當作自己的DNS來用!因為我在背後有架設NAT。但是,之前都是在Ubuntu 11.10下開發使用。今天突然要用到這個工具了,於是(學技術的總是喜歡嘗試新鮮貨啦!)不管當初是用Ubuntu 11.10開發,就直接拿Ubuntu12.04來用。我卻不知道,我的工作已經在不知不覺中慢慢地產生了變化,就讓我們繼續看下去。
當我下達指令
#nslookup 127.0.0.1
他應該要回我
Server: DNSServerName
Address: xx.xx.xx.xx#53
1.0.0.127.in-addr.arpa name = localhost.
這時候我就可以拿 #53 前面那個IP來當作我NAT的DNS。可是,這次我換了 Ubuntu 12.04 之後,那個DNS IP卻一直都是 127.0.0.1。也因此我在NAT下的機器都出不去了,只要遇到 domain name 的位址,都會卡住。
好吧,既然你這樣對我,我當然也不是省油的燈阿~我可以改我的程式來對付你!於是,我在 getInternalNDS() 這個 method 中就加了一個 Error Handling。凡是只要看到 127.0.0.1 的答案就格殺無論!!不是啦,我是說只要是遇到127.0.0.1就先log一個warning起來,然後先暫時用HiNet的DNS 168.95.1.1來用吧!!
問題解決了嗎?當然還沒阿。身為負有研究精神的阿宅,當然不能就此放棄。(人生又起變化了)
就在多方的調查之下,因為當初我有用DNAT來達到DNS專送的功能,我又發現一隻蟲了(心理OS:為什麼之前用都沒問題呢,是因為他是瞌睡蟲都不發作嗎XD)
我當初的規則是這樣寫的
iptables –A POSTROUTING –t nat –p udp –dport 53 –d 192.168.0.254 –j DNAT --to DNS_IP
發現了嗎?上面那條rule說明了,只要是UDP, port:53並且送到192.168.0.254通通把他轉送到 NDS_IP去。那如果是DNS回的資料呢?他也是UDP, port:53並且送還給192.168.0.254!! 蝦咪~這麼嚴重喔!!可是為什麼之前都沒問題呢?世界真奇妙啊!!最後我就將它改成
iptables -A POSTROUTING -t nat -p udp -dport 53 -s 192.168.0.0/24 -d 192.168.0.254 –j DNAT --to DNS_IP
告訴它,只有192.168.0.0/24這個家族才需要你幫忙轉送啦!! DNS 回你的記得要還來!!
就在這個時候我終於發現為什麼我Ubuntu 12.04的DNS會是127.0.0.1了!!原來是一個叫做 dnsmasq 在搞鬼!!其實也不能怪他啦,dnsmasq主要的目的也是在幫NAT跳躍防火牆,讓他能正常運作!只是,目前我用不到。因為我已經有我自己的解決方式了。所以,我就參考了GOOGLE大神,先把它給disable之後,一切似乎恢復了正常,回到原本應該有的狀況了!!
關掉它的方式很簡單:
1.使用你最常用的編輯器將 /etc/NetworkManager/NetworkManager.conf 打該
2.將 dns=dnsmasq 這行前面加個#字號,把它註解起來
3.輸入sudo restart network-manager 重新啟動。
4.大功告成!!!
後記:
雖然這篇無關軟體開發,不過也是個難得的經驗!!對吧~~
不是/etc/resolv.conf改一下就好了嗎?
是可以這樣做沒錯!
但是如果你是使用DHCP,通常在 /etc/resolv.conf 裡面都會有文字說明指出
強烈建議不要手動去更改它,因為 resolv.conf 是由系統自動產的。
加上這個問題(DNS變成127.0.0.1)是由 dnsmasq 引起的,因此對症下藥會比較好喔!
題外話:
其實 dnsmasq 其實也是用來解決,NAT的DNS問題,只不過在我的專案上面之前已經用了其他方式解決了。如果要改成這個方式要花更多的時間。所以我才直接把他這個功能關掉,用我原先的方式解決。