第三章 系統設計與實作
3.6 系統實作
3.6.1 Client 端
在 client 端,我們必須處理的情形,可分為匿名封包的送出,以及收取匿名 封包,而當 client 開啟匿名連線時,會向兩部以上 proxy 發出請求,兩部 proxy 分別會選定一台 last forwarder,在此假定由 proxyA 群組中選到的 last forwarder 稱為 LFA,另外一 proxyB 群組中選到的 last forwarder 稱為 LFB2,而 client 之後 會收到由 proxyA 回應的資訊為:LFA 的 IP 位址、一把 LFA 上用來 forwarding 的 secret key,在此令其為 LFA key,以及 LFA 在 proxyA 註冊時的 ID 編號,另 外就是 proxyA 對於這次 client 要求匿名連線給定的一個 session number。同樣的 也會從 proxyB 收到資訊為:LFB 的 IP 位址、一把 LFB 上用來 forwarding 的 secret key,在此稱其為 LFB key1,以及 LFA 在 proxyA 註冊時的 ID 編號,還有就是
proxyB 對於這次 client 要求匿名連線給定的一個 session number。最後 client 再 自己選定往與 server 溝通的封包時要送給哪部 proxy。本論文以下內容中接假定 client 會選定 proxyA 做為轉送封包的第一站,而最後送達 server 前的一部 forwarder 則為 LFB。下面說明與 server 溝通時送出封包的格式。
一個原始的 IP packet 格式如
圖 2.1.1,由於我們目標是將封包傳送目標改為
proxyA,因此對原來的 IP packet 再加上一 IP header 以及 forwarding information。格式如
圖 3.5.1:
-圖3.6.1 client 送出要求 server 的封包格式-
淺灰底部分為我們加上去的 IP header,深灰則為 forwarding information,白底則 為原始 IP packet。
『forwarding information』欄位說明(由上而下):
‧Source port & Destination port number:大小為共為 32-bit,由原始 TCP/UDP 封 包中複製出一份相同的 Source port & Destination port number,目的是讓 proxyA 接收到該封包後可以取得這些資訊,以便將來轉送 server 回覆的封包給 client。
‧Packet type & packet length:大小為共為 32-bit,前半段 16-bit 填 0(request),接 著後面 16-bit 則填寫未加密前封包的長度(計算為這裡的 0 & packet length 到封 包尾端)。
‧32-bit LFB IP address:放置 LFB 的 IP 位址。
‧Packet type & packet length:大小為共為 32-bit,前半段 16-bit 填 0(request),接 著後面 16-bit 則填寫未加密前封包的長度(計算為這裡的 session number &
packet length 到封包尾端)。
‧LFB’s ID:大小為 32-bit,此值是 proxyB 給定的。
‧Session number:共 32-bit,前 16-bit 放 proxyA 指定的 session number,後 16-bit 則是存放 proxyB 所指定的 session number。
除此之外,client 尚還需處理 server 回覆(reply)的封包。Client 收到回覆的封 包格式如
圖 3.6.2:
-圖3.6.2 client 收到 server 回覆的封包格式-
判斷是否為 reply 封包,我們在本論文中是以當封包的 IP protocol 欄位為 132
時,則 client 即在 ip_input fountion 中處理該封包。先在 ip_input function 中去掉 20bytes IP header,再使用 LFB key 解開剩下的部分,然後檢查 session number 欄 位與 last forwader ID 是否正確,若是都正確,則根據 length 欄位去除因加密所 padding 的部分,得到原始 server 回應封包,接著於原始封包 IP header 中 desintation IP address 欄位中填入 client 自己的 IP address,並重算 TCP checksum,或是令當 檢查 TCP checksum 時令其跳過不檢查(這是因為在 IP 層重算,之後檢查一定還 是正確的)。