红联Linux门户
Linux帮助

linux通过ssh实现反向连接

发布时间:2016-08-05 11:06:36来源:linux网站作者:jiwLiu
1.问题描述:
有时,我们会想在局域网外访问局域网内的机器。这时,我们可以使用SSH的反向连接来实现。
设备A:位于局域网内,可以访问代理服务器B。 假设该设备IP:A.A.A.A,用户名userA
设备B:位于局域网外,作为访问设备A的代理服务器,不可访问A。假设该设备IP:B.B.B.B,用户名userB
设备C:想要访问A的设备,可以访问B,无法直接访问A。假设该设备IP:C.C.C.C,用户名userC
 
2.目标:设备C可以通过SSH访问局域网内设备C
 
3.条件:
三台设备都需要包含SSH客户端,A,B设备需要包含SSH服务端。
 
4.实现步骤:
4.1.在A设备上建立A设备到B设备的反向代理:
ssh -fCNR  <port_b1>:localhost:22 userB@B.B.B.B 
例如:ssh -fCNR  10000:localhost:22 userB@B.B.B.B (此时B设备上已经可以通过ssh -p 10000 userA@localhost连接到设备A)
<port_b1>:建立在B机器上,用来代理设备A机器22端口的端口。
userB@B.B.B.B :B机器的用户名和IP地址。
4.2.在B设备上建立B设备到A设备的正向代理:(这样做的目的是为了实现和外网的通信)
ssh -fCNL  *:<port_b2>:localhost:<port_b1>  userB@localhost
例如:ssh -fCNL  *:10001:localhost:10000 userB@localhost
<port_b2>:用作本地转发的端口,用来和外网通信,并将数据转发到<port_b1>,实现从其他机器可以访问。
*代表可以接受来自任意机器的访问。
4.3.现在C机器上可以通过B机器SSH到A机器
ssh -p<port_b2> userA@B.B.B.B
 
5.注意事项
5.1.参数介绍
-f 后台运行-C 允许压缩数据-N 不执行任何命令-R 将端口绑定到远程服务器,反向代理-L 将端口绑定到本地客户端,正向代理
5.2.自动连接和防断线脚本
如果你想让连接长期保持,可以写个脚本来保证因为网络原因断线的话可以自动重连。
先说Windows平台,用plink -pw参数可以指定密码,所以只要写个批处理:
:1  
plink -pw “password” -D 7070 user@serverip  
goto 1  
这样应该就可以解决大多数问题造成的断线。
Linux平台ssh默认不支持把密码作为参数,不过有sshpass可以搞定:
http://sourceforge.net/projects/sshpass/files/latest/download
下载,解压,编译,把可执行文件拷贝到合适的目录,执行命令格式如下:
sshpass -p "password" ssh -D <port> user@serverip
貌似ubuntu下可以直接apt-get install sshpass
编写脚本autossh.sh,内容如下:
#!/bin/bash  
while [ '' == '' ]  
do  
ssh_d_process_num=`ps aux|grep -E 'ssh \-' |grep -v grep |wc -l`  
if [ "$ssh_d_process_num" == "0" ]; then  
/home/user/sshpass -p "password" ssh -D 7070 user@ServerIP &  
fi  
sleep 300  
done  
执行这个脚本就可以了。sleep 300代表300秒查看一次,可以根据需要调整。
5.3.如果设备A重新启动了,则只需要重新配置设备A即可。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/23015.html