目前部署在AidLux平台的各种应用,在局域网内部都能很轻松的实现访问。如果要实现在外网也能成功访问,则必须得有一个公网IP,这个是最最基本的前提。
此贴将详细介绍,如何利用Frp工具一步步配置,通过内网穿透的方式,将局域网内部的设备或应用暴露在公网上,从而实现外网的直接访问。
准备:
- 1.Frp安装包,直接在github上下载,51.2k star,很强大。演示版本为最新的v0.38.0
- 2.具有公网IP的服务器,这儿我以亚马逊云的v p s为例。
- 3.安装有AidLux的手机。(演示的AidLux版本为1.0a)
- 4.另外一部可通过移动流量上网的手机,主要是做验证用。
Frp介绍:
FRP 使用 Go 语言开发,可以支持 Windows、Linux、macOS、ARM 等多平台部署。它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTP、TCP、UDP等众多协议。在公网服务器安装一个server端,内网服务器安装一个client端,起到一个中转转发的作用,从而实现内网暴露到外网。简单地说,frp就是一个反向代理的应用。
安装配置
服务端frps的安装
1.登录亚马逊云,记录下这个公网IP,在后续的Frpc客户端安装配置中需要用到。
2.ssh连接登录该实例,将对应操作系统的frps安装包进行配置。因为该实例是Ubuntu系统,安装此frp_0.38.0_linux_amd64.tar.gz。解压后,我们可以看到如下文件。
3. 因为是服务端,只需要关注这三个带frps相关的文件,frpc相关的三个是后面客户端环境需要配置的。
- ● frps 服务端启动程序
- ● frps.ini 服务端配置文件
- ● frps_full.ini 服务端全量配置文件
4.vim编辑frps.ini文件,添加如下配置:
[common]
bind_port = 7000
vhost_http_port = 10080
vhost_https_port = 10443
- ● bind_port表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
- ● vhost_http_port和vhost_https_port用于反向代理HTTP主机时使用。后续因为需要通过HTTP方式访问AidLux的web应用。
编辑完保存。(vim的保存,简单说一下就是按一下Esc,再shift+冒号,输入wq即可)如果不行,就只能自行问度娘了。
5.对防火墙的端口进行设置,必须得允许这些端口的流量入站与出站。这儿为了简单,就设为允许全部端口与全部协议。此步骤很重要,千万不能忘记。
6.启动frps,运行服务端了。
./frps -c frps.ini
执行完,会有如下打印就表示启动成功了。
特别说明一下,至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,此处只是为了方便查看当客户端连接时候,是否会有打印输出。如果成功后,我们就可以使用nohup命令将其运行在后台。即如下:
nohup ./frps -c frps.ini &
客户端frpc的安装
客户端的安装,跟服务端类似,只是安装包不同,因为是arm平台,则是下载frp_0.38.0_linux_arm64安装包。
1.登录AidLux的桌面,解压安装包,如下:
2.编辑frpc.ini文件,添加如下配置。
[common]
server_addr = 18.141.173.226
server_port = 7000
[web]
type = http
local_ip = 127.0.0.1
local_port = 9999
custom_domains = 18.141.173.226
- ● “[xxx]”表示一个规则名称,自己定义,便于查询即可。
- ● "server_addr"表示服务端地址,即前面步骤特别提到的亚马逊云的公网IP地址。
- ● "server_port"与服务端bind_port一致。
- ● “type”表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。
- ● “local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。此处填写的9999,则是后面步骤中,web应用监听的一个端口。
- ● "custom_domains",表示公网服务器绑定的域名,没有的话,此处直接照填服务器地址即可。
3.启动fpc客户端。
./frpc -c frpc.ini
执行完,有如下打印,则表示成功此时已经与服务端成功建立起了连接,如果你切到服务端,其实可以看到新的打印。
Web应用配置
演示的Web应用,是一个基于SpringBoot的web项目,实现的功能很简单。此部分的步骤是在PC上完成,关于如何生成springboot脚手架的工程项目及编译打包,网上教程一大把。
整个项目结构及部分代码如下图:
1.一个Controller类,当请求"/demo/hello"的时候,渲染index.html文件内容。
2.配置"server.port=9999"在application.properties文件中。
3.模板html文件内容如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h2>Hello AidLux</h2>
<h2>This is a simple demo for remote access.</h2>
</body>
</html>
4.执行编译打包命令。
mvn package
5.将生成在target目录下的demo-0.0.1-SNAPSHOT.jar文件部署在AidLux平台中,并运行。
6.先在内网验证一下,此处AidLux平台所处的IP地址为192.168.31.179,在浏览器输入http://192.168.31.179:9999/demo/hello。 表明部署的Web应用已成功启动了。
远程访问
现在需要拿出另外一部直接通过流量上网的手机,进行验证是否外网访问能否成功。
输入http://18.141.173.226:10080/demo/hello
常见问题:
1.能否在手机AidLux端部署frps服务端?
答案是不行,手机使用数据连接上网时、家庭宽带使用运营商网络上网时,均采用了10.64.0.0/10段的运营商级NAT地址,属于私网地址。
2.没有公网IP,家里的宽带能行吗?
据我所知,目前只有电信的宽带,能够电话申请公网IP。其他运营商的宽带,是不支持的。另外还得电话客服,更改为桥接模式,即家里路由器进行拨号上网。但即便是拿到公网IP的话,也得自己在路由器中进行设置端口转发。有兴趣的网友可以搜索一下。
3.frp的服务端,客户端都已配置成功并连接,但为什么还是不能远程访问?
针对这一情况,原因有很多。一般首先检查部署frps服务端的环境,是否把配置的端口进行了放行。像亚马逊云上的设置,得设置入站与出站,允许全部端口及协议。