設置透明 SSL 代理
我有一個帶有 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 代理必須讀取
Host
HTTP 消息中的標頭,這只能在成功握手後發生。- 為了成功握手,MITM 代理需要生成與預期主機名匹配的欺騙證書。
結果,MITM 代理在握手之前無法知道要生成哪個證書。
這可以與非透明 MITM 代理一起使用,因為您至少可以通過 HTTP
CONNECT
方法獲得預期的主機名。