2011年12月20日 星期二

如何避免假造DNS回應? 我在神聖的祖國也想上Facebook~

我人在深圳~
如同以往幾次的出差
都需要透過SSH tunnel連回我的主機
以避免偉大的防火牆擋掉我想看的網頁

幾個我的朋友與同事反應
透過SSH tunnel可以用
但是facebook不能上?!

前兩次去廈門跟煙台已經有初步的經驗
DNS會被加料
因此改用台灣的DNS Server或是Google提供的DNS即可
但遠端教我朋友設定後依然不行?!

這次出差發現的確有這樣的狀況
根據nslooup查詢DNS
www.facebook.com回傳的結果都有回傳
但是跟我在台灣查詢的IP不一致?!

查了一下
據說目前的作法是
當碰到DNS查詢關鍵字網址時
謎樣的伺服器會直接回傳錯誤的IP

透過Wireshark分析封包證實了這樣的結果
我向Hinet的DNS送出查詢
收到三個DNS的回應
第三個回應 IP 69.63.181.16經過反查後確認是facebook的dns server
但前面兩個IP的反查卻查不出來

因為冒出了前面兩個回應
Windows會採用第一個結果
拋棄後面收到的回應
導致要連上facebook.com
永遠都是使用錯誤的IP

這兩個回應哪裡來的並不清楚
在神聖祖國 什麼鬼事都有可能發生


處理的方法有幾種
  1. 延後DNS查詢的時間,強迫OS取後面的結果。
  2. 我沒看到具體作法怎麼做,而且這樣做感覺不是最佳解決方案?
  3. 直接寫入hosts,避免DNS查詢被污染
  4. 缺點是,你必須要手動把dns紀錄加到hosts裡面,不夠彈性
  5. 透過SSH tunnel local bind的方式,將DNS查詢透過SSH tunnel經過跳板送出去。
  6. 實作的方式為SSH -N -L 53:168.95.1.1:53 username@hostname bind port 53是因為,Windows只支援DNS預設Port 53 實際測試的結果,nslookup均沒有回應...不知道為啥咧= =
    之前有時間的時候,找了資料實際測試一下,基本上SSH Tunnel開啟的Socks proxy是TCP proxy,不吃UDP封包,因此走UDP的DNS查詢不能直接經由Socks proxy轉送 需透過netcat或sopcat實現udp-tcp的fowarder,實際測試後的確是可以使用的,但實在是有點麻煩阿Orz 建議還是直接使用下面提到的方法,Socks proxy的remote dns lookup,要來的方便快速阿XDDDD
  7. 透過Socks proxy的remote dns lookup功能,將DNS查詢交由socks proxy處理
  8. 這個需要Socks5 proxy才有支援,幸好,SSH tunnel開啟的socks proxy本身就有支援 接著是client端的設定 IE...不支援 Chrome,根據找到的資料,Chrome必須要安裝addon - Proxy switchy, 在設定Socks Proxy時設定為Socks V5 但我設定之後測試的結果是... 沒用= = Firefox,Firefox本身在設定中已經包含了Socks proxy remote dns lookup的設定,預設是Disable的 將這個設定打開之後,還是沒用= = 根據找到的資料,安裝Addon - FoxyProxy 設定Proxy時,將Socks proxy指定為Socks V5即可 測試結果...正常了~:D

以上,給有需要的人做個參考:D

沒有留言:

張貼留言

Fix msmtp does not work in old ubuntu/debian version

主要是舊版msmtp沒有處理好email header 現在的smtp伺服器會檢查mail header 寄件人跟帳號不一致不給寄 收件人不是合法mail address自然不能寄 #!/bin/bash # Workaround until mtmsp >= 1.8....