最近使用sshuttle實現全局代理,順便研究了一下實現的具體原理。
直接進入主題,先看一下啓動的輸出信息:
先綁定到本地的12300端口,將數據通過遠端的ssh服務器進行路由轉發。sshuttle和ssh的tunnle不同不是基於TCP-over-TCP的,而是叫data over tcp的,省去了一次包裹。然後建立端口映射,輸出信息如下:
很明顯是通過iptables的代理轉發來實現的,具體步驟:
- 新建nat表的處理鏈sshuttle-12300
- 清空處理鏈
- 將OUTPUT數據路由給sshuttle-12300處理
- 添加sshuttle-12300的處理過程,目標是本機則返回,目標是遠程主機的tcp轉發REDIRECT到12300端口,目標是dns服務器的udp數據通過12300端口來轉發
當然代理結束時就會將映射信息從iptables中刪除:
sshuttle是使用python實現的,安裝很方便幾乎是直接portable的。當然如果條件限制可以先使用ssh tunnle然後通過iptables的轉發來實現代理。其實不光是sshuttle,android的gae代理也是基於這個iptables來實現的。