自從使用了 GoogleDesktop 之後,它強大的搜尋信件文件能力,讓我減少了許多尋找資料的時間。尤其是在辦公室裡
最近公司同事想把一些文件整理以後放在一台公用電腦上面,然後利用 GoogleDesktop 讓大家可以利用關鍵字搜尋來尋找有用的資料。經過實驗之後,假設公用電腦的 IP 是 192.168.1.100,由於 GoogleDesktop 只會 Listen 127.0.0.1 這個 loopback 的 IP,因此其他同網段(192.168.1.*) 的電腦無法連結到 GoogleDesktop 的搜尋網址。
碰到這種問題,最直接的想法就是搞一個 proxy server,讓 proxy server listen 192.168.1.100:4664,然後將所有連往 192.168.1.100:4664 的 packet 全部 forward 到 127.0.0.1:4664,如此一來應該就可以連到 GoogleDesktop 的搜尋網址。不過很遺憾的,經過實驗結果,會出現下面情形..
我初步猜想是 Browser 送過來的 HTTP header 中,GoogleDesktop 只接受 Host: 127.0.0.1:4664。所以馬上用 telnet 動手實驗了一下
[root@broso shell]# telnet 192.168.1.12 4664 Trying 192.168.1.12… Connected to 192.168.1.12. Escape character is '^]'. GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1 Host: 192.168.1.12:4664 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive HTTP/1.1 200 OK <!– –><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 後面省略
|
把上行的 Host: 192.168.1.12:4664 改為 Host: 127.0.0.1:4664 之後,結果真的就成功了,GoogleDesktop 就會回覆正確的搜尋頁面了..
[root@broso shell]# telnet 192.168.1.12 4664 Trying 192.168.1.12… Connected to 192.168.1.12. Escape character is '^]'. GET /&s=Gcp35yLaRKNq-qK-MNo25UNQjO0 HTTP/1.1 Host: 127.0.0.1:4664 User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-TW; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12 Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: zh-tw,en-us;q=0.7,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: Big5,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Proxy-Connection: keep-alive HTTP/1.1 200 OK <!– –><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 後面省略
|
知道 GoogleDesktop 原理之後,馬上動手來改寫個小型 Proxy Server。先前為了能夠從公司內部自由穿梭到外部 internet 世界,曾經寫了一個小型 SSL 加密的 Proxy Server(這個以後有機會再來寫),因此我的想法很簡單,是只要將中間穿梭的封包加以處理一下,碰到 Host: 192.168.1.100:4664 的 HTTP header,就置換為 Host: 127.0.0.1:4664。理論上應該就沒問題才是。
改完之後,馬上試驗一下,果然頁面很成功出現了。
不過再試下去,又發現一些問題…
咦,怎麼網址又被改為 http://localhost 了,看起來除了上行的 HTTP Header 要置換之外,連下行的 HTTP Header 及 HTML content 都得做一下過濾跟置換。所以又修改了一下程式,碰到 http://localhost 或是 http://127.0.0.1 都置換為 http://192.168.1.100:4664 。修改完畢後,馬上又試驗了一下…
果然馬上就成功了。有興趣的人可以在這裡下載 GoogleDesktopProxy
簡單說明一下安裝方法:
- 將下載回來的 GoogleDesktopProxy.rar 解開放在同一個目錄下。
- 修改 start_proxy.cmd,將 "C:\Program Files\Java\jre1.6.0_03\bin\java" 改為你所使用的 JRE 或 JDK 路徑
- 修改 proxy.properties 中,我標為黃色字體的部分
參數 Host 指的是安裝 GoogleDesktop 那台電腦的 IP
參數 AllowList 指的是允許連接 GoogleDesktopProxy 的 IP 清單,所以沒列在裡面的 IP 都會被檔掉唷
參數 ReplaceLineFrom 跟 ReplaceLineTo 這兩個參數是成對的,GoogleDesktopProxy 會過濾所有經過的封包,是不是包含了 ReplaceLineFrom 所指定的字串,如果有,就置換為 ReplaceLineTo 所指定的字串。
所以 ReplaceLineFrom_1 請同樣修改為安裝 GoogleDesktop 那台電腦的 IP。ReplaceLineFrom_2 跟 ReplaceLineTo_3 亦同。
Host=192.168.1.12 Port=4664 TargetHost=127.0.0.1 TargetPort=4664 LeftSSL=0 RightSSL=0 AllowList=127.0.0.1,192.168.1.*,10.23.4.* SSLTimeOut=300 ReplaceLineFrom_1=Host: 192.168.1.12:4664 ReplaceLineFrom_2=http://127.0.0.1:4664 ReplaceLineFrom_3=http://localhost:4664 |
之後如果有機會的話,再來說明一下上述 SSL 相關參數的使用方法。
有興趣研究原始碼的人,可以留言跟我索取。