Lapple
发布于 2024-07-22 / 5 阅读
0

内网穿透的高性能的反向代理应用

frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。

通过在具有公网 IP 的节点上部署 frp 服务端,可以轻松地将内网服务穿透到公网,同时提供诸多专业的功能特性,这包括:

  • 客户端服务端通信支持 TCP、KCP 以及 Websocket 等多种协议。

  • 采用 TCP 连接流式复用,在单个连接间承载更多请求,节省连接建立时间。

  • 代理组间的负载均衡。

  • 端口复用,多个服务通过同一个服务端端口暴露。

  • 多个原生支持的客户端插件(静态文件查看,HTTP、SOCK5 代理等),便于独立使用 frp 客户端完成某些工作。

  • 高度扩展性的服务端插件系统,方便结合自身需求进行功能扩展。

  • 服务端和客户端 UI 页面。

https://github.com/fatedier/frp/releases

https://gofrp.org/docs/overview/

部署

解压缩下载的压缩包,将其中的 frpc 拷贝到内网服务所在的机器上,将 frps 拷贝到具有公网 IP 的机器上,放置在任意目录。

编写配置文件,先通过 

./frps -c ./frps.ini 启动服务端,再通过 ./frpc -c ./frpc.ini 启动客户端。如果需要在后台长期运行,建议结合其他工具使用,例如 systemd 和 supervisor

使用 systemd

这个示例将会演示在 Linux 系统下使用 systemd 控制 frps 及配置开机自启。

在 Linux 系统下,使用systemd 可以方便地控制 frp 服务端 frps 的启动和停止、配置后台运行和开启自启。

要使用 systemd 来控制 frps,需要先安装 systemd,然后在 /etc/systemd/system 目录下创建一个 frps.service 文件。

如Linux服务端上没有安装

 systemd,可以使用 yum 或 apt 等命令安装 systemd

# yum
yum install systemd
# apt
apt install systemd

使用文本编辑器,如 vim 创建并编辑 frps.service 文件。

$ vim /etc/systemd/system/frps.service
[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /path/to/frps -c /path/to/frps.ini

[Install]
WantedBy = multi-user.target

使用 systemd 命令,管理 frps。

# 启动frp
systemctl start frps
# 停止frp
systemctl stop frps
# 重启frp
systemctl restart frps
# 查看frp状态
systemctl status frps

配置 frps 开机自启。

systemctl enable frps

通过 SSH 访问内网机器

这个示例通过简单配置 TCP 类型的代理让用户访问到内网的服务器。

在具有公网 IP 的机器上部署 frps,修改 frps.ini 文件,这里使用了最简化的配置,设置了 frp 服务器用户接收客户端连接的端口:

[common]
bind_port = 7000

在需要被访问的内网机器上(SSH 服务通常监听在 22 端口)部署 frpc,修改 frpc.ini 文件,假设 frps 所在服务器的公网 IP 为 x.x.x.x:

[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

local_ip 和 local_port 配置为本地需要暴露到公网的服务地址和端口。remote_port 表示在 frp 服务端监听的端口,访问此端口的流量将会被转发到本地服务对应的端口。

HTTP协议配置

HTTP协议服务端配置

服务端配置文件为frps.ini,初始配置为bind_port = 7000,HTTP协议穿透只需要再增加一个vhost_http_port配置,这个端口号可随意配置服务器的闲置端口,这里使用8000

[common]
bind_port = 7000
vhost_http_port = 8000

通过http://101.200.XX.XX:8000访问内网资源

HTTP协议客户端配置

客户端即本地window端配置,配置文件为frpc.ini。

客户端首先需要在[common]中配置服务端的地址server_addr (这里隐藏了我的真实IP)和 端口号server_port(与服务端 bind_port 配置相同)。

其次,在[web]中配置本地需要穿透的web服务的端口号,这里是8080,即local_port = 8080;此外,还需配置外网访问的域名custom_domains,这里一般是解析到服务端服务器公网IP的域名,但由于没有域名,这里直接配置成服务端公网IP,访问时直接通过IP访问。

[common]
server_addr = 101.200.XX.XX
server_port = 7000

[web]
type = http
local_port = 8080
custom_domains = 101.200.XX.XX

参数

作用

[common]

server_addr

云服务器IP

server_port

客户端和服务端交互端口,和云服务器bind_port 配置相同

token

密钥,和云服务器token配置相同

[tcp]

type

通信类型

local_ip

客户端IP

local_port

客户端暴露段口

remote_port

云服务器转发端口

客户端启动:在frp文件打开终端,执行

建议:为了让程序在后台运行并将日志输出到指定文件比如frps.log,可以用nohup启动:

nohup ./frps -c frps.ini >> frps.log 2>&1 &