这篇文章最终要实现的效果是,把云服务器的公网IP绑定到自己本地局域网上的主机一样的效果。相当于局域网主机有了一个自己的公网IP地址。
FRP (Fast Reverse Proxy) 是一个用 Go 语言编写的高性能反向代理应用程序,主要用于内网穿透。它允许位于 NAT 或防火墙后的内网服务通过在公共网络上部署一个 frp 服务器(通常称为 frps)来对外提供服务。通过在客户端(frpc,即 frp 客户端)配置相应的代理规则,外部网络上的用户可以访问这些被防火墙或 NAT 限制的内部资源。
核心功能
- 内网穿透:FRP 可以帮助内网服务穿透 NAT 和防火墙,使得这些服务可以从外部网络访问。
- 反向代理:支持 TCP、UDP、HTTP、HTTPS 等多种协议的反向代理。
- 负载均衡:FRP 支持通过配置多个入口节点来实现简单的负载均衡。
- 加密传输:FRP 支持通过自定义设置使用加密传输,确保数据在传输过程中的安全性。
- 身份验证:FRP 服务端和客户端支持多种身份验证方式,保证连接的安全性。
- 访问控制:可以通过配置文件限制访问权限,管理不同客户端的访问规则。
组件说明
-
frps(FRP Server):
- 部署在具有公网 IP 地址的服务器上。
- 负责接收来自 FRP 客户端的连接请求,并将请求转发到后端的具体服务。
- 可以配置多种监听端口,支持不同的服务和协议。
-
frpc(FRP Client):
配置实例
以下是一个基本的 FRP 服务器和客户端配置的示例:
FRP 服务器配置(frps.ini):
[common]
bind_port = 7000
FRP 客户端配置(frpc.ini):
[common]
server_addr = x.x.x.x # 替换为 FRP 服务器的公网 IP
server_port = 7000[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
在此配置中,FRP 客户端将本地的 SSH 服务(通常运行在端口 22)通过 FRP 服务器暴露在公网的 6000 端口上。这意味着,任何能访问 FRP 服务器 IP 地址在 6000 端口的用户都可以通过这个端口连接到内网的 SSH 服务。
使用场景
FRP 非常适合以下使用场景:
- 内网的 Web 服务需要暴露到互联网上。
- 访问部署在内网的 API 或数据库服务器。
- 远程办公时,访问公司内部网络资源。
- IoT 设备远程管理和数据访问。
总之,FRP 是一个功能强大且灵活的内网穿透和反向代理工具,适用于多种网络穿透和服务暴露需求。
实际操作
1.配置服务器
## 准备一个云服务器,具有公网Ip的服务器,建议使用香港服务器,免域名备案
输入wget命令下载frp服务器
wget https://github.com/fatedier/frp/releases/download/v0.41.0/frp_0.41.0_linux_amd64.tar.gz
1.下载完成后的文件夹执行以下命令
tar -zxvf frp_0.41.0_linux_amd64.tar.gz
2.生成对于文件夹
cd frp_0.41.0_linux_amd64
3.查看所有文件
ll
vim frps.ini
4.配置服务端的文件,dashboard_port是web控制面板的端口号
5.执行命令,运行服务端,日志文件会输出在nohop.out中
nohup ./frps -c ./frps.ini &
6.查看日志,若是输出successful表示启动成功
cat nohup.out
7.访问web控制面板。地址为,ip:7500。若出现以下界面,表示服务器配置成功
windowsgithubwindowsv041_119">2.配置windows,自己的主机。去github下载对应windows的压缩包。找到v0.41版本
windows_122">2.1.下载frp的windows压缩包
https://github.com/fatedier/frp/releases?page=3
2.2.解压到一个文件夹
2.3.配置fprc.ini
type一定要选择tcp的方式,并且指定local 和remote端口,否则remote的端口会随机生成
[common]
server_addr =x.x.x.x
server_port = 7000[local_80]
type = tcp
local_port = 80
remote_port=80
[local_3000]
type = tcp
local_port = 3000
remote_port=8080
这里我将本地的80端口映射到了远程服务器上也是80端口,本地的3000端口映射到远程的8080端口。当我访问远程主机 ip:80后会映射到我本地的localhost:80端口。访问远程的ip:8080端口会映射到我本地开启的localhost:3000端口。这样就实现的内网穿透
2.4.cmd进入控制框,执行 frpc.exe文件
一定要使用cmd的方式执行exe文件,否则执行运行不了。
这里是我已经开启了,所以会报错error。到此,服务器就完成了外网映射内网。
2.5查看服务器web端的tcp注册界面,显示online表示注册成功。地址为,ip:7500
2.6输入服务器ip地址+端口号访问测试。成功!
windows_174">这里就实现了访问远程服务器
—》远程服务器转发
----》内网windows主机
3.购买域名,完成自定义域名功能
3.1阿里云或者腾讯购买一个非常便宜的域名,我买好了8RMB一年。然后配置dns解析
配置域名解析
点击确定后就完成了自定义域名绑定。可以使用域名访问内网的应用了,绑定后稍微等1min。因为阿里云要解析同步数据。
查看远程web控制面板,有数据。
猜测一下为什么不用http,要使用tcp呢?
HTTP(超文本传输协议)和 TCP(传输控制协议)都是网络通信的重要协议,它们在网络中扮演着不同但互补的角色。理解它们之间的关系,有助于更好地把握现代网络通信的工作原理。
TCP - 传输控制协议
TCP 是一种传输层协议,它为上层应用提供了一种可靠的数据传输服务。TCP 确保数据可以在网络中从一端可靠地传输到另一端,即确保数据的完整性和正确性。TCP 主要的特点包括:
- 面向连接:在数据开始传输之前,TCP 需要源和目标之间建立连接。
- 可靠传输:TCP 通过序号、确认应答、重传机制等确保数据正确无误地到达目标地。
- 流控制和拥塞控制:TCP 有机制来调整数据的发送速率,以匹配接收方的处理速度和网络的当前状态。
- 有序传输:TCP 保证数据按照发送顺序到达接收端。
HTTP - 超文本传输协议
HTTP 是一种应用层协议,用于分布式、协作式、超媒体信息系统。HTTP 是 Web 上使用的主要协议,用于在 Web 浏览器和服务器之间传输网页和其他数据。HTTP 主要特点包括:
- 无状态协议:HTTP 协议自身不保存之前的请求记录,每次请求之间是独立的。
- 基于请求-响应模式:客户端发送请求后,服务器回送响应。
- 可扩展:HTTP 允许传输任意类型的数据对象,通过 MIME 类型标识数据的格式。
它们之间的联系
HTTP 和 TCP 之间的主要联系是,HTTP 建立在 TCP 提供的服务之上
。HTTP 作为应用层协议,使用 TCP 在网络中传输数据,依赖 TCP 提供可靠性和顺序性保证。
- 依赖关系:HTTP 依赖于 TCP 来确保数据包的可靠性、顺序和错误检测。当你通过浏览器访问一个网站时,浏览器(HTTP 客户端)首先与服务器建立一个 TCP 连接,然后通过这个连接发送和接收 HTTP 消息。
- 性能影响:TCP 的性能(如连接建立的延迟、重传等)可以直接影响 HTTP 的响应时间和效率。
总结来说,HTTP 和 TCP 是现代互联网通信的基石,它们共同协作,使得网络通信既可靠又高效。HTTP 利用 TCP 的传输服务在用户和网络服务之间高效地交换信息。
大胆猜测为什么使用tcp连接也能实现http访问内网应用。(若有错误请鸽鸽告知)
http在应用层,而tcp在运输层。故frp只会解析到tcp层后,就会把数据包转发给内网的主机。这里frp不需要解析到http层,因为frp作为一个中转站,只是负责转发数据而已,更简单点说,frp也可以是一个运行在网络层的路由器。只负责报文的存储转发和路由而已。故可以不使用http层与内网进行通信。
当内网应用接收到tcp的连接后,交给程序,最后封装好数据再次返回给frp,frp拿到数据后返回给客户端。
以下对于网络模型进行讲解
五层网络模型,又称为TCP/IP五层模型,是用来描述计算机网络通信的一种模型。这个模型从下到上分为物理层、数据链路层、网络层、传输层和应用层。这些层次定义了网络通信的不同方面,并且各自负责不同的功能。下面详细介绍每一层的功能和相关协议:
1. 物理层
物理层负责在物理媒体(如电缆、光纤等)上进行原始的数据传输,不关心数据的含义和结构。物理层的任务主要是确保原始数据可靠地在网络介质上进行传输。物理层包括的设备有网线、光纤、调制解调器等,以及相关的接口标准,如RJ45、100BASE-T等。
2. 数据链路层
数据链路层的主要任务是将原始比特流转换成逻辑的结构化数据包,称为帧。这一层提供介质访问和错误检测功能,确保数据在网络设备间准确无误地传输。此层的协议包括以太网(Ethernet)、PPP(Point-to-Point Protocol)等。数据链路层设备包括交换机、网桥等。
3. 网络层
网络层负责在多个网络间转发数据包,这包括决定数据的路径和路由。网络层使用的协议主要是IP协议,包括IPv4和IPv6。此层的设备有路由器,它用来连接不同的网络,确保数据包能找到从源头到目的地的最佳路径。
4. 传输层
传输层负责提供端到端的数据传输服务,这包括建立、管理和终止会话。传输层确保数据的完整性和正确顺序传输到目的地。这一层的主要协议有TCP(传输控制协议)和UDP(用户数据报协议)。TCP提供可靠的连接,确保数据无误并顺序到达;UDP则提供更快但不可靠的连接。
5. 应用层
应用层是最靠近用户的一层,负责处理特定的应用服务细节。这一层的协议包括HTTP(超文本传输协议)、FTP(文件传输协议)、SMTP(简单邮件传输协议)等。应用层直接为用户的应用程序(如网页浏览器、电子邮件客户端)提供服务。
总结
五层网络模型为网络设计和开发提供了一种结构化的方式,使得网络通信的每一个方面都能被逐一考虑和实现。每一层都执行其特定的功能,同时支持上层的服务并利用下层的服务。通过这种方式,网络的设计和管理变得更为模块化和清晰。