利用ssh与局域网内主机建立远程连接实现局域网穿透

来源:互联网 发布:舰娘国服 知乎 编辑:程序博客网 时间:2024/06/08 09:46

  公司新开发的项目,利用嵌入式linux系统,要求其中的软件能够支持远程升级,个人感觉如果能实现远程操作会更方便一些,于是在网上搜寻方法,当时的想法是希望能够找到一种ssh代理服务,能够实现两台不同局域网内电脑可以通过ssh代理服务器建立远程连接,可以保证数据的加密性。


  后来在网上找了很多资料,发现找不到这种代理服务,但是同时也发现了另一种解决办法:ssh端口转发,其实我感觉就类似于ssh代理服务了,而且利用这种方法还可以翻墙!不过这是另一篇文了,没想到ssh这么强大。。。


  下面简述这种连接方式的工作流程,先做一些假设规定:

     1、我目前使用的公司局域网内电脑称作电脑A。

     2、需要连接到的远程嵌入式linux系统称作电脑B,由于用的3G网络,所以IP地址是不固定的。

     3、ssh端口转发服务器,称作电脑S,要有固定的外网IP地址,现在很多云服务器可以选择,而且有很多免费

           的,你也可以申请个域名绑定上,省的记IP地址。。。

     4、我有服务器S的某个用户(称作user)的私钥,称作user_rsa,没有密码的。


   正常情况下,我只要利用S_rsa,在A或者B的终端,输入:ssh -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -o ServerAliveInterval=300 -o ServerAliveCountMax=2 -i S_rsa user@S 就可以与服务器S建立ssh连接,注意上面命令-o选项是为了实现第一次建立连接时避免人工交互,并且会定期发送数据到服务器以保持连接,检测是否掉线,确保可以正常连接后,往下进行。。。


   下面直接给出本流程中需要用到的ssh命令,假设我要用公司电脑A连接远程电脑B,

    那么下面的命令就在B上执行:

     ssh -C -f -N -R listen_port:DST_Host:DST_port user@Remote_Host

    命令参数解释:

     -R  将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口

    -C  压缩数据传输

    -f   后台认证用户/密码,通常和-N连用,不用登录到远程主机

    listen_port:  远程主机S上的某个端口

    DST_Host:  B的IP地址,一般是127.0.0.1

    DST_port:  B 的端口号,一般是22

    user:  服务器S的用户名

    Remote_Host:服务器的IP地址或者域名


比如我在B电脑上执行:ssh -C -f -N -R 7001:127.0.0.1:22 user@Remote_Host

就是说,要服务器S监听端口7001,任何发送这个端口的数据都会转发到我的B电脑的22号端口上。


这样,我只要在A电脑上通过ssh进入服务器S,然后执行:ssh -p 7001 root@localhost 就可以操作B电脑了,要注意命令中root为B电脑的用户名,localhost表明与自己的端口7001建立连接,因为7001已经映射到B电脑的22号端口上,所以就相当于直接用A电脑连接了B电脑。


结合上述,实际使用中可能是如下的命令:

 B电脑上执行:

ssh -o StrictHostKeyChecking=no -o TCPKeepAlive=yes -o \
ServerAliveInterval=300 -o ServerAliveCountMax=2 \
-i 秘钥文件 -C -f -N -R 7001:127.0.0.1:22 user@Remote_Host

建立监听。


A电脑上执行:

ssh -i 秘钥文件 user@Remote_Host

连接服务器S。


然后在S上执行:

ssh -i 秘钥文件 -p 7001 root@localhost

连接B电脑。

  


上面是实际使用时的流程,但是想要时刻能用A电脑连接B电脑,可能还要一些判断B电脑掉线之类的脚本,下面是我自己的脚本,放到电脑B上,开机自动执行(之前没用过shell脚本,乱写的):

 

#!/bin/sh

exit=1

while test $exit -eq 1
do
        if test $(ps | grep -c 'ssh.*-o StrictHostKeyChecking=no') -eq 1;then
                 /usr/local/bin/ssh -v -o StrictHostKeyChecking=no -o TCPKeepAlive=yes \
-o ServerAliveInterval=120 -o ServerAliveCountMax=2 \
-i /etc/init.d/joyo_rsa -C -f -N -R 10001:127.0.0.1:22 joyo@aws.xiezhaoxuan.top
        fi
        sleep 60
done

  

实际测试时,有可能服务器正在监听某个端口,然后脚本又运行一次,让服务器监听同样的端口,这种情况下还是会建立ssh连接,但是服务器会返回监听端口失败,这时可以选择性的结束服务器上的ssh进程。


  2017.12.12更新:

   重新修改编译了sshd服务端的源码,实现了可以选择性的允许哪些客户端建立连接,减小的服务器端的压力,详情请见下面连接:http://www.xiezhaoxuan.top/blog/6/


 

原创粉丝点击