linux通过ssh实现反向连接

来源:互联网 发布:c语言数据结构教程 编辑:程序博客网 时间:2024/05/18 00:46

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参数可以指定密码,所以只要写个批处理:

:1plink -pw “password” -D 7070 user@serveripgoto 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/bashwhile [ '' == '' ]dossh_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 &fisleep 300done

执行这个脚本就可以了。sleep 300代表300秒查看一次,可以根据需要调整。

5.3.如果设备A重新启动了,则只需要重新配置设备A即可。

1 0
原创粉丝点击