当前位置:   article > 正文

简单几步实现内网穿透

内网穿透

场景

为了避免阐述过多理论,我们直接从需求场景入手,来了解一下为什么需要内网穿透

小明是少数派的一位咕咕作者,在家里电脑稿某文稿了一半,到公司后打算摸鱼继续稿,怎么办呢(此处假定他没有使用任何云同步软件,也不会使用git,就算会用他也忘了提交)?

此时,小明想通过ssh等远程访问设备文件的方式来下载家里那半稿子,但他的家庭网络是没有分配公网IP的,无法通过互联网直连。内网穿透就这样派上用场了。

所以通俗地讲,内网穿透就是要将流量从公网穿透到内网,让内网设备也能通过公网访问,帮助小明在公司访问家里电脑的文件。

设施

内网穿透的核心思想就是“映射”和“转发”,把内网设备的端口映射到公网设备的端口上,来进行流量转发。

在这里插入图片描述

简单地画一下示意图如上,基础设施由两个核心设备组成:

服务端:拥有公网IP的设备一台,即上图“公网服务器”,开放2个端口7000和6000,用于公网通信。

客户端:要访问的内网设备一台,即上图"内网家用电脑",开放实际应用服务所需的端口(比如ssh服务,默认22端口),并将配置的公网映射端口6000告知服务端。所以服务端开放的那个端口6000实际上是客户端告诉它的。

(以上端口除22以外均为自定义端口,无特殊含义。)

基础设施搭建好以后,小明在公司通过ssh远程访问自家电脑的命令便如下:

# 假定服务器公网IP是119.23.141.248,内网家用电脑用户名是test
ssh -oPort=6000 test@119.23.141.248
  • 1
  • 2

这就是我们想达到内网穿透的预期效果——表面上看,家庭内网的电脑就像拥有了公网IP一样暴露在互联网中。

实现

要实现这种基础的内网穿透,一般是以一台带公网IP的服务器作为中转(暂不讨论点对点的)。开源世界中已经有很多较为成熟的工具,接下来就直接以frp为例,简单几步部署就可以搞定啦!

安装

先在官方发布仓库下载对应包,几种常用架构:

如果GitHub访问困难,可以从我的网盘下载:frp-v0.4.2

解压后会发现里面既有frps也有frpc(Windows版本的可执行程序是exe),前者表示Server(服务端),后者表示Client(客户端),对应同名配置文件frps.inifrpc.ini,对于某一端只会用到其中一套程序。

配置

这里参考官方文档介绍两种比较实用的配置,ssh服务和文件访问服务。

一、通过 SSH 访问内网机器

解压对应架构的包到服务端,并修改frps.ini文件,设置端口7000,当然你可以自定义为任意端口,只要不和系统上已有端口冲突即可:

[common]
bind_port = 7000
  • 1
  • 2

启动服务端frp(-c参数表示config):

./frps -c ./frps.ini
  • 1

同理,解压包到客户端,并修改frpc.ini文件,在common标签下填入公网服务器的IP和端口(对应服务端设置的端口)。然后设置好ssh服务的远程端口6000即可(local_ip和port一般不用改)。

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

启动客户端frp:

./frpc -c ./frpc.ini
  • 1

不出意外的话,客户端的终端会提示你登录服务端成功。

然后在任意一个设备上即可通过公网访问内网设备(即客户端frp所在的那台):

ssh -oPort=6000 你的系统登录用户名@x.x.x.x
  • 1

二、对外提供简单的文件访问服务

如果我们想通过浏览器直接访问内网设备上的文件,就这样配置客户端(此处以Windows为例),不用改服务端:

[common]
server_addr = x.x.x.x
server_port = 7000

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

[c_static_file]
type = tcp
remote_port = 6001
plugin = static_file
plugin_local_path = C:
plugin_strip_prefix = driver_c
plugin_http_user = 自定义名称,这个和系统登录的用户名不是一个东西,随便写就行
plugin_http_passwd = 自定义密码

[d_static_file]
type = tcp
remote_port = 6002
plugin = static_file
plugin_local_path = D:
plugin_strip_prefix = driver_d
plugin_http_user = 自定义名称,同上
plugin_http_passwd = 自定义密码
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

我们在上文已配置好ssh的基础上,追加两个文件访问配置c_static_file和d_static_file,这两个标签名字也是自定义的;static_file是文件访问服务的客户端插件名称,这个是固定的;plugin_local_path = C:表示可访问整个C盘,对应下面的是D盘;driver_c和driver_d这两个前缀也是自定义的,便于等会儿在浏览器访问。

修改配置文件后,重新启动客户端frp:

frpc.exe -c frpc.ini
  • 1

启动成功后,就可以在浏览器直接访问啦:http://x.x.x.x:6001/driver_c/,访问的时候提示你输入用户名和密码就是上面配置的plugin_http_user和passwd。

(不容易注意到的小坑:地址末尾的斜杠/必须填,否则访问不了)

末了

在测试的时候,我的公网服务器是在腾讯云上,默认有防火墙规则,所以要记得在后台配置放开相应的端口访问(比如上述的7000和6000)。另外,文中有个小彩蛋,不知道有没有人发现哈哈!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/330423
推荐阅读
相关标签
  

闽ICP备14008679号