FRP部署教程

天下人苦NAT久矣!

喜大普奔!

两部门关于开展“网络去NAT”专项工作 进一步深化IPv6部署应用的通知_国务院部门文件_中国政府网 (www.gov.cn)

下载FRP

本次使用:(GitHub)FRP版本0.38

其他版本:Releases · fatedier/frp (github.com)

**注意:**新版本的frp使用了新的配置文件格式toml,配置比较麻烦,资料很少。故本次使用老版本。

压缩包中已经包含了服务端和客户端。

概念理解

可以理解为FRP是一个网络中继器,我们无法从公网找到内网中的设备,但是可以从公网找到一个部署在公网中的中继器,即FRP

内网主机也可以访问公网中继器,因此终端和内网主机就间接地连接起来了。

中继器通过心跳机制一直维护着连接,我们的流量从终端发送到FRP中继器,FRP转发我们的流量到内网主机。

而公网中继器连接内网主机,需要内网主机先向公网中继器发送连接,且中继转发后的流量也需要被内网主机处理,因此我们需要在内网主机中安装一个与公网中继器配套的流量处理软件。

我们称公网中继器为服务端,在frp软件中是为frps。对应配置文件是frps.ini(新版FRP为frps.toml)

我们称内网流量处理软件为客户端,在frp中是为frpc。对应配置文件是frpc.ini(新版FRP为frpc.toml)

服务端部署

采取Systemd的方式可以使FRP更加稳定的运行。我们需要配置一个Systemd服务:

/etc/systemd/system下创建一个文件frps.service,并写入以下内容:

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/jack/workplace/tools/frp/frp/frpc -c /home/jack/workplace/tools/frp/frp/frpc.ini

[Install]
WantedBy = multi-user.target

此时我们已经注册FRP为系统中的一项服务,但是我们没有完成FRP的配置设置:

在FRP的安装目录下找到frps.inifrps.toml,修改其中的内容:

[common]
#服务绑定端口(即客户端服务端交互端口)
bind_port = 7000
#连接密码,可以定义,可不配置
token = password
#控制面板web端口,完成后可通过ip:端口访问控制台
dashboard_port = 7500
#控制台配置,输入信息正确后才能进入控制台
dashboard_user = username
dashboard_pwd = username_password
enable_prometheus = true
#日志输出配置
log_file = /apps/frp/frp/log/logs
log_level = info
log_max_days = 7
# 设置启动Http协议转发,端口号可自定义
vhost_http_port = 7001
vhost_https_port = 7002

完成配置后,执行以下命令启动frp:

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

客户端部署

/etc/systemd/system下创建一个文件frpc.service,并写入以下内容:

[Unit]
# 服务名称,可自定义
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
# 启动frps的命令,需修改为您的frps的安装路径
ExecStart = /home/jack/workplace/tools/frp/frp/frpc -c /home/jack/workplace/tools/frp/frp/frpc.ini

[Install]
WantedBy = multi-user.target

编辑FRP配置文件:

[common]
server_addr = 38.207.179.186
# 修改为你设置的服务器端口
server_port = 7000
token = password
#日志配置
log_file = /home/jack/workplace/tools/frp/logs/log
log_level = info
log_max_days = 7
# 配置ssh服务
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 9999

# 配置http服务
[web]
type = http
local_port = 80
remote_port = 7001
#custom_domains或subdomain必须配置其中之一,没有域名可写IP
custom_domains = blog.saltfish.club

完成配置后,执行以下命令启动frp:

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

检查部署情况:

  1. 检查服务端运行是否正常:

    访问ip:dashbord端口,出现前端界面即工作正常(若有配置则须输入密码)

    Clip_2024-07-18_20-13-29

  2. 检查客户端是否正常:

    执行:

    systemctl status frpc
    

    若回显信息正常,则工作正常:

    ● frpc.service - frp server
         Loaded: loaded (/etc/systemd/system/frpc.service; enabled; vendor preset: enabled)
         Active: active (running) since Thu 2024-07-18 11:14:07 UTC; 1h 0min ago
       Main PID: 3465060 (frpc)
          Tasks: 6 (limit: 9281)
         Memory: 4.9M
            CPU: 5.599s
         CGroup: /system.slice/frpc.service
                 └─3465060 /home/jack/workplace/tools/frp/frp/frpc -c /home/jack/workplace/tools/frp/frp/frpc.ini
    
    Jul 18 11:14:07 ubuntuserver systemd[1]: Started frp server.
    

错误排查

  1. FRP的客户端和服务端是互通的,因此出现报错时,错误并不一定发生在当前端。

  2. 尽量配置日志输出,方便问题排查

  3. 配合Nginx进行反向代理时,会出现EOF问题,解决办法:

    修改代理路径配置:

    	location / {
    		proxy_pass http://127.0.0.1:7001;
    		proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    	}
    
  4. 出现错误:

    2024/07/18 18:08:40 [W] [http.go:92] do http proxy request error: no such domain: 127.0.0.1 /

    原因通常是subdomaincustomdomain出现问题,请注意查看配置。

    解决办法:修正配置或仅配置custom_domains项。