因應資安緣故(網路上的壞人太多),所以單位裡很多機器都藏到防火牆後面,除非特別開對外連接埠,否則單位外機器是無法直接從外面連接進來。又,現在最常見的安全性作法便是機器一定要在某限定的網域內,才能執行某工作,或是使用某資源。
但現實總是會有例外,會有無法實際在限定的網域裡,但又有實際連接的短暫需求時,面對此問題,不少單位則會使用架設 vpn 服務來因應。
不過,若不想因為臨時短暫的需求而大費周章的架設 vpn 服務時,可以利用 sshuttle 來做個臨時通道,讓自己的機器暫時成為該網域底下主機的一員。
整個概念如下圖:
主機(192.168.0.100)位在 192.192.0.0 此網域之外,透過 sshuttle 連接 192.192.0.100 這部主機後,便隱身到 192.192.0.100 主機裡面,所有的對外連線需求則全部都以 192.192.0.100 這部主機的名義對外發出,這就好像變成了 192.192.0.0 此網域裡面的主機的一員了。
sshuttle 官網表示目前只支援 Linux, FreeBSD, 或 MacOS 等作業系統,而我個人認為其實只要能跑「ssh + python」便可。因為 sshuttle 是奠基在 ssh 服務上由 python 寫成的小程式,只需要 client 端能執行此程式,再由 server端開啟 ssh 服務並對外開啟連接埠,便可以達成!
至於為什麼 ssh server 上只需要 python 而不用裝 sshuttle 呢?因為 sshuttle 在執行後,會自動將 client 裡的 sshuttle 的檔案上傳,並且執行,這樣不但省麻煩,而且也不會有版本不同的問題。(此段是依據「窮人的 vpn – sshuttle 介紹」的說法)
取得與安裝
sshuttle 可直接在 github 中取得, https://github.com/sshuttle/sshuttle。也可以直接透過各作業系統的套件管理程式庫,直接取得安裝。
我個人是嫌套件庫裡的程式太舊,更新太慢,所以我都盡可能直接去官網下載最新版回來安裝。整個動作,看起來很威,其實也就三個步驟:
- 下載
- 安裝
- 清除
git clone https://github.com/sshuttle/sshuttle.git
cd sshuttle
sudo ./setup.py install
cd ..
sudo rm -Rf sshuttle
特別注意點有二:
首先,在安裝完成之後,sshuttle 會被放在 /usr/local/bin/ 目錄中,而此時要注意 client 這部機器 python 的執行檔的位置在哪裡,以我的機器來說,是放在 /usr/bin/ 此目錄底下,但 sshuttle 程式是預設 python 放在 /bin/ 底下,所以要先去更改 sshuttle 。(使用文字編輯器便可,例如:vim )
其次,要注意 client 端與 server 端 python 版本號碼是否一致,若有連接失敗的狀況,可能是兩端版本號碼不同,此時調整一下,便可以!舊版有此問題,但不知最新版是否已修掉此問題。
連線
最重要的點,連線之前,要先確定在 192.192.0.100 這部主機上,要有可以 ssh 登入進去的帳號,若沒有,就沒有以下了。
執行時,可以透過 sshuttle –help 了解 sshuttle 的用法。
sshuttle -NHvr (帳號)@192.192.0.100 192.168.0.0/0
說明:
- (帳號):可以 ssh 登入 192.192.0.100 的真實帳號,且已設定好免密碼登入。
- -N:讓 sshuttle 自動偵測有哪些 subnets 要轉送
- -H:自動掃描遠端 ssh server 的 /etc/hosts,並更新本地 /etc/hosts,方便存取伺服器之類的
- -v :將執行過程結果顯示出來
- -r:(–remote) 是遠端的 ssh server,本例中的 192.192.0.100
- 192.168.0.0/0:連線 Client 端的子網域,表示任何在此子網域的機器,只要是透過 192.168.0.100 這部機器連過去,統統都會變成披著 192.192.0.100 外衣的機器。
參考資源:
- sshuttle 轻量级全局代理工具
- 窮人的 vpn – sshuttle 介紹
https://liwanggui.com/posts/sshuttle/
請問我在執行 sshuttle -NHvr account@my.host 168.95.0.0/16 這個指令之後,去下 mtr 168.95.1.1
但原來的路由並沒有改變 還是走我本來的 default gateway 出去
這個指令格式有錯誤?
理論上您的指令是對的, sshuttle -NHvr account@my.host 168.95.0.0/16 ,
您有沒有確認遠端的機器是否有被遠端掛上?