转发sshd简单的内网穿透方案,在原文基础上添加如下说明:
1、外网服务器上需要开启GatewayPorts,命令:
- vim /etc/ssh/sshd_config
-
-
- GatewayPorts yes
2、使用root用户登录外网服务器,外网端口需要大于1024,参考:https://unix.stackexchange.com/questions/41451/how-can-i-set-up-a-remote-port-forward-on-port-80-to-my-localhost-with-the-help
原文如下:
内网穿透系列——SSH反向隧道 (最简单的内网穿透方案)
一.介绍
前面介绍了ngrok和frp,虽然好用,但是对于某些很简单的需求来说可能也麻烦了,最好有啥能一键搞定的,这种情况下,你可能需要SSH反向连接了。
当然,由于SSH的特殊性,建议使用的服务器为国内服务器,以减小特殊干扰和网络波动导致的可能的瞎几把断线。
二.配置
这个对于Linux服务器来说,肯定有ssh对吧,没有你怎么连接的???所以我们也不考虑服务器需要安装点啥了,当然为了防止断线的情况,我们还是要装个程序滴,这个后面说。
①如果你本地也是Linux,或者装了比如Git啊Cygwin啥的,那么你本地就能直接执行ssh命令了,在这种情况下,一键(建议先不加-f参数来确认能否连上)
1 2 3 4 5 6 7 | ssh -fCNR 远程IP:远程端口:客户端能访问的IP:对应的端口 ssh用户名@ssh服务器 -p ssh端口
#参数说明 f:后台运行 C:启用gzip压缩 N:仅转发端口,不执行命令 R:反向代理 |
那个客户端能访问的IP我说明下,可以是本地比如localhost,也可以是局域网IP,甚至可以是你本地所能访问到的其它的IP,这种可能出现在多层局域网内,比如公司啥的,而远程IP可以省略其实,如果需要开放给公网请使用远程服务器的公网IP,另外-p指定ssh端口的参数默认是22,如果你是22的话可以省略,如果你用的不是密码的话请使用 -i 参数来指定key文件
举个最简单的栗子
1 | ssh -fCNR 2222:localhost:22 root@1.2.3.4 |
这样就把本地的22端口暴露到的你服务器1.2.3.4的2222端口
当然,这儿有个问题,之前说了ssh本身还是挺容易受到干扰的,那么要是断开了怎么办?我们首先要解决的是密码问题,ssh命令默认不能添加密码参数,所以我们需要借助sshpass程序
1 | yum install sshpass -y |
使用方法很简单,在原来的ssh命令之前添加sshpass命令就行,类似如下
1 | sshpass -p "ssh密码" ssh -fCNR 2222:localhost:22 root@1.2.3.4 |
当然我还是建议使用key来验证的,安全还方便,教程在我博客里也有——>传送门
下面是自动连接,这个需要靠autossh程序
1 | yum install autossh -y |
使用的话和ssh命令相比略有变化,因为后台参数-f在这儿是由autossh处理的,而不是ssh,所以要拆开来放前面,而为了监控掉线,多了个-M参数,后面跟的是监控端口,由于判断掉线,不被占用就行
1 | autossh -M 5678 -f -CNR 2222:localhost:22 root@1.2.3.4 |
那么,如果要合并起来,是否放一起就行?答案是错,如果你使用了sshpass,那么你的autossh不能加-f参数,因为sshpass需要autossh在前台请求密码才能实现输入,这点和expect差不多,而加上-f参数放后台后会无效,所以如果要使用sshpass请务必不要加-f参数,当然,我是推荐你单使用autossh然后配合-i参数来用key认证的
如果非要sshpass,那么只能如下了,不带-f
1 | sshpass -p "ssh密码" autossh -M 5678 -CNR 2222:localhost:22 root@1.2.3.4 |
然后把这条命令丢到/etc/rc.local中就行了,当然你也可以选择脚本啊或者crontab之类的方法来实现开机启动,这儿我就不多说了
②本地是Windows,那么我们就要借助其它工具了,比如plink,这个是win下的ssh客户端,随便搜一下就有
命令略有变化,这个支持在命令中带密码,而指定端口的参数变成了大写的P,并且没有后台模式,指定key一样是-i
1 | plink.exe -pw "ssh密码" -CNR 2222:localhost:22 root@1.2.3.4 -P 22 |
如果要防断线,那么写个批处理吧,很简单的
1 2 3 4 5 | :1
plink.exe -pw "ssh密码" -CNR 2222:localhost:22 root@1.2.3.4 -P 22
goto 1 |
这样就行