利用autossh是实现内网穿透

一、概述:

内网穿透,说白了就是实现让外网的机器访问位于局域网中的服务器。

公网机器

  域名:wwggzp.com,root用户,

局域网机器

  服务端口:8206,root用户

 

二、原理与思路:

要做到内网穿透,首先要有一台公网的服务器,负责反向代理,这里我们称为服务器B。然后还有一台处于局域网的真正负责处理请求的目标服务器,这里我们称为服务器A。     大概思路其实很简单,我们的目标服务器A无法被外网的机器访问,那么就借助我们的公网服务器B。B将请求转发到A,便实现了对处于内网中的服务器A的访问。

我们将用ssh来实现这个功能,大概原理就是利用ssh在A,B服务器之间构成一条通路,然后利用这个通路实现端口的转发。           

这里例子用的服务器都是Linux,我用的是centos7,这个版本的Linux是自带了ssh的,所以不用安装。

 

三、用基本的ssh实现:

首先介绍两个命令:

反向代理

ssh -fCNR

正向代理

ssh -fCNL
-f 后台执行ssh指令
-C 允许压缩数据
-N 不执行远程指令
-R 将远程主机(服务器)的某个端口转发到本地端指定机器的指定端口
-L 将本地机(客户机)的某个端口转发到远端指定机器的指定端口
-p 指定远程主机的端口

******************区分大小写啊各位亲******************

(上面这两段是从博客:https://www.cnblogs.com/kwongtai/p/6903420.htmlcopy来的)

这个反向代理,就是请求到达远程主机的指定端口后,转发到本地的指定端口;正向代理,就是请求是到达本机的,对于本机中指定的端口的请求,转发到远端机器的特定端口。 这里我们主要用到反向代理的命令:

ssh -fCNR [B机器IP或省略]:[B机器端口]:[A机器的IP]:[A机器端口] [登陆B机器的用户名@服务器IP]

首先要在内网的机器上用这个命令,因为外网的机器是无法访问内网的嘛,所以要局域网的服务器主动发起请求。

ssh -p 22 -fCNR *:8206:127.0.0.1:8206 root @wwggzp.com

然后解释一下这个命令,首先,ssh -p 22,是建立一个ssh连接,与远程机器的22端口。因为一般ssh服务器默认监听的端口都是22.

然后fCNR就是我们刚刚说的远程端口的转发命令,也就是反向代理。翻译过来就是,远程机器中的8206端口上收到的请求,都给我转发到现在本机的8206端口来。 后面root是登录远程机器的用户名,@后面跟着的是远程机器的ip地址。

这段命令其实就是,内网目标机器A作为ssh的客户端,公网服务器B作为ssh的服务端,建立了一个ssh的连接。然后-R命令让公网服务器B的sshd监听了8206端口,一旦有请求就转发到内网机器A的8206端口。

 

这里也补充一个正向代理的例子:(和本文内网穿透的例子没什么关系)

如果是正向代理,或者说是本地转发的命令:

ssh -fCNL [A机器IP或省略]:[A机器端口]:[B机器的IP]:[B机器端口] [登陆B机器的用户名@B机器的IP]
ssh -fCNL *:1234:localhost:7280 localhost

上面这个代码的意思就是,现在我台机器是服务器,到达所有ip对我现在这部机子1234端口的访问,都给我转发到我这台机子的7280端口处。

总之不管是-fCNL还是-fCNR,可以这样简单地理解:位于命令左边的端口,是真正接收请求的端口,像我们上面这个-fCNL例子的1234端口;而位于命令右边的端口,是要转发过去的端口,像上面-fCNL例子中的7280端口。

 

 

好的,做好了反向代理后,我们就可以访问我们内网的机器了。通过www.wwggzp.com:8206便可以访问到局域网的那个机器了。

 

 

这里顺便总结一下几个概念:

  正向代理:像是个跳板机,代替你访问某台机器,像是你没办法访问google,然后你知道一台正向代理服务器,然后先访问正向代理服务器,然后这个代理服务器帮你访问Google。  正向代理可以用来:(1)访问原来无法访问的资源,如google(2) 可以做缓存,加速访问资源(3)对客户端访问授权,上网进行认证(4)代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

  反向代理:客户端是感觉不到的。像是个服务器的替身,它假装成是你要访问的服务器,接收到请求后,又把请求转发给真正的服务器。就像我们这篇文章中的内网穿透的例子一样,公网服务器B就是个替身。

  ssh的本地转发:接收请求的端口在本地,监听本地的某个端口,收到请求后把它转到别的地方。

  ssh的远程转发:接收请求的端口在远程机器上,远程机器上的sshd会监听接收请求的端口,然后把这个端口收到的请求转发到别的地方。

 

 

四、 利用autossh实现内网穿透(反向代理):

但是,用这种基本的ssh实现的反向代理是不稳定的,可能随时断开。而且因为端口转发的这个功能是ssh协议提供的,而且只能是建立ssh连接的时候指定转发端口,不能说在已经有的连接上新增转发端口。也就是说,这个不稳定的ssh连接,一旦断了的话,就会没有这个反向代理了。

而且,上面这种连接方式,每次ssh连接多要输入远程机器的登录密码,很麻烦。

 

所以,我们采用autossh这个工具。下面直接说做法:

一、前提条件:

B服务器,具有公网ip

A服务器,局域网中,目的服务器。

在A和B服务器中安装ssh:yum install ssh(centos7似乎默认就有安装了)

 

二、在B服务器中(公网服务器):

首先在A服务器上编辑sshd的配置文件/etc/ssh/sshd_config(也可以使用find / -name sshd_config查看具体路径),将GatewayPorts 开关打开:

  1,将GatewayPorts no

  改为:GatewayPorts yes

  2,重启sshd:
  systemctl restart sshd

三、在A服务器中(局域网中的目标服务器):

一样,要内网穿透,做到反向代理,首先要内网中的机器主动联系公网的服务器。

刚刚在ssh连接的时候,不是要输入密码吗,这里我们就用ssh的密钥公钥来解决这个问题。

 

1.配置免密码登录,在A服务器中生成公钥,并送到公网服务器B中。

# ssh-keygen -t rsa    #连续三次回车,即在本地生成了公钥和私钥,不要设置密码
# ssh-copy-id -p 22 -i ~/.ssh/id_rsa.pub root@220.126.67.120

 

第一个命令是生成公钥和私钥的

第二个命令是将生成的公钥送到目标服务器中,成为目标服务器的信任机器(可以这样理解)。然后-p 22是说ssh连接的远程机器的端口号,用sshd默认的监听端口22.      然后-i 是指定公钥文件。root是远程机器的登录账号,@后面的号码是远程机器的ip地址。

这个~/.是路径的开头,~/  是主目录,如果是root登录的话就是/root/,  .     这个点是显示隐藏目录的意思。

 

2.配置autossh:

前面说过嘛,普通的ssh不稳定,可能随时断掉。所以这里我们用个工具:autossh。在centos中,autossh需要自己编译安装,步骤如下:

# wget http://www.harding.motd.ca/autossh/autossh-1.4e.tgz

# tar -xf autossh-1.4e.tgz

# cd autossh-1.4e

# ./configure

# make

# make install

 

 

3.内网穿透,配置反向代理:

首先,这个autossh命令其实是和普通的ssh可以理解成是一样的,只是它提供稳定的连接。所以我们像刚才一样用远程转发的命令:

autossh -p 22 -M 6715 -fCNR *:8206:127.0.0.1:8206 root@wwggzp.com

 

嗯来解释一下这个命令,-p 22——要建立的ssh连接中远程机器对应的端口号。

-M 6715——这个参数指定一个端口,这个端口是外网的B机器用来接收内网A机器的信息,如果隧道不正常而返回给A机器让他实现重新连接。autossh本身在后台运行,这个参数与端口转发是无关的。(记得要使用1024-65535端口)

- fCNR    ——远程转发,注意CNR是大写。

然后后面第一组ip和端口是远程机器上,真正接收请求的端口,也是要远程机器的sshd监听的端口。第一组的ip一般可以省略,也可以像这里用*,代表所有请求。例子中对应的就是:   *:8206

第二组ip是要将远程机器上的端口转发到哪里?这里是本地ip+端口     127.0.0.1:8206

两组信息也用”:“来连接。

然后root和@后面的信息和之前的一样。

好的现在这个翻译这个命令就是,建立一条ssh连接到机器wwggzp.com的22端口,用root用户登录(之前配过公钥所以不用密码了),然后指定远程机器中的(B外网服务器)的6715端口来监听这个ssh连接的信息,如果这个连接异常或者说是断了,就告诉clien重新连接。然后这个ssh连接还让ssh的目标服务器(远程的公网服务器B)监听它的8206端口,如果有请求来了后,就把这个请求转发到本机(局域网,用户真正要访问的目标机器A)的8206端口上。

 

好的,这样就实现了比较稳定的反向代理也就是内网穿透了。现在用http://www.wwggzp.com:8206便可以访问到局域网中那台目标机器了。

 

然后其实还可以配置这个autossh在开机的时候自动启动,但我这里只是起着测试而且这个局域网服务器不怎么关机,所以就没设了,需要的话可以自行度娘。

 

 

本文的参考博客:

https://blog.csdn.net/kunzai6/article/details/81116999

https://www.cnblogs.com/kwongtai/p/6903420.html

https://www.cnblogs.com/weifeng1463/p/6805624.html

 

posted @ 2018-07-23 15:14  汪神  阅读(1663)  评论(0编辑  收藏  举报