不過說到底, ssh tunnel 並不是一個很好的解決方式。因為 ssh tunnel 還是會遇到 connection timeout ﹑需要重連等等情況。遇到這些情況的時候,如果沒有去妥善的處理,又會造成麻煩(註1)。 另外,這個 ssh server 只會是我們的一個跳板,所以如果沒有 proxy 的功能,又會讓你在使用上造成麻煩(註2)。
解決之道在這邊:
1. AutoSSH 像下面這樣一行指令就可以確保這個 ssh tunnel 的連結一直維持運作。我的習慣是用 screen 在 foreground 跑,這樣我可以確切的知道它運作的情況。
autossh -M 2345 -N -D 2222 remote
2. ProxyChains 以下的設定檔可以讓我們接上原本只有 remote 可以接上的節點。真正要使用的指令,請參考下面 proxychains 指令的說明。
cat .proxychains/proxychains.conf
DynamicChain
tcp_read_time_out 15000
tcp_connect_time_out 10000
[ProxyList]
socks5 127.0.0.1 2222
2.1 ProxyChains 的指令其實很簡單。像上面提到的例子,我們想訪問公司內部的 web server 該怎麼做?在命令列上面打上:
proxychains firefox
這樣,開出來的 firefox 就會配置在 proxychains 的網路架構上。 (注意喔, firefox 如果已經開啟了,那新增加的行程,會回去原來的 firefox 裡面開一個 tab 而已,這樣就不會用到 proxychains 的配置)
想 ping 公司內部的 A 機器?
proxychains ping A
這樣,應該就有人看出來,其實用法就是在最前面加上 proxychains 而已。
(命令很長厚? 請愛用 alias ,像我都會用
alias psvn='proxychains svn'
alias px='proxychains'
這樣, svn 的訪問就很簡單, porxychains 的使用也縮短成只有 px 兩個字而已。
--
註1: 有人回說,那不是寫一個 shell , loop 去解決就好了嗎? ~ 呃,你一定沒遇過 ssh 被突然斷線的情況,突然斷線之後,原本的 connection 還沒那麼快斷勒,所以,你這時連上去,就會增一個 connection 的數量,最後網路情況如果很糟,你就會在你的 ssh server 上面看到一堆屍體跟沒有用的行程。
註2: 譬如說,我需要連結公司內部的 web service ,那光 ssh proxy socket server 以外,還需要 forward http 或 https 的部份,這樣設定起來就會... 不只是麻煩。