最近,由于新冠肺炎影響,我們都在家辦公。但是,小伙伴需要本地電腦訪問我家里局域網(wǎng)內(nèi)的數(shù)據(jù)服務(wù)器,剛開始我們使用了teamviewer,但感覺不是很安全,于是我們研究了下通過ssh隧道穿越來進(jìn)行訪問。
如下圖所示,我們的需求是本地主機(jī)192.168.1.100能通過ssh遠(yuǎn)程登錄另一個(gè)局域網(wǎng)下的目標(biāo)主機(jī)192.168.3.87,為了達(dá)到這個(gè)目標(biāo),我們需要一個(gè)擁有公網(wǎng)ip的代理服務(wù)器47.55.38.19,來做ssh的端口轉(zhuǎn)發(fā)。

下面,我們分別對代理服務(wù)器、目標(biāo)主機(jī)和本地主機(jī)進(jìn)行配置。
一、配置代理服務(wù)器
1、開放端口
代理服務(wù)器我用的是阿里云服務(wù)器,后面我會用到端口10022進(jìn)行轉(zhuǎn)發(fā),所以需要在阿里云上開放這個(gè)端口,進(jìn)入安全組,添加一條訪問規(guī)則,如下所示:

2、修改ssh配置文件
編輯/etc/ssh/sshd_config文件
$ vim /etc/ssh/sshd_config
在sshd_config中添加一條配置,打開轉(zhuǎn)發(fā)功能,如下:
GatewayPorts yes
wq保存好以后,重啟ssh
service ssh reload
二、配置目標(biāo)主機(jī)
非常簡單,執(zhí)行下面命令就行了
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
這條命令的作用是:
- 建立一條ssh連接,目標(biāo)主機(jī)192.168.3.87連接上代理服務(wù)器47.55.38.19
- 如果有其他ssh客戶端連接到代理服務(wù)器47.55.38.19的10022端口上時(shí),則代理服務(wù)器會將這條連接轉(zhuǎn)發(fā)到目標(biāo)主機(jī)192.168.3.87上
在目標(biāo)主機(jī)192.168.3.87上通過下面命令查看是否建立連接:
$ ps -ef | grep ssh
root 3050 1 0 13:47 ? 00:00:01 ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
三、本地主機(jī)連接目標(biāo)主機(jī)
當(dāng)代理服務(wù)器和目標(biāo)主機(jī)配置好以后,我們就可以使用本地主機(jī)192.168.1.100連接目標(biāo)主機(jī)了,命令如下:
# 通過test用戶登錄到目標(biāo)主機(jī)
$ ssh -p 10022 test@47.55.38.19
需要注意的是:test是目標(biāo)主機(jī)192.168.3.87的用戶,而不是代理服務(wù)器的用戶,代理服務(wù)器只是做了一個(gè)ssh轉(zhuǎn)發(fā)。所以,我們登錄時(shí)的密碼或者無密碼登錄,都與目標(biāo)主機(jī)配套的。
遇到問題
1、登錄時(shí)超時(shí)了,沒任何反應(yīng)
這是因?yàn)槲覄傞_始配置時(shí),沒有在阿里云上開啟10022端口。
2、ssh: connect to host 47.55.38.19 port 10022: Connection refused
這是因?yàn)槲覀儧]配置好ssh,編輯/etc/ssh/sshd_config文件,將GatewayPorts設(shè)置為yes,并且重啟ssh
service ssh reload
然后在目標(biāo)機(jī)192.168.1.100上,關(guān)閉以前的轉(zhuǎn)發(fā),重新開啟新的。
$ ps -ef | grep ssh
rooot 3050 1 0 13:47 ? 00:00:01 ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
# 關(guān)閉以前連接
$ kill -9 3050
# 開啟新的連接
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
ssh轉(zhuǎn)發(fā)命令知識點(diǎn)
命令如下:
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
各個(gè)選項(xiàng)參數(shù)作用如下:
- -T 不分配偽終端;
- -f 使 ssh 進(jìn)程在用戶輸入密碼之后轉(zhuǎn)入后臺運(yùn)行;
- -N 不執(zhí)行遠(yuǎn)程指令,即代理服務(wù)器不需執(zhí)行指令,只作端口轉(zhuǎn)發(fā);
- -g 允許代理服務(wù)器連接到本地轉(zhuǎn)發(fā)端口;
- -R 將代理服務(wù)器指定端口上的連接轉(zhuǎn)發(fā)到本機(jī)端口;
-
root@47.55.38.19
表示使用代理服務(wù)器47.55.38.19的用戶root 來連接; -
:10022:127.0.0.1:22
表示本機(jī)回環(huán)接口(127.0.0.1,也可使用本機(jī)其他網(wǎng)絡(luò)接口的地址,比如以太網(wǎng) IP 或 WiFi IP)的 22 端口連接到遠(yuǎn)程主機(jī)的 10022 接口,因遠(yuǎn)程主機(jī) 10022 綁定的地址為空,所以遠(yuǎn)程主機(jī)會監(jiān)聽其所有網(wǎng)絡(luò)接口的 10022 端口。