文章目录
在网络世界中,我们经常会遇到这样的需求:希望能够从外部网络访问到位于内网的服务器或服务。比如,在家里的电脑上搭建了一个网站,想让朋友从外面访问;或者,在公司内部部署了一个服务,需要让出差的同事也能使用。这时候,反向代理就显得尤为重要。
传统的反向代理通常需要配置端口映射和动态 DNS,步骤繁琐,而且稳定性也难以保证。今天,我们要介绍一款强大的工具:FRP (Fast Reverse Proxy),它可以帮助我们轻松实现内网穿透,进行反向代理,而且配置简单,功能强大。
我的场景 是在公司有一台深度学习服务器,回家后我也想用,那么就要做一个反向代码理才可以。看了几个博客,都是全而多,看完反正是乱,所以记录一下自己是如何实现的,加上更多的截图,方便理解的定位。
1 什么是 FRP
FRP 是一个高性能的反向代理应用,专注于内网穿透。它由 Go 语言开发,具有跨平台、易部署、低资源消耗等优点。FRP 的核心思想是在公网服务器上运行一个 FRP 服务端(frps),然后在内网服务器上运行一个 FRP 客户端(frpc),通过服务端进行数据转发,从而实现从外部网络访问内网服务。
2 FRP 的工作原理
FRP 的工作原理可以简单概括为:
- 客户端(frpc)连接服务端(frps): 内网的 frpc 客户端主动连接到公网的 frps 服务端,建立持久连接。
- 请求转发: 当外部用户访问 frps 服务端时,frps 会将请求转发到对应的 frpc 客户端。
- 客户端处理请求: frpc 客户端接收到请求后,会将其转发到内网对应的服务。
- 返回响应: 内网服务处理完请求后,将响应返回给 frpc,frpc 再通过 frps 将响应返回给外部用户。
3 FRP 的优势
- 简单易用: 配置简单,只需编写简单的配置文件即可实现反向代理。
- 跨平台支持: FRP 支持 Windows、Linux、macOS 等多种操作系统。
- 高性能: 基于 Go 语言开发,具有高性能和低延迟的特点。
- 多种协议支持: 支持 TCP、UDP、HTTP、HTTPS 等多种协议。 这个是有用的,你可以ssh 或者自己的网页,用不同协意,要以给代理出来
- 多路复用: 支持多个客户端连接到同一个服务端,实现多个内网服务暴露。
- 安全性: 支持 TLS 加密,保证数据传输的安全性。
4 实现步骤
下面以一个简单的 HTTP 反向代理为例,介绍如何使用 FRP。
4.1 准备工作
- 公网服务器: 拥有一台具有公网 IP 的服务器,用于运行 frps 服务端。
我是去阿里云买了一个,99一年,
- 内网服务器: 拥有一台运行内网服务的服务器,用于运行 frpc 客户端。
这个就是公司的电脑。 - FRP 程序: 分别在公网服务器和内网服务器下载对应版本的 FRP 程序。你可以从 FRP 的 GitHub 仓库下载:https://github.com/fatedier/frp,下载最新版本就行
wget https://github.com/fatedier/frp/releases/download/v0.61.0/frp_0.61.0_linux_amd64.tar.gz
tar -xzvf frp_0.61.0_linux_amd64.tar.gz
cp frp_0.61.0_linux_amd64/* ./
可以看到有 frpc frpc.toml frps frps.toml 四个文件,c可以理解成cline,s就是server.
4.2 配置 FRP 服务端(frps)
有好多的配置选项,但可以直接用默认的:
4.3 配置 FRP 客户端(frpc)
在内网服务器上,同样是下载那个软件,默认的内容是:
serverAddr = "X.XX.XX.XX" # 公网服务器 IP
serverPort = 7000 # 与服务端配置的 bind_port 一致
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1" # 内网服务 IP,一般为 127.0.0.1
localPort = 22 # 内网服务的端口
remotePort = 8001 # 外部访问的端口,注意不要与服务端端口冲突
如果有一台内网服务器需要穿透,可以在另一台上进行设置:
serverAddr = "X.XX.XX.XX" # 公网服务器 IP
serverPort = 7000 # 与服务端配置的 bind_port 一致
[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1" # 内网服务 IP,一般为 127.0.0.1
localPort = 22 # 内网服务的端口
remotePort = 8002 # 外部访问的端口,注意不要与服务端端口冲突
这样就可以访问不同的机器
ssh -p 8001 user@"公网ip" #访问第一台内网机
ssh -p 8002 user@"公网ip" #访问第二台内网机
这里的user 都是指内网服务器上的用户名。
4.4 配置阿里云
打开网页,点击“控制台"
接着找到自己的轻量应用服务器:
接着点击自己的服务器名称:
接着点击防火墙:
要添加规则,把我们需要的端口都开放出来;tcp协议用来使用ssh;icmp协议是使用外网服务器可以通过公网ip被访问。
最后可以测试:
ping 公网ip
ssh user@公网ip
5 开启服务
正常的,开启servser 和 client就可以,分别在各自的机器上执行:
./frps -c frps.toml #开启
./frpc -c frpc.toml
但我们要保证两种情况,一是开机自启动,二是要进程误杀后自启动。
方法如下:
要让 FRP 服务在系统启动时自动启动,并且在进程被误杀时自动重启,可以通过以下方法配置:
5.1 使用 Systemd 配置开机自启和自我恢复
Linux(包括 Ubuntu)中的 Systemd 服务管理可以实现开机自启和自动重启。
5.1.1 创建 Systemd 服务文件
**以下过程以client的配置为例,服务端把c改成s即可。
运行以下命令创建一个服务文件:
sudo vim /etc/systemd/system/frpc.service
在文件中输入以下内容(请根据实际情况修改路径):
如果是客户端:
[Unit]
Description=FRP Client
After=network.target
[Service]
Type=simple
ExecStart=/path/to/frpc -c /path/to/frpc.toml
Restart=always
RestartSec=5
User=root
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
服务端:
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
ExecStart=/path/to/frps -c /path/to/frps.toml
Restart=always
RestartSec=5
User=root
LimitNOFILE=65535
[Install]
WantedBy=multi-user.target
ExecStart
:替换/path/to/frpc
为frpc
的实际路径,/path/to/frpc.toml
为配置文件路径。Restart=always
:确保进程被意外终止后自动重启。RestartSec=5
:如果进程被杀死,5 秒后重启。User=root
:指定运行用户,可改为普通用户。
5.1.2 重新加载 Systemd 配置
保存后,重新加载 Systemd 配置:
sudo systemctl daemon-reload
5.1.3 设置开机自启
让 FRP 服务随系统启动自动启动:
sudo systemctl enable frpc
5.1.4 启动服务
启动并测试 FRP 服务:
sudo systemctl start frpc
检查服务状态:
sudo systemctl status frpc
5.2 验证自启和自动恢复
5.2.1 重启验证
重启系统:
sudo reboot
确认 FRP 服务是否已启动:
sudo systemctl status frpc
5.2.2 模拟进程被杀死
使用以下命令终止 FRP 进程:
sudo pkill frpc
几秒后运行以下命令,查看进程是否自动重启:
ps aux | grep frpc
我们看一下成功后的是什么:
客户端:
阿里云:
6 总结
FRP 是一款功能强大、易于使用的反向代理工具,它可以帮助我们轻松实现内网穿透,让我们的内网服务能够被外部网络访问。无论是个人使用还是企业应用,FRP 都是一个非常不错的选择。
后续学习
- FRP 的官方文档:https://github.com/fatedier/frp
- FRP 的详细配置说明:参考官方文档或者网上其他教程。
希望这篇博客能够帮助你理解 FRP 的原理和使用方法。如果你有任何问题或建议,欢迎在评论区留言。
本文参考:1、https://zhuanlan.zhihu.com/p/720401107
2、https://blog.csdn.net/zhangxiaoquan2016/article/details/140345796