經由 ssh tunnel 連上行動網路裡的 adb

adb 除了用 usb 線連接外, 也能走網路用 tcp 連接,最簡單是在區網中用 wifi 連結。 但有時候電腦和 android 二者不在同一區網, 那就得靠第三方有固定 ip 的 server 做中介, 只要有網路就能經由 ssh port forward 遠端連上 adb, 就算是行動網路浮動 ip 也能遠端做壞事了。

首先如果有 root 的話,有現成的 app 能控制 adb 走 tcp, 不然就是用 前文所寫無 root 透過 wifi adb 的作法 。 之前用的是 f-droid 的 ADB Manager , 但他在我的新手機怪怪的,會一直跳出來要 root 權限, 就換成 Wirebug 。 反正都是很簡單的 app,就只有一個功能是切換透過 tcp adb。

然後 android 上的 ssh client 我是用 VX ConnectBot , 你也可以用其它能 ssh forward remote 的軟體。 (也就是 ssh -R 的功能。) 設定過程就相當於在 android 上執行 ssh -R 55555:localhost:5555 my@static.sever.tw , 之後 static.server.tw 上的 38763 port 就會被轉發到 android 上的 5555 port。

以 vx connect bot 來說, 設定方法是登入過主機並加入清單後, 長按該主機會有一個 編輯端口轉發 的選項。 按頂端的選單新建一個端口轉發, 暱稱隨便取,我是取 adb, 轉發類型 選遠端, 源端口看你要在 static.server.tw 上哪個 port 會連到 android, (例如上面是用 55555。) 而目標端口則選 localhost:5555 也就是 adb 的預設 port。

之後你用 vx connect bot 連上該主機時就會自動轉發, 不管是走 wifi 還是 4g 網路; 再用 wirebug 或 adb manager 或先前登入設定允許從網路連接 adb, 就能登入 static.server.tw 後 adb connect localhost:55555 連上 android。

如果你不想要再登入一次 static.server.tw 才能執行 adb, 還能在 static.server.tw 上的 /etc/ssh/sshd_config 裡 設 GatewayPorts yes , 就能讓 static.server.tw 的 55555 port 直接連到 android。 預設因為安全起見,ssh server 是不允許綁到對外 ip 的; 也就是只有在 static.server.tw 上看 localhost:55555 才會連到 android 的 5555 port, 但從外部連到 static.server.tw:55555 是連不上的。

另外 vx connect bot 的轉發類型有 遠端、本地、動態套接字(socks) 三種可以選。 其中遠端上面說明過了,也就是 ssh 的 -R 選項, 本地就是 -L ,動態套接字則是 -D 選項, 用來當 http SOCKS 給瀏覽器用的。

用 ssh 轉發多種服務

除了 adb 外,我也有用幾種會需要讓外部連進來的服務, 像是 alpha vnc 和 primitive sftp , 有時二端在不同的區網,就得用這招把內網 ip 轉到公網 ip。 目前我是在 vx connect bot 開了一個項目是只用來轉發 port, 不開啟 ssh shell 的。 然後該項目就會把 adb 5555、vnc 5900、sftp 2222 一口氣都轉過去,省得麻煩。 但 sftp 不能綁 22,一方面是 app 不給設, 一方面是 22 在公網 server 已經被 ssh 吃掉了。