Ssl

設置透明 SSL 代理

  • May 30, 2013

我有一個帶有 2 個網卡的 linux 盒子來檢查通過埠 80 的流量。一張卡用於上網,另一張連接到網路交換機。關鍵是能夠檢查連接到該交換機的設備上的所有 HTTP 和 HTTPS 流量以進行調試。

我為 iptables 編寫了以下規則:

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

在 192.168.2.1:1337 上,我有一個使用 Charles ( http://www.charlesproxy.com/ ) 進行記錄的透明 http 代理。

埠 80 一切正常,但是當我為指向埠 1337 的埠 443 (SSL) 添加類似規則時,我收到有關通過 Charles 的無效消息的錯誤。

我之前和 Charles ( http://www.charlesproxy.com/documentation/proxying/ssl-proxying/ ) 在同一台電腦上使用過 SSL 代理,但由於某種原因透明地做它沒有成功。我在Google上搜尋過的一些資源說這是不可能的——如果有人能解釋原因,我願意接受這個答案。

作為說明,我可以完全訪問所描述的設置,包括連接到子網的所有客戶端 - 所以我可以接受 Charles 的自簽名證書。該解決方案不必是特定於查爾斯的,因為理論上任何透明代理都可以。

謝謝!

編輯:在玩了一點之後,我能夠讓它為特定的主機工作。當我將 iptables 修改為以下內容時(並在 charles 中打開 1338 以進行反向代理):

nat

-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.1:1337
-A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 1337

-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j DNAT --to-destination 192.168.2.1:1338
-A PREROUTING -i eth1 -p tcp -m tcp --dport 443 -j REDIRECT --to-ports 1338

-A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE

我能夠得到響應,但沒有目標主機。在反向代理中,如果我只是指定從 1338 到我想要訪問的特定主機,它會正確執行握手,我可以打開 SSL 代理來檢查通信。

設置不太理想,因為我不想假設從 1338 到該主機的所有內容 - 知道為什麼要剝離目標主機嗎?

再次感謝

您看到的問題與阻止在單個 IP 地址/埠上使用多個證書(不使用伺服器名稱指示)相同。

在純 HTTP 中,您的透明代理可以通過查看標頭來判斷客戶端想要連接到哪個主機Host

當 HTTPS MITM 透明代理收到請求時,它無法知道客戶端首先請求的是哪個主機名。(我什至不確定它是否可以使用這些規則獲取 IP 地址,這可能至少允許它使用反向 DNS 查找進行猜測,即使它在一般情況下不太可能工作。)

  • 為了獲得預期的主機名,MITM 代理必須讀取HostHTTP 消息中的標頭,這只能在成功握手後發生。
  • 為了成功握手,MITM 代理需要生成與預期主機名匹配的欺騙證書。

結果,MITM 代理在握手之前無法知道要生成哪個證書。

這可以與非透明 MITM 代理一起使用,因為您至少可以通過 HTTPCONNECT方法獲得預期的主機名。

引用自:https://serverfault.com/questions/369829