用 ssh tunnel 連線到 router 背後的機器,並建立 SOCKS5 proxy 存取內網資源
這役男實在是…
記一下最近遇到的問題。
目前小弟正在公家單位服役。凡公家機關,內部架個外包的管理系統也是很合理的,不過因為是內部系統,所以只能透過區網來存取。對於我這個用自己機器的人來說就不太方便啦,連線的 Wifi Router 又不能和內網相通。
剛好單位有台閒置的虛擬機,也可以存取內網,Google 了幾個方案之後發現 ssh tunnel 的影響最小:不用裝些有的沒的,也不用更改網路環境,加上我已經有了台 Linode 上的遠端開發機常駐,就來試試吧 =w=
以下是環境的簡易說明圖。「那臺機器」就是閒置的內網虛擬機,「開發機器」是常駐 Linode 的遠端開發機,「Client 機」是任一台可以連線到開發機的裝置,可能是 Macbook Air、iPad,或是路邊撿來裝上 putty 的 Windows(逃)
+ | | ssh with reverse port +---------------+ forwarding +---------------+ | +------------------------> | | 那臺機器 <------------------------+ 開發機器 <-----+ mosh + tmux | | ssh to localhost via | | | 掛上去 | (ubuntu) | forwarded port | (Linode) | | +---------------+ | +---------------+ | | +-------------+ | | | | | | | | Client 機 | | | | | | | + +-------------+ 一堆 router 和防火牆等等
ssh remote port forwarding
先在 Ubuntu 上跑 ssh 指令連到遠端開發機,再加上 Remote port forwarding 參數:
# run on machine behind router ssh -NfR 11111:localhost:22 REMOTE_SERVER_IP
可以看到 ssh 有三個參數,分別為:
-N
: 單純連線,不送指令-f
: 放到背景執行-R
: Remote port forwarding,遠端埠重導
上面指令的作用是,建立 ssh tunnel,讓遠端機器的 11111
port 連回本機的 port 22 (localhost:22)。
所以接下來在遠端機跑:
# run on remote machine ssh localhost -p 11111
就可以 ssh 回 router 背後的機器啦。
SOCKS5 Proxy
接下來我們修改一點指令,加上 dynamic port forwarding 參數 -D
:
# run on remote machine ssh -ND 0.0.0.0:8080 localhost -p 11111
另一個參數 -N
讓指令純建立 tunnel,0.0.0.0
讓所有 IP 都能連到這臺機器,8080
是綁定的 port。-p
指令連接埠,也就是方才 forward 過來的 11111
。
這樣 SOCKS5 Proxy 就算跑起來了,最後來設定 Client 端。我另外開了一個 Chrome 的 Profile,裝上 Proxy SwitchyOmega 插件,方便隔離:
Remote IP 就是遠端開發機的 IP。Bypass List 要檢查一下,192.168.x.x
也要 forward,記得從 List 刪掉。
然後就可以在外網存取 192.168.X.X
的區網資源啦!太舒適啦!
參考資料
- Accessing home services from anywhere, without port forwarding! - 用 tinc 做 VPN,感覺更佳舒適
- ssh through a router without port forwarding - SuperUser 日常爬文