GoogleDesktopProxy

自從使用了 GoogleDesktop 之後,它強大的搜尋信件文件能力,讓我減少了許多尋找資料的時間。尤其是在辦公室裡,常常記得某個資料曾經看過,找了很久但就是找不到放在哪兒。這個時候,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
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>錄無效的要求</title>
<style>

後面省略

把上行的 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
Content-Type: text/html; charset=UTF-8
Pragma: no-cache
Expires: Fri, 01 Jan 1990 00:00:00 GMT
Cache-control: no-cache, no-store, must-revalidate
Connection: close

<!–
Content-type: fix-mhtml

–><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html><head><title>Google 桌面</title>

後面省略

知道 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

簡單說明一下安裝方法:

  1. 將下載回來的 GoogleDesktopProxy.rar 解開放在同一個目錄下。
  2. 修改 start_proxy.cmd,將 "C:\Program Files\Java\jre1.6.0_03\bin\java" 改為你所使用的 JRE 或 JDK 路徑
  3. 修改 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.*
LogDir=log

SSLTimeOut=300
SSLKeystore=KEYSTORE.jks
SSLKeystorePassword=broso.net
SSLTruststore=TRUSTSTORE.jks
SSLTruststorePassword=broso.net

ReplaceLineFrom_1=Host: 192.168.1.12:4664
ReplaceLineTo_1=Host: 127.0.0.1:4664

ReplaceLineFrom_2=http://127.0.0.1:4664
ReplaceLineTo_2=http://192.168.1.12:4664

ReplaceLineFrom_3=http://localhost:4664
ReplaceLineTo_3=http://192.168.1.12:4664

之後如果有機會的話,再來說明一下上述 SSL 相關參數的使用方法。

有興趣研究原始碼的人,可以留言跟我索取。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料