本文最后更新于:2020年10月7日 晚上

最近实验室给我分配了服务器账号,但该服务器的ip在实验室的局域网中,不是公网ip,无法在宿舍(外网)访问该服务器(但是该服务器可以访问公网)。我希望能在公网访问到实验室的服务器,于是学习配置了ssh远程端口转发(内网穿透),使用ssh -R可以轻松做到这个事情。在实现过程中遇到了很多坑,特此总结记录一下。

背景:一台服务器A(位于内网)、一台云虚拟主机B(有公网ip,外网可访问)。

目的:实现从外网访问服务器A。

配置反向端口转发

ssh -R命令的用法:ssh -R 远程地址:远程端口:目标地址:目标端口 user_name@ssh服务器

ssh -R HostC:PortC:HostB:PortB user@HostC

将本机可以访问到的HostB:PortB转发到 HostC的PortC端口,其中第一个HostC可以省略。

例如:我想将本机的22端口映射到远程云主机的8888端口,则执行如下命令:

ssh -N -R 8888:localhost:22 root@htx1998.cn

其中 -R:反向端口转发; -N :不执行远程命令,只做端口转发; -f 表示在后台运行;

在服务器A上执行上述命令后,就成功的将服务器A的22端口(用于ssh访问)反向转发到了htx1998.cn的8888端口,只要保持这个ssh不断,任何一台机器就能以htx1998.cn为跳板,通过ssh serveruser@htx1998.cn -p 8888 来连接到服务器A的22端口。

不过这样做可能并不稳定,若网络存在波动导致ssh -R的连接终端,则会失去控制。有个叫autossh的软件,可以自动的检测断线,并在断线的时候重连。

安装 autossh :

sudo apt-get install autossh

安装完后,使用autossh代替ssh重新执行上述命令

autossh -NfR 8888:localhost:22 root@htx1998.cn

这里需要注意,由于使用-f 参数使该命令后台运行,导致无法输入远程云主机的密码,故需要配置公钥访问(详见后文)。

最终,在踩完下文的坑后,执行上述命令即可实现从外网以ssh serveruser@htx1998.cn -p 8888访问服务器A。

坑:打开ssh隧道 应监听0.0.0.0,而不是127.0.0.1

在配置完反向端口转发后,发现在外网不能访问8888端口,查看云虚拟主机的防火墙配置,已经添加了8888端口的规则,依然提示connection refused。但登录云主机后,可以使用localhost:8888登录到服务器A,这就说明端口转发已经起作用了!

netstat -anop | grep 8888

tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 1069/sshd: root off (0.00/0/0)

通过以上命令查看,发现8888端口是监听在127.0.0.1本地回环网卡上的,只能在本地服务器访问,无法从外部访问。需要将8888端口的监听地址设为0.0.0.0才行。

修改vim /etc/ssh/sshd_config (在外网服务器配置)
添加GatewayPorts yes
service sshd restart即可

配置公钥访问服务器:

在客户端用ssh-keygen -t rsa 生成公钥和私钥,一路回车,保存在root/.ssh/

scp id_rsa.pub root@server:/root 把公钥上传到服务器

cat id_rsa.pub >>/root/.ssh/authorized_keys 将上传的公钥追加到authorized_keys的末尾
chmod 600 authorized_keys 更改权限

至此,实现免密码登录

常用命令:

netstat -aptn :查看当前开放的端口

lsof -i:8888 :查看端口占用状态

netstat -anop | grep 8888 :看8888端口是否监听

iptables —list :看是否有系统防火墙限制

telnet ip port :测试远程服务器端口是否开启

ps -aux | grep 8888 :查看含有8888的进程

参考文献:

https://blog.csdn.net/autoliuweijie/article/details/80283689

https://zhuanlan.zhihu.com/p/57630633

https://blog.csdn.net/u012911347/article/details/80765894

https://blog.csdn.net/qm5132/article/details/83039405

https://www.jianshu.com/p/7f5f727a2b60

https://blog.csdn.net/dreams_deng/article/details/78968416

https://www.cnblogs.com/ddif/p/9940571.html

https://blog.csdn.net/Lin_QC/article/details/91570316