1. 程式人生 > >sshuttle全域性代理的實現簡析

sshuttle全域性代理的實現簡析

最近使用sshuttle實現全域性代理,順便研究了一下實現的具體原理。

直接進入主題,先看一下啟動的輸出資訊:


先繫結到本地的12300埠,將資料通過遠端的ssh伺服器進行路由轉發。sshuttle和ssh的tunnle不同不是基於TCP-over-TCP的,而是叫data over tcp的,省去了一次包裹。然後建立埠對映,輸出資訊如下:


很明顯是通過iptables的代理轉發來實現的,具體步驟:

  1. 新建nat表的處理鏈sshuttle-12300
  2. 清空處理鏈
  3. 將OUTPUT資料路由給sshuttle-12300處理
  4. 新增sshuttle-12300的處理過程,目標是本機則返回,目標是遠端主機的tcp轉發REDIRECT到12300埠,目標是dns伺服器的udp資料通過12300埠來轉發

當然代理結束時就會將對映資訊從iptables中刪除:


sshuttle是使用python實現的,安裝很方便幾乎是直接portable的。當然如果條件限制可以先使用ssh tunnle然後通過iptables的轉發來實現代理。其實不光是sshuttle,android的gae代理也是基於這個iptables來實現的。