最近,由于新冠肺炎影响,我们都在家办公。但是,小伙伴需要本地电脑访问我家里局域网内的数据服务器,刚开始我们使用了teamviewer,但感觉不是很安全,于是我们研究了下通过ssh隧道穿越来进行访问。
如下图所示,我们的需求是本地主机192.168.1.100能通过ssh远程登录另一个局域网下的目标主机192.168.3.87,为了达到这个目标,我们需要一个拥有公网ip的代理服务器47.55.38.19,来做ssh的端口转发。
下面,我们分别对代理服务器、目标主机和本地主机进行配置。
一、配置代理服务器
1、开放端口
代理服务器我用的是阿里云服务器,后面我会用到端口10022进行转发,所以需要在阿里云上开放这个端口,进入安全组,添加一条访问规则,如下所示:
2、修改ssh配置文件
编辑/etc/ssh/sshd_config文件
$ vim /etc/ssh/sshd_config
在sshd_config中添加一条配置,打开转发功能,如下:
GatewayPorts yes
wq保存好以后,重启ssh
service ssh reload
二、配置目标主机
非常简单,执行下面命令就行了
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
这条命令的作用是:
- 建立一条ssh连接,目标主机192.168.3.87连接上代理服务器47.55.38.19
- 如果有其他ssh客户端连接到代理服务器47.55.38.19的10022端口上时,则代理服务器会将这条连接转发到目标主机192.168.3.87上
在目标主机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
三、本地主机连接目标主机
当代理服务器和目标主机配置好以后,我们就可以使用本地主机192.168.1.100连接目标主机了,命令如下:
# 通过test用户登录到目标主机
$ ssh -p 10022 test@47.55.38.19
需要注意的是:test
是目标主机192.168.3.87的用户,而不是代理服务器的用户,代理服务器只是做了一个ssh转发。所以,我们登录时的密码或者无密码登录,都与目标主机配套的。
遇到问题
1、登录时超时了,没任何反应
这是因为我刚开始配置时,没有在阿里云上开启10022端口。
2、ssh: connect to host 47.55.38.19 port 10022: Connection refused
这是因为我们没配置好ssh,编辑/etc/ssh/sshd_config文件,将GatewayPorts设置为yes,并且重启ssh
service ssh reload
然后在目标机192.168.1.100上,关闭以前的转发,重新开启新的。
$ 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
# 关闭以前连接
$ kill -9 3050
# 开启新的连接
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
ssh转发命令知识点
命令如下:
$ ssh -T -f -N -g -R :10022:127.0.0.1:22 root@47.55.38.19
各个选项参数作用如下:
- -T 不分配伪终端;
- -f 使 ssh 进程在用户输入密码之后转入后台运行;
- -N 不执行远程指令,即代理服务器不需执行指令,只作端口转发;
- -g 允许代理服务器连接到本地转发端口;
- -R 将代理服务器指定端口上的连接转发到本机端口;
-
root@47.55.38.19
表示使用代理服务器47.55.38.19的用户root 来连接; -
:10022:127.0.0.1:22
表示本机回环接口(127.0.0.1,也可使用本机其他网络接口的地址,比如以太网 IP 或 WiFi IP)的 22 端口连接到远程主机的 10022 接口,因远程主机 10022 绑定的地址为空,所以远程主机会监听其所有网络接口的 10022 端口。