近期家里更換了移動的寬帶,撥號后拿到的是10開頭的內網IP,就不能像之前一樣通過路由器的端口映射實現從外網訪問主機的遠程桌面。這種情況下可以利用一台具有公網IP的服務器充當中轉,利用SSH的隧道轉發功能將遠程桌面請求轉發至內網主機。
SSH隧道
SSH 會自動加密和解密所有SSH 客戶端與服務端之間的網絡數據,除此之外SSH 還能夠將其他TCP端口的網絡數據通過SSH鏈接來轉發,並且自動提供了相應的加密及解密服務,這一功能也稱為“SSH隧道”。SSH隧道分為本地轉發、遠程轉發和動態轉發。
本地轉發
在客戶端本地監聽指定端口,該端口接收到的數據將轉發至服務端網絡的指定IP的指定端口。
遠程轉發
在服務端監聽指定端口,該端口接收到的數據將轉發至客戶端本地網絡的指定IP指定端口。
動態轉發
在客戶端本地監聽指定端口,該端口實際上是一個SOCKS5代理,所有請求通過服務端發出。
環境准備
- 具有公網IP的服務器,在這里使用阿里雲ECS
- Putty
服務器設置
編輯ssh的配置文件,啟用GatewayPorts。若GatewayPorts選項未啟用,遠程轉發端口只有服務器能訪問,外部主機無法訪問。
vi /etc/ssh/sshd_config 在末尾添加一行 GatewayPorts yes # 重啟ssh服務 service sshd restart
客戶端設置
在客戶端上啟動Putty,在Session中輸入服務器地址。
切換到Connection-SSH-Tunnels,在Source port中輸入外網服務器的監聽端口,Destination中輸入轉發的IP地址和端口號,格式為IP地址:端口
,轉發類型選擇遠程,點擊Add添加到列表中。在這里我們將服務器的10000端口映射到本機的3389端口。
選擇open,輸入用戶名和密碼。登陸成功后查看監聽端口,發現10000端口已經監聽。
[root@iZwz9ds6obifn90aw8j2khZ ~]# netstat -aon|grep 10000 tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN off (0.00/0/0)
這樣內網主機和服務器之間的隧道已經建立起來了,通過訪問服務器的10000端口即可遠程登陸到內網主機。
但是使用這種方法每次都要在受控主機上手動運行Putty輸入用戶名密碼,如遇到斷網、系統更新、重啟、停電等情況無法自動恢復連接。接下來我們就配置使用SSH證書免密登陸和Autossh實現自動重連。