【Linux】FRP:内网穿透
FRP(Fast Reverse Proxy)是一种高性能的反向代理应用,主要用于穿透内网和实现端口映射。它允许你将局域网中的服务暴露到公网,从而能够在公网中访问这些服务。
FRP 主要由两部分组成:
- FRPC 客户端:运行在公司内网机器上,接收来自公网的访问请求,并将请求转发给内网服务。
- FRPS 服务端:部署在具有公网 IP 的机器上,暴露服务的公网入口,接收公网访问请求,通过加密隧道转发到 FRPC。
服务端(frps)部署
下载 FRP
从 FRP 的 GitHub Releases 页面下载适用于你的系统的版本。例如:
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz
解压压缩包
下载完成后,使用以下命令解压缩包:
tar -xzf frp_0.60.0_linux_amd64.tar.gz
这会在当前目录下创建一个名为 frp_0.60.0_linux_amd64
的文件夹,里面包含 frp
的所有必要文件。
配置 frps
进入文件夹,有一个名为 frps.toml
的配置文件,并根据你的需求填入配置内容。下面是一个详细注释的 TOML 配置示例:
# [common] 部分用于配置 FRP 服务端的通用设置
[common]
# 服务端监听的端口,客户端通过这个端口连接到服务端
bindPort = 7000
# 启用 TLS,确保服务端仅接受加密连接
transport.tls.force = true
# 身份验证令牌,客户端和服务端的 token 必须一致以确保安全连接
auth.token = "public"
# [webServer] 部分用于配置 Web 管理面板的设置
[webServer]
# Web 管理面板绑定的 IP 地址,0.0.0.0 表示监听所有网络接口
addr = "0.0.0.0"
# Web 管理面板监听的端口
port = 7500
# 登录 Web 管理面板的用户名
user = "admin"
# 登录 Web 管理面板的密码
password = "admin"
# [log] 部分用于配置日志记录的设置
[log]
# 日志文件的路径
file = "frps.log"
# 日志级别,可以是 debug、info、warn、error 之一,决定记录的详细程度
level = "info"
# [dashboard] 部分用于配置仪表盘功能(如果启用)
[dashboard]
# 启用仪表盘功能以查看服务状态和统计信息
enable = true
# 仪表盘的监听地址,通常设置为 0.0.0.0 以监听所有网络接口
addr = "0.0.0.0"
# 仪表盘的监听端口
port = 7500
# 仪表盘的访问用户名
user = "admin"
# 仪表盘的访问密码
password = "admin"
# [proxy] 部分用于配置负载均衡(如果需要)
[proxy]
# 负载均衡策略,例如 round-robin(轮询)或 least-connections(最少连接数)
strategy = "round-robin"
# [allow] 部分用于配置允许的 IP 列表(防火墙设置)
[allow]
# 允许访问 FRP 服务端的 IP 地址列表
ip = ["192.168.1.100", "192.168.1.101"]
# [http] 部分用于配置 HTTP 代理(如果需要)
[http]
# 设置 HTTP 代理的地址,将所有来自客户端的 HTTP 请求转发到这个代理地址
http_proxy = "http://localhost:8080"
# [tcp] 部分用于配置 TCP 代理(如果需要)
[tcp]
# 设置 TCP 代理的地址,将所有来自客户端的 TCP 请求转发到这个代理地址
tcp_proxy = "tcp://localhost:3306"
启动 frps
服务端
在解压后的 FRP 目录中,使用 -c
参数指定配置文件路径来启动 frps
:
./frps -c ./frps.toml
客户端(frpc)部署
FRP 客户端(frpc
)用于将本地服务暴露到外部网络。配置 frpc
客户端涉及设置本地服务的映射和连接到 FRP 服务端(frps
)。以下是 frpc
部署和配置的详细说明:
下载 FRP
从 FRP 的 GitHub Releases 页面下载适用于你的系统的版本。例如:
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz
解压压缩包
下载完成后,使用以下命令解压缩包:
tar -xzf frp_0.60.0_linux_amd64.tar.gz
这会在当前目录下创建一个名为 frp_0.60.0_linux_amd64
的文件夹,里面包含 frp
的所有必要文件。
配置 frpc
进入文件夹,有一个名为 frpc.toml
的配置文件,并根据你的需求填入配置内容。下面是一个详细注释的 TOML 配置示例:
# [common] 部分用于配置 FRP 客户端的通用设置
[common]
# 服务端的地址,FRP 客户端将连接到该地址的服务端。
server_addr = "your_server_ip"
# 服务端的端口,客户端通过该端口连接到服务端。
server_port = 7000
# 身份验证令牌,必须与服务端配置中的 token 保持一致,以确保连接的安全性。
token = "public"
# [http] 部分用于配置 HTTP 服务的端口映射,将本地 HTTP 服务暴露到远程。
[http]
# 类型为 HTTP,表示将本地 HTTP 服务通过 FRP 暴露到远程网络。
type = "http"
# 本地服务的 IP 地址,通常设置为 127.0.0.1,即本地回环地址。
local_ip = "127.0.0.1"
# 本地服务监听的端口,例如 HTTP 服务的端口,默认端口为 80。
local_port = 80
# 服务端暴露的端口,外部用户通过此端口访问你的本地 HTTP 服务。
remote_port = 8080
# [tcp] 部分用于配置 TCP 服务的端口映射,将本地 TCP 服务暴露到远程。
[tcp]
# 类型为 TCP,表示将本地 TCP 服务通过 FRP 暴露到远程网络。
type = "tcp"
# 本地服务的 IP 地址,通常设置为 127.0.0.1,即本地回环地址。
local_ip = "127.0.0.1"
# 本地服务监听的端口,例如数据库服务的端口(如 MySQL 的 3306)。
local_port = 3306
# 服务端暴露的端口,外部用户通过此端口访问你的本地 TCP 服务。
remote_port = 6000
# [udp] 部分用于配置 UDP 服务的端口映射,将本地 UDP 服务暴露到远程。
[udp]
# 类型为 UDP,表示将本地 UDP 服务通过 FRP 暴露到远程网络。
type = "udp"
# 本地服务的 IP 地址,通常设置为 127.0.0.1,即本地回环地址。
local_ip = "127.0.0.1"
# 本地服务监听的端口,例如游戏服务器或 VoIP 服务的端口。
local_port = 1234 # 本地 UDP 服务监听的端口
# 服务端暴露的端口,外部用户通过此端口访问你的本地 UDP 服务。
remote_port = 7001 # 服务端暴露的端口
# [custom] 部分用于配置自定义域名和路径映射,将本地服务通过特定域名和路径暴露到远程。
[custom]
# 类型为 HTTP,表示将本地 HTTP 服务通过自定义域名暴露到远程网络。
type = "http"
# 本地服务的 IP 地址,通常设置为 127.0.0.1,即本地回环地址。
local_ip = "127.0.0.1"
# 本地服务监听的端口,例如自定义服务的端口。
local_port = 8080
# 自定义域名列表,客户端可以通过这些域名访问你的本地服务。需要在服务端配置相应的域名解析。
custom_domains = ["example.com"]
# 自定义路径列表,配置访问路径的映射,例如 "/api" 和 "/static"。
locations = ["/api", "/static"]
# [web] 部分用于配置 Web 管理面板,通常用于监控和管理 FRP 客户端。
[web]
# 类型为 HTTP,表示将本地的 Web 管理面板服务暴露到远程网络。
type = "http"
# 本地服务的 IP 地址,通常设置为 127.0.0.1,即本地回环地址。
local_ip = "127.0.0.1"
# 本地服务监听的端口,例如管理面板的端口。
local_port = 7500
# 服务端暴露的端口,外部用户通过此端口访问你的 Web 管理面板。
remote_port = 7500
启动 frpc
客户端
在解压后的 FRP 目录中,使用 -c
参数指定配置文件路径来启动 frpc
:
./frpc -c ./frpc.toml
测试
你可以使用 Python 自带的 http.server
模块来快速启动一个简单的 HTTP 服务器,然后使用 FRP 将这个服务器暴露给外部网络。
python -m http.server 8000
Linux 使用 Systemd 管理服务
创建 Systemd 服务文件
-
在
/etc/systemd/system/
目录下创建一个新的服务文件(例如frps.service
):sudo vi /etc/systemd/system/frps.service
-
文件内容如下:
[Unit] Description=FRP Client Service After=network.target [Service] ExecStart=/path/to/frps -c /path/to/frps.toml Restart=on-failure [Install] WantedBy=multi-user.target
-
将
/path/to/frps
替换为frps
的实际路径。
启用并启动服务
-
启用服务,使其开机自启动:
sudo systemctl enable frps
-
手动启动服务:
sudo systemctl start frps
管理服务
-
停止服务:
sudo systemctl stop frps
-
查看服务状态:
sudo systemctl status frps
通过这些步骤,你可以方便地在 Windows 和 Linux 系统上启动和停止 FRP 服务,并设置其开机自启。
在 Windows 系统上管理 FRP 服务的启动、停止和设置开机自启可以通过创建和使用 Windows 服务来实现。以下是详细步骤:
Windows 使用 NSSM 管理服务
NSSM(Non-Sucking Service Manager)是一个轻量级的工具,帮助你在 Windows 上将任何可执行程序作为服务运行。你可以用 NSSM 来管理 FRP 的启动、停止和开机自启。
下载和安装 NSSM
- 从 NSSM 官方网站 下载 NSSM。
- 解压下载的文件,将
nssm.exe
复制到一个系统路径目录(如C:\Windows\System32
),或者保存在某个文件夹中供以后使用。
创建 FRP 服务
-
打开命令提示符(以管理员身份运行)并执行以下命令创建 FRP 服务:
nssm install frps
-
弹出 NSSM 界面后,按如下方式配置:
-
Application Path:选择
frps.exe
的路径。 -
Arguments:填入
-c
参数,指定frps.toml
配置文件的路径,例如:-c C:\path\to\frps\frps.toml
-
Startup directory:选择
frps.exe
所在的目录。
-
-
点击 “Install Service” 完成服务的创建。
启动和管理服务
-
启动 FRP 服务:
nssm start frps
-
停止 FRP 服务:
nssm stop frps
-
查看 FRP 服务的状态:
nssm status frps
设置开机自启
NSSM 自动会将服务设置为开机自启。创建服务后,它会随系统启动自动运行。如果你需要手动修改此设置,可以通过以下方式进行:
-
打开 服务管理器,可以通过运行
services.msc
打开。 -
找到刚刚创建的
frps
服务,右键点击,选择 “属性”。 -
在“启动类型”下拉菜单中选择
自动
,然后点击 “确定”。
删除服务
如果需要删除已经创建的 FRP 服务,可以使用以下命令:
nssm remove frps confirm
这会完全移除 frps
服务,并删除其相关的启动配置。