本文作者Tony Lee,轉載自FreeBuf.COM
自從家里換了聯通光纖后,聯通就在我家寬帶出口前搭了一個路由器,我家也徹底淪為192.168.1.0/24段的局域網了,帶來的問題就是在外網無法訪問家里的路由器。這對於刷了LEDE,有時候需要從外網直接管理使用路由器的我,覺得難受極了。周末有空,干脆解決這個問題。
在這之前,了解過一個ngrok項目,用於將局域網內的某一個地址的端口,映射到公網。但是研究了一下該軟件,發現其在LEDE的源中,並不包含,我又是個懶的去編譯的程序員,因此想看看有沒有其他辦法。
研究一下,發現其實程序員必備的SSH就有這個功能。SSH一共支持三種端口轉發:
1、本地端口轉發:就是客戶端方的某個端口和服務器某個端口相連,這樣訪問客戶端該端口,就相當於訪問服務器端某個端口
2、遠程端口轉發:還是把客戶端方的某個端口和服務器某個端口相連,只不過反向的,訪問服務器端某個端口,就相當於訪問到了客戶端該端口
3、動態轉發:SOCKS5代理模式,不多說了
更具體一些,可以參見這篇文章:https://blog.twofei.com/528/
回到我的需求,我是希望訪問VPS的某個端口,就相當於訪問路由器的指定端口。比如我訪問VPS的2222,就相當於訪問路由器的22端口。所以是第二種:遠程端口轉發
SSH做起來非常簡單,首先,修改VPS端
/etc/ssh/sshd_config
加入
GatewayPorts yes
據說,不這樣外網無法訪問轉發的端口,未驗證。然后路由器一條命令搞定:
ssh -f -NR "*:2222:localhost:22" user@vps
這樣子,訪問VPS的2222端口,就直接訪問到了路由器。
進化一:持久
用ssh命令有個問題,因為各種因素,它可能會莫名掛掉,網絡不好啦,網絡干擾啦,網絡xxx啦,總歸都是網絡問題。因此,我們得祭出神奇
autossh
。在LEDE的包中,默認就有,安裝之,愛死LEDE。在這之前,自己搞定SSH的密鑰登錄哦,否則autossh起來,也會卡在輸入密碼。 autossh在LEDE的配置文件是
/etc/config/autossh
,配置一下
config autossh 'ssh' option gatetime '0' option monitorport '20000' option poll '600' option ssh '-p 22 -NR *:2222:localhost:22 user@vps'
然后開啟autossh
進化二:隱藏
在我家的運營商,我發現了一個問題,如果你ssh啟動一段時間后,到目的地址的網絡丟包就開始大量出現。思來想去,把ssh塞到ssr-tunnel中不就完事了。
先建立一個到VPS的22端口的ssr-tunnel隧道
ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L VPS:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log
這樣,訪問本機的2222端口,就相當於走ssr流量訪問遠端的22端口。把autossh的配置稍微改一下,讓其訪問本機2222端口
config autossh 'ssh' option gatetime '0' option monitorport '20000' option poll '600' option ssh '-p 2222 -NR *:2222:localhost:22 vpsuser@localhost'
為了讓ssr-tunnel隧道保持運行,需要搞個監控。不需要很復雜,放到crontab里就可以了
ps | grep [s]sr-tunnel || `ssr-tunnel -c /var/etc/shadowsocksr.json -l 2222 -L vps:22 -f /tmp/ssr-tunnel.pid >> /tmp/ssr-tunnel.log`
進化三:多射
映射了第一個端口,你就想再來一個。什么aria2映射出來,就可以做外網離線下載。其實也蠻簡單的,因為autossh支持多端口映射
config autossh 'ssh' option gatetime '0' option monitorport '20000' option poll '600' option ssh '-p 2222 -NR *:2222:localhost:22 -NR *:6800:localhost:6800 vpsuser@localhost'
這樣就把aria2的6800也映射出來了
就這樣,結束了