外网访问内网的解决方案--反向SSH

问题:

    当你在不在公司或者不在学校的时候,如果想要访问内网的服务器,但是内网IP对外网是不可见的,这时怎么办?

原理:

    之所以很多转发的方法无法应用在这里,就是因为内网主机对外网其实是不可见的,也就是说外部主机不能用一般的方法访问到内部主机。那么我们就想了,能不能用内网主机找外网主机,找到之后再把这条内网主机登陆外网的信道转换成外网主机登陆内网的信道呢?幸运的是,这个方法的确是可行的,这也就是所谓反向ssh最通俗的理解,这就像寄信一样,”虽然我不知道你的地址,但是你知道我的地址,那么你就先给我写封信,告诉我你的地址,然后我不就可以回信给你了么?“。

操作步骤:

     由于我们自己使用的电脑未必有外网ip,因此我们需要一个有固定外网ip的服务器(随便搞个腾讯云阿里云的小机子就行),然后用这台服务器与内网的机子进行通信,我们到时候要先登陆自己的服务器,然后再利用这个服务器去访问内网的主机。
(1)、准备好有固定ip的服务器A,以及待访问的内网机器B。两者都开着sshd服务,端口号默认都是22。顺便做好ssh免密码登陆。
(2)、在内网主机B执行以下命令:
        $ ssh -NfR 1111:localhost:22 username@IP -p 22
    这条命令的意思是在后台执行(-f),不实际连接而是做port forwarding(-N),做反向ssh(-R),将远程服务器的1111端口映射成连接本机(B)与该服务器的反向ssh的端口。username是你登录服务器A的用户名,IP是服务器A的IP,然后输入登录服务器A的密码即可。
执行完这条命令,我们可以在服务器A上看到他的1111端口已经开始监听:
    $ ss -ant |grep 1111
   LISTEN  0  128    127.0.0.1:1111      *:*
(3)、在上面的操作中,这个1111端口就已经映射成了内网主机B的22端口了,现在我们只要ssh到自己的这个端口就行了。首先用secureCRT登录服务器A,然后在服务器A中执行:
       $ ssh username@localhost -p1111
这样就成功的登陆了内网的主机了。

可能会遇到报错: WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

处理方式:
       #vim ~/.ssh/known_hosts
    然后删除和你想要登录的IP相关的信息,或者全部删除也行。
为什么?
   第一次连接时,server将已经生成的公钥(已存放在本地)发送给连接方,连接方没有相应的私钥。server重装之后,生成的公钥发生了变化。连接方存放的还是曾经的公钥。因此公钥不匹配。即认同为server身份已变。解决方法是将原来的公钥给删除了,也就是一切重头再来。又開始了第一次的工作。 

参考:https://www.cnblogs.com/mengfanrong/p/5096590.html
          https://m.jb51.net/article/112524.htm

猜你喜欢

转载自blog.csdn.net/mou_it/article/details/80441501