第三章 系統設計與實作
3.6 系統實作
3.6.2 Proxy
Proxy 主要會收到兩種形式的封包,一種為 client 送過來的;另外一種則為 server 回覆 client 的封包,此類封包是由 last forwarder 轉送過來的。而由 proxy 送出的封包,也分為轉送 client_to_server (request)與 server_to_client(reply)的兩 種。
<1>接收到 client 送來的封包
分為兩部分。首先我們在上層,開啟一個 raw_sock,等待接收 IP protocol 為 131 的封包,當收到此類封包後,根據一開始 client 要求匿名連線時所給定的 last forwarder,對其建立不同的 table,其中紀錄 client 的 IP address 與、Source port number、Destination port number 與 session number,再處理後續 forwarding 的部 分。
<2>送給 forwarder 的封包
proxy 會先對每個 forwarder 建立一個表格,之後當收到 client 送來的封包時 (格式如
表 3.6.1),proxy 會根據先前指定給該部 client 的 last forwarder,找出該
forwarder 的表格,將 forwarding information 中的資訊,也就是 source port 與 desionation port number 紀錄下來,還有該部 client 在本次匿名連線中所對應的 session number 也一併記下,如圖 3.6.3。接著選擇數台目前存活 forwarder 的位
址,依照安排的移動順序包裝並層層加密起來,最後加上一 IP header 後再送出,
整個封包的格式如
圖 3.6.4 所示。
-圖3.6.3 last forwarder 表格-
-圖3.6.4 proxy 傳給 forwarder 封包格式-
<3>接收到 server 回覆,由某部 forwarder 所轉送來的封包
與接收到 client 送來的封包類似,在上層開啟一個 raw_sock,等待接收 IP protocol 為 132 的封包,當收到此類封包後,根據來源 IP 位址找出對應的 secret key,再由 IP header(20 bytes)加上 source port&destination port(4 bytes)再加上 1 byte 的 session number 與 16-bit 的『0』後面開始,這把 key 解密,之後再處理後 續回送給 client 的部分。收到的封包格式如
圖 3.6.5。,
-圖3.6.5 forwarder 傳給 proxy 的封包格式-
<4>送回給 client 的回覆封包(replay packet)
收到「<3>接收到 server 回覆,由某部 forwarder 所轉送來的封包」後,如同 上述所說一般,先拆開一層 IP header,然後根據來源 IP 位址找出對應的 secret key 解密,得到 Source port number、Destination port number 與 session 找出對應的 last forwarder ID 表格,查表比對 source port number、destination port number 與 session number 來決定回送的 client 位址(參考
圖 3.6.6),接著再任意選擇數部 forwarders,
如同先前轉送 client 送給 server 的 request 封包一般,reply 封包也是令其再透過 數部 forwarder 轉送回 client,完整送出的封包格式如
圖 3.6.7 所示。
-圖3.6.6 proxy 查表找出對應 client IP 位址-
-圖3.6.7 proxy 回傳給 client 的封包格式-
3.6.3 Forwardwer
Forwarder 主要包含以下數種功能:
<1> 向 proxy 提出註冊請求,以便加入該群組,包含取得 proxy 的 public key,
以及告知 proxy 自己的 secret key,這把 key 主要是做為封包 forwarding 時所 使用,並且該把 key 是藉由 proxy 的 public key 加密後再回傳給 proxy。另外 就是每隔一段時間對 proxy 送出存活通知。
<2> 收到特定封包(IP protocol 為 131 或 132)後,若 IP protocol 為 131,表示從 IP header(封包 20 bytes 後)開始使用自己的 key 解開,並根據解開後得到的資 訊找出封包接下來轉送的目的;若是 IP protocol 為 132,則將收到的封包由 IP header 之後全部以自己的 key 加密起來,再轉送給 proxy,送出的封包格 式如同圖 3.6.5。
<3> 依照封包訊息,決定該封包的處理方式,包含再次 forwarding、將 server 回 應的 reply 封包回送給前一部 forwarder,或是擔任連線 last forwarder 時將該 封包送給目的 server,與收到 last forwarder 傳來的封包(LFB to LFA)四種:
(1)擔任 last forwarder(指 LFB)的 forwarder 收到 server 回應的封包後,查表
找出前一部 forwarder 的 IP 位址,然後重新包裝封包如
圖 3.6.8。
-圖3.6.8 LFB 回傳給 LFA 的封包格式-
(2)傳送給 server,對 TCP header 中 source port number 部分,我們必須先以 session number 建立一個表格,內容紀錄了原始 TCP source port、destination port、pre-forwarder IP address,以及 server IP address,最後重算 TCP checksum 再送給 server,送出的封包格式如
圖 3.6.9 所示。
-圖3.6.9 重算 TCP
checksum-(3)收到 last forwarder(即 LFB)傳來的封包,格式如圖 3.6.8,則再將該封包加 密一層後傳給 proxy,送出的封包格式如
圖 3.6.5 所示。
(4)將封包再轉送給下一個 forwarder,先去除一個 IP header,再使用自己的
secret key 解開封包,可以得到該封包的下一個目的位址,重新包裝 IP header 後再送出。
3.7 執行流程
3.7.1 啟動匿名連線
分別向兩部(或兩部以上)proxy 發出匿名連線請求,proxy 收到請求後,從該 群組的所有 forwarder 中選出一部 last forwarder,並配置一 session number 給該部 提出匿名連線請求的 client,同樣的另外一部收到 client 提出匿名連線要求的 proxy 也一樣。
完整流程敘述如下:
<1>client 告知 proxyA 與 proxyB 將進行匿名連線,並把 client 自己的 public key 送給 proxyA 與 proxyB。
<2>proxyA 得知有一 client 將進行匿名連線時,先由該群組中選定一台 forwardwer 做為連線代理之 last forwarder,在此步驟中,由 proxyA 決定 last forwarder 是哪一台,而不是讓 client 決定 last forwarder 的原因在於,只有 proxyA 知道 有哪些 forwarder 可用,client 並不知道,因此 last forwarder 必須交由 proxyA 來決定,之後並針對 client 這次的匿名連線產生一 session number。同樣的 proxyB 也會於所屬群組中挑選出一部 last forwarder,以及一組 session number。
<3>最後將這些資訊,包括選定的 last forwarder_ID、last forwarder IP 位址、last forwarder 的 secret key 以及 proxy 所配置的 session number,使用 client 的 public key 加密起來回傳給 client。
<4>client 再決定之後與 server 傳遞封包要先送給哪部 proxy,若是選定 proxyA,
則之後封包移動路徑為
client Æ proxyA Æ { 數部為 proxyA 群組中的 forwarder} Æ LFA Æ LFB Æ server ,
若是選定為 proxyB,則之後封包移動路徑為
client Æ proxyB Æ { 數部為 proxyB 群組中的 forwarder } Æ LFB Æ LFA Æ server 。
3.7.2 傳遞封包
<1> client 開啟匿名連線功能後,所有封包皆會在 ip output function 中先經過處 理,再透過 proxy 去轉送。
<2>proxyA 收到 client 送來的封包後,依照 forwarding information 中的內容,先 檢查 source port number 與 destination port number,接著再選擇數台 forwarder(在 此以經一部 forwarder1 後到達 LFA 為例),依序包裝好 forwarder IP address 並加 密,再送出給第一部 forwarder1。
<3>Forwarder1 收到 proxy 送來的封包後,先解開一層,再由解開的封包內部資 訊中得知下一個目的地為 LFA,去除存放這些資訊的內容後重新填寫 IP header 後再送出。
<4>LFALFA 收到 forwarder1 送來的封包後,同樣先解開一層,並且由內部資訊 中得到下一個目的地為 LFB,同樣的,去除存放這些資訊的內容後重新填寫 IP header 後再送出。
<5>LFB 收到 LFA 送來的封包後,同樣先解開一層,由內部資訊中得知該封包必 須經自己轉送給 server,因此改變原始 IP header 中 source IP address,重算 TCP checksum 後再送出給真正的目的 server。
<6>當 server 收到由 last forwarder 送出給他的封包後,之後回覆的封包會送給 LFB,這是因為 server 會認為此連線是由 LFB 所要求的。而 LFB 收到 server 回 應的封包後,經由查表比對 session number、source port、destination port 與 pre-forwarder IP 位址,再將封包送回給 LFA。
<7>LFA 收到後,再回送給 proxyA。
<8>proxyA 收到此封包後,找出該封包真正的目的位址(client)之後,再選擇數部 forwarders 來轉送該封包(在此僅選擇一部 forwarder1),將轉送的 IP 位址資訊包 裝好,再送給該 forwarder1,透過該 forwarder1 將此封包轉送給 client。
3.7.3 結束匿名連線
當 client 欲結束匿名連線時,會先送出通知給 proxyA 與 proxyB,proxyA 與 proxyB 再分別通知 LFA 與 LFB 令其釋放對應 session number 相關的表格,最後 proxy 再清除對應 forwarder 上的資訊。
第四章 實驗成果
分為「匿名實驗測試」與「效能實驗結果」兩部分。
4.1 實驗設計
為了展示實際匿名封包傳輸的情形,我們可藉由 Ethereal 這套程式聽取在 client、proxy 與各個 forwarder 中封包的傳送情形,以及 server 對於此次連線,
判定送出連線要求的 client 其 IP address 為何。整個實驗的系統架構圖如同
圖 4.1.1
所示,所有電腦都接在同一個 hub 上方便捕捉封包觀察,再連到 Internet 上,存 取遠端的 server,此部分是以交通大學資訊科學系計算機中心的工作站( 140.113.23.102 )做為連線測試。
-圖4.1.1 實驗系統架構配置圖-
表 4-1 實驗設備
client FreeBsd 5.1, AMD athlon XP 1800+, 256 MB of RAM proxy FreeBsd 5.1, AMD Duron 1.8Ghz, 128 MB of RAM forwarder1 FreeBsd 5.1, Intel CELERON 333 Mhz, 128 MB of RAM forwarder2 FreeBsd 5.1, Intel CELERON 300 Mhz, 128 MB of RAM forwarder3 FreeBsd 5.1, Intel PentiumIII 700Mhz, 128 MB of RAM
其中 proxy 扮演 proxyA,forwarder1 與 forwarder2 同屬 group A,forwarder2 扮演 LFA;而 forwarder3 則同時扮演 proxyB 與 LFB。
4.2 實驗結果
4.2.1 匿名性
由於原始的 IP header 是一直都放在後面 proxy router 及 forwarder 所造的 IP header 之後,並且加密,所以無論在何處擷都取封包都無法得知真正發送端與接 收端的 IP,而截取到的封包 IP Address 只有以下情況:
表 4-2 封包匿名性
1 source client IP address destination proxy IP address 2 source proxy IP address destination forwarder IP address 3 source forwarder IP address destination forwarder IP address 4 source forwarder IP address destination server IP address 5 source forwarder IP address destination proxy IP address 6 source forwarder IP address destination client IP address
1. Telnet 連線測試:
連線目標 server 為交通大學資訊科學系計算機中心工作站 cissol2 ,IP 位址 為 140.113.23.102,client 的 IP 位址則為 140.113.241.21。以 telnet 連上 server,
連上後下 netatat 指令,可以得知目前該 server 與哪些 client 建立連線,如
圖 4.2.1
中,畫上底線部份,我們可知目前 client 正藉由 140.113.241.21 這個 IP 位址與 server 連線中。-圖4.2.1 Telnet 正常連線結果-
接著我們啟動匿名連線,同樣再 telnet 到 server 上,一樣執行 netstst 指令,
結果如
圖 4.2.2 中,可以發現目前與 server 進行連線的 client 中,有一 IP 位址為
140.113.241.28 的電腦,而該部電腦正是其中一部 forwarder,並且可以確定的是,在該部電腦(140.113.241.28)上,目前並無執行 telnet 連線到該 server 之上,可知 我們成功的透過其他電腦連上了 server,並且 server 無法確切得知真正連線的 client IP 位址。
-圖4.2.2 Telnet 匿名連線測試-
2. HTTP(Hypertext Transfer Protocol)網頁連線測試
client 連上某特定網頁,會回報該 client 目前連線所使用的 IP 位址為何,例 如 http://www.all-nettools.com/pr.php、http://taruo.net/e/ … 等,藉由這類的網頁,
使用者可以測試 client 連到該 server 時,有否透過 proxy 或是直接連上的。
我們分別測試了這兩個網頁,一開始是採用正常模式連線,得到的結果如同
圖 4.2.3 、圖 4.2.4,server 回報皆為目前 client 使用的 IP 位址 140.113.241.21。
-圖4.2.3 網頁瀏覽正常連線測試-1-
-圖4.2.4 網頁瀏覽正常連線測試-2-
接著我們啟動匿名連線,重新連上網頁,得到的結果如
圖 4.2.5 與圖 4.2.6,
回報的結果,都認定連線 client 位址為 140.113.241.28,這是某部 forwarder 的 IP 位址,而非 client 真實的 IP 位址。
-圖4.2.5 網頁瀏覽匿名測試-1-
-圖4.2.6 網頁瀏覽匿名測試-2-
匿名性分析:
以 client 的觀點來講,整個連線過程中 client 知道 server 存在的位置,也知 道 proxy 的位址,但 client 無法得知封包傳遞過程中,會經過哪些 forwarder,僅 會知道先經 proxyA 後再走到 LFA,而到達 LFA 之前還會經過哪些 forwarder 就 不是 client 能決定的了,如
圖 4.2.7 所示。
-圖4.2.7 匿名性-client 的觀點-
而若是以 proxy 的觀點,則 proxy 可以知道每個轉送的封包,client(來源)的 實際位置,以及接下來會經過哪些 forwarder 轉遞該封包(這是由 proxy 自行決定 的),另外就是封包於該群組中到達的最後一台 forwarder,即 LFA,但是對於該 封包實際的目的地(server)與 LFA 之後還會送到哪(在此指 LFB)並無法得知,如
圖 4.2.8 所示。
-圖4.2.8 匿名性-proxy 的觀點-
中間的 forwarder,若只是單存負責轉送封包,則該 forwarder 僅會知道此封 包是由哪個 node 送過來的,以及接下來要轉送給誰。而最後做為 last forwarder 的 node,其獲得的資訊則為:目的 server 位址以及要求連線的來源位址,其中 來源在 last forwarder 的認知中是為 proxy,而非真正 client,如
圖 4.2.9 所示。
-圖4.2.9 匿名性-forwarder 的觀點-
4.2.2 效能
目前加密部分的實作是使用 DES 加密系統,有關於加解密這部分的功能,
目前加密部分的實作是使用 DES 加密系統,有關於加解密這部分的功能,