【Linux】FRP:内网穿透

FRP(Fast Reverse Proxy)是一种高性能的反向代理应用,主要用于穿透内网和实现端口映射。它允许你将局域网中的服务暴露到公网,从而能够在公网中访问这些服务。

FRP 主要由两部分组成:

  • FRPC 客户端:运行在公司内网机器上,接收来自公网的访问请求,并将请求转发给内网服务。
  • FRPS 服务端:部署在具有公网 IP 的机器上,暴露服务的公网入口,接收公网访问请求,通过加密隧道转发到 FRPC。

服务端(frps)部署

下载 FRP

FRP 的 GitHub Releases 页面下载适用于你的系统的版本。例如:

bash 复制代码
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz

解压压缩包

下载完成后,使用以下命令解压缩包:

bash 复制代码
tar -xzf frp_0.60.0_linux_amd64.tar.gz

这会在当前目录下创建一个名为 frp_0.60.0_linux_amd64 的文件夹,里面包含 frp 的所有必要文件。

配置 frps

进入文件夹,有一个名为 frps.toml 的配置文件,并根据你的需求填入配置内容。下面是一个详细注释的 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

bash 复制代码
./frps -c ./frps.toml

客户端(frpc)部署

FRP 客户端(frpc)用于将本地服务暴露到外部网络。配置 frpc 客户端涉及设置本地服务的映射和连接到 FRP 服务端(frps)。以下是 frpc 部署和配置的详细说明:

下载 FRP

FRP 的 GitHub Releases 页面下载适用于你的系统的版本。例如:

bash 复制代码
wget https://github.com/fatedier/frp/releases/download/v0.60.0/frp_0.60.0_linux_amd64.tar.gz

解压压缩包

下载完成后,使用以下命令解压缩包:

bash 复制代码
tar -xzf frp_0.60.0_linux_amd64.tar.gz

这会在当前目录下创建一个名为 frp_0.60.0_linux_amd64 的文件夹,里面包含 frp 的所有必要文件。

配置 frpc

进入文件夹,有一个名为 frpc.toml 的配置文件,并根据你的需求填入配置内容。下面是一个详细注释的 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

bash 复制代码
./frpc -c ./frpc.toml

测试

你可以使用 Python 自带的 http.server 模块来快速启动一个简单的 HTTP 服务器,然后使用 FRP 将这个服务器暴露给外部网络。

python 复制代码
python -m http.server 8000

Linux 使用 Systemd 管理服务

创建 Systemd 服务文件

  • /etc/systemd/system/ 目录下创建一个新的服务文件(例如 frps.service):

    bash 复制代码
    sudo vi /etc/systemd/system/frps.service
  • 文件内容如下:

    ini 复制代码
    [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 的实际路径。

启用并启动服务

  • 启用服务,使其开机自启动:

    bash 复制代码
    sudo systemctl enable frps
  • 手动启动服务:

    bash 复制代码
    sudo systemctl start frps

管理服务

  • 停止服务:

    bash 复制代码
    sudo systemctl stop frps
  • 查看服务状态:

    bash 复制代码
    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 服务

  1. 打开命令提示符(以管理员身份运行)并执行以下命令创建 FRP 服务:

    bash 复制代码
    nssm install frps
  2. 弹出 NSSM 界面后,按如下方式配置:

    • Application Path :选择 frps.exe 的路径。

    • Arguments :填入 -c 参数,指定 frps.toml 配置文件的路径,例如:

      -c C:\path\to\frps\frps.toml
      
    • Startup directory :选择 frps.exe 所在的目录。

  3. 点击 "Install Service" 完成服务的创建。

启动和管理服务

  • 启动 FRP 服务:

    bash 复制代码
    nssm start frps
  • 停止 FRP 服务:

    bash 复制代码
    nssm stop frps
  • 查看 FRP 服务的状态:

    bash 复制代码
    nssm status frps

设置开机自启

NSSM 自动会将服务设置为开机自启。创建服务后,它会随系统启动自动运行。如果你需要手动修改此设置,可以通过以下方式进行:

  1. 打开 服务管理器 ,可以通过运行 services.msc 打开。

  2. 找到刚刚创建的 frps 服务,右键点击,选择 "属性"。

  3. 在"启动类型"下拉菜单中选择 自动,然后点击 "确定"。

删除服务

如果需要删除已经创建的 FRP 服务,可以使用以下命令:

bash 复制代码
nssm remove frps confirm

这会完全移除 frps 服务,并删除其相关的启动配置。

相关推荐
方竞1 小时前
Linux空口抓包方法
linux·空口抓包
sun0077002 小时前
ubuntu dpkg 删除安装包
运维·服务器·ubuntu
海岛日记2 小时前
centos一键卸载docker脚本
linux·docker·centos
oi772 小时前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
AttackingLin3 小时前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
吃肉不能购4 小时前
Label-studio-ml-backend 和YOLOV8 YOLO11自动化标注,目标检测,实例分割,图像分类,关键点估计,视频跟踪
运维·yolo·自动化
学Linux的语莫4 小时前
Ansible使用简介和基础使用
linux·运维·服务器·nginx·云计算·ansible
qq_312920114 小时前
docker 部署 kvm 图形化管理工具 WebVirtMgr
运维·docker·容器