最近由於專案快上線了,所以頻繁的連接在不同的環境下的機器,或是監看機器的使用狀態;在這樣的使用情境下,之前有試著使用Socks5 + SwitchyOmega 的組合來連接,這樣的組合在只用來連接內網的dashboard時是蠻堪用的,但如果其它類型的連線就無法了。
每當要使用像是TCP連線到內網的機器(像是連資料庫之類的),就都要在先連一次VPN,然後才再連線;但連線完VPN以後,又要把SwitchyOmega的設定關閉,不然VPN +Socks5 + SwitchyOmega 的組合無法讓我連到特定的Dashboard…
這其實蠻惱人的,尤其是頻繁的切換使用VPN網路時,或是在開會過程中,又需要連到特定環境下的機器…
通常這問題大概可以使用幾種方式克服:
VPN – Partial Routing
若是使用OpenVPN的話可以在導入Profile時加入以下設定來讓client端可以自訂路由的規則。
route-nopull
route X.X.Y.Z 255.255.255.255
這邊的範例是只有往x.x.y.z
時才會經由vpn。
但這個方案的缺點是,同時間也只能連到一台OpenVPN 伺服器,所以代表同時間也只能連到同一個環境下的機器。
但優點就是所有TCP/UDP的封包都可以經由路由連接到那個環境下的機器。
SSH Tunnel Proxy
其實ssh
已經提供了一個方便的解決方案了,即是使用-L
這個flag,讓我們可以透過中介的jump/proxy server,讓我們的本地主機與遠端主機建立一個虛擬通道。
ssh -NL 5432:staging-postgres.your-domain.com user@jumper-server.your-domain.com
(使用-f
可以讓這個tunnel 在背景下執行。)
透過上面的指令,我們就可以執行下面的psql 指令來連接staging postgres這個資料庫。
psql -U postgres -d postgres -h 127.0.0.1 -p 5432
這個方案的缺點就是,如果有多台主機需要連的話,可能要設定多個Tunnel Proxy。
sshuttle
在Stackoverflow 上剛好看到了這篇文章,其中回應有提到了sshuttle 這個開源的專案可以透過ssh tunnel導流所有TCP的流量到遠端的jump server,也就是類似TCP Proxy的功能。
試了以後還蠻方便的,它底層的原理即是使用了ssh tunnel proxy,所以也是需要一台中介的ssh jump/proxy server。除此之外,它可以讓使用者用根據網段來轉送流量,所以基本可以解決原本在ssh tunnel proxy的一些不方便之處。
安裝
# For Mac
brew install sshuttle
# For ubuntu
sudo apt-get install sshuttle
使用上的基本指令
sshuttle -vr user@jumper-server.your-domain.com 10.0.0.0/8
上面這指令即是把所有往10.0.0.0/8
的TCP流量都自動轉往jumper-server.your-domain.com
上送…
Reference:
- https://superuser.com/questions/802967/how-can-i-make-sure-all-my-macs-tcp-traffic-goes-through-a-socks5-proxy
- https://serverfault.com/questions/891690/disable-global-routing-with-openvpn
- http://teohm.com/blog/using-sshuttle-in-daily-work/
- https://perfecto25.medium.com/using-sshuttle-as-a-service-bec2684a65fe