什么是内网穿透?
内网穿透就是让两个不在局域网的网络连接在一起,换句话说,也就是让两个没有什么联系的网络连接在一起。
内网之间本来是不能连接的,我们平时可以看到前后端联调代码的时候,前端人员和后端人员总是需要连接同一个网络,只要连接了同一个网络,就属于一个局域网下,这个时候前后端的两台电脑就可以互相访问了。 如果前后端不在同一个局域网下面,就不能联调代码,这就是因为内网之间是不能互相访问的。另外,内网穿透的时候,需要关闭防火墙,防火墙在我的理解下只是距离自己电脑最近的一层防护,当然也是最坚实的防护。
补充一点,我们买的服务器是公网,不属于内网,我们只用在服务器的后台开放对应的端口就行了,这就是为什么所有人都可以访问服务器ip的原因,至于为什么服务器是公网,这个大家不用管。
什么情况下用到内网穿透?
根据上面的例子,我们知道,只要是两个不在同一局域网的电脑需要连接在一起,就需要内网穿透。举个具体的例子,在开发钉钉机器人的时候,当你@outgoing机器人后,机器人会给你的服务器发送一个Post请求,服务器是公网,所以可以发送成功,你也能接收到,但是有个问题是,你没法调试自己的代码,有些许的不方便。 这个时候,如果你想让钉钉机器人的Post请求发送到自己本地的IDE,但是由于你本地IDE所在的局域网和钉钉的局域网不是同一个,不在同一个局域网下面是无法互相访问的,所以我们需要内网穿透,内网穿透后,我们就以让钉钉官方发送的请求直接发送到我们的本地IDE,我们就可以调试了。
内网穿透所需物品
- 一个运行在本地的Web项目
- 一台服务器(无需域名)
- frp工具
内网穿透的大致思路是通过frp工具,让我们的服务器收到的请求转发到我们的本地IDE
内网穿透具体过程
下载frp
frp是一个工具,在github也是很出名,我们需要下载两份,一份是linux,用在服务器上面,一份是windows上面,用在自己本地windows电脑上面。
服务端配置
一:先确定公网服务端linux系统版本
[root@VM_0_6_centos ~]# getconf LONG_BIT
64
可以看到是64位,所以我们下载的对应frp版本也是64位
二:根据版本确定下载对应的安装包
通过上面的操作,最终我们选择 frp_0.30.0_linux_amd64.tar.gz (说明:FRP V0.30.0 版本 linux 系统 ADM64位操作系统)
下载方式一:通过wget
wget https://github.com/fatedier/frp/releases/download/v0.30.0/frp_0.30.0_linux_amd64.tar.gz && tar xzvf frp_0.30.0_linux_amd64.tar.gz && mv frp_0.30.0_linux_amd64 frp
下载方式二:通过xftp传输
下载地址: Releases · fatedier/frp (github.com)
下载完成后通过xftp传输到服务器,然后再解压即可。
我们解压完成后进入到目录中,可以看到frps换frps.ini ,我下面的文件是已经删除掉了一下和服务端无关的文件,只留下了有用的文件
我们编辑frps.ini文件
bind_port是frp客户端和我们阿里云服务器连接的端口,如果你的阿里云服务器端口没有被占用的话,那就不用修改了,如果你的阿里云服务器端口7000已经被占用了,那就需要再换一个。
vhost_http_port是我们需要和本地电脑连接的端口,换句话说,就是我们本地IDE项目运行的那个端口,同样,该端口在阿里云服务器也不能被占用。
保存后我们运行服务端,也就是通过frps.ini文件运行frps。
第一种运行方式是前台开启,如果把x-shell退出后,连接就会中断失效
第二种方式是后台开启,把x-shell退出后,不会中断
前端开启,关闭ssh连接就会失效
./frps -c ./frps.ini
后台开启,关闭ssh连接仍然运行
nohup ./frps -c ./frps.ini &
若通过后者开启,信息会自动保存到frp路径下的 nohup.out 文件中,内容与上面一致
开启之后,还需在阿里云后台防火墙设置中开启相应端口
否则,客户端在连接时会出错
[W] [control.go:113] login to server failed: dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out dial tcp xxx.xxx.xxx.xxx:7000: connect: connection timed out
至此服务端已经配置好了。
客户端(内网主机)配置
我们下载一份对应的frps在windows环境下的文件, 下载地址: Releases · fatedier/frp (github.com)
我下载的版本是frp_0.44.0_windows_amd64
下载完成之后,解压,找到frpc.ini
使用记事本编辑
[common]中的server_addr是我们的服务器公网地址,server_port 应与服务端配置中的 bind_port 一致
[web]为模块名可以自己定义,local_port与内网主机,也就是我们本地IDE运行的项目所在的端口一致,custom_domains填映射到阿里云ip的域名,没有域名直接填阿里云ip即可
编辑完成后,退出保存,在当前路径下打开黑窗口,以frpc.ini配置文件运行frpc.exe
运行命令
frpc -c frpc.ini
于此同时,我们可以可以看到frp服务端已经有了对应的连接成功的提示。
至此,我们的frp客户端也已经配置完成了。
测试是否穿透成功
本地运行一个goweb项目
现在我们让一个外网,随便找一个和你不在同一网络下的人连接 服务器端口:81,就可以看到请求已经发送到你的本地了。
本地IDE收到的请求提示
至此,内网穿透成功。
如果您看了文章有疑问,请在评论区留言,欢迎指正!