2173 字
11 分钟
AMD64 Linux 部署 FRP v0.65 内网穿透

由于我和前端开发不在同一个城市,基于远程开发的需要,我需要把服务暴露到公网,供给前端进行接口联调

一开始使用的是花生壳内网穿透,但是每月只有1Gb流量,并且我自己还要使用,流量不够用没办法使用此方案

我自己也在使用Zerotier,但是奈何前端同时说他没办法下载!!! 所以这个方法也行不通

其他同事又推荐了 cpolar ,这是一个国内团队开发的内网穿透工具,但是出于安全性的考虑因此没有使用

找着找着突然发现 Cloudflare 其实就提供了 ZeroTrust Tunnel 内网穿透功能,原本以为问题可以得到解决

但是 Cloudflare Tunnel 解决了如何访问的问题,但访问速度却难以令人满意

再加上前端同事所在的办公环境本身网络条件较差,实际体验可以说是雪上加霜

直到后来我突然想到,公司有一台用于演示的公网服务器,通过它自行搭建内网穿透,问题不就得到解决了吗

于是说干就干,搭建方案总结如下

一、内网穿透工具——FRP#

FRP 是一款非常成熟的开源的由Go语言开发的轻量化内网穿透工具,目前在 Github 上收获了 103K 的 Star

我在很早之前就了解到过,只是感觉配置起来稍微有一点点的复杂,所以没用使用过

不过目前来看只有该方案是最简单的了(部署起来回看很简单,但是过程全是坑)

FRP 由两个独立的程序组成,分别是提供内网穿透服务的 FRPS 服务端,以及用于发起穿透请求的 FRPC 客户端

二、服务器与客户端准备工作#

2.1 下载 FRP 客户端与服务端#

前往 https://github.com/fatedier/frp/releases 下载 FRP 软件安装包

Terminal window
mkdir -p /opt/frp
wget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gz
tar -zxvf frp_0.65.0_linux_amd64.tar.gz -C /opt/frp --strip-components=1
cd /opt/frp

2.2 创建 FRP 组和用户#

Terminal window
# 创建 frp 组
sudo groupadd frp
# 创建 frp 用户,不允许登录、不创建 home 目录
sudo useradd -r -g frp -s /sbin/nologin -M frp

2.3 设置权限#

Terminal window
# 设置目录所有者
sudo chown -R frp:frp /opt/frp
# 目录权限:属主读写执行,属组读执行
sudo chmod 750 /opt/frp
# 确保可执行文件具备执行权限
sudo chmod +x /opt/frp/frps /opt/frp/frpc

三、FRPS 服务端配置#

3.1 配置 /opt/frp/frps.toml#

# =========================
# 基础监听设置
# =========================
# 允许访问的地址,无特殊要求全部放行
bindAddr = "0.0.0.0"
# 服务开放端口
bindPort = 7000
# HTTP 虚拟主机支持(用于 Web 服务域名访问,国内服务器需要进行备案)
# 若不使用 Nginx,可直接将域名解析至服务器公网 IP,由 FRPS 直接接管访问
# 若使用 Nginx,则需要将占用的 80 443 端口设置为其他闲置的端口
# 设置为其他闲置的端口后需要搭配 Nginx 的将通过域名访问的请求反向代理到 FRPS
# HTTP 请求入口端口(不使用 Nginx 则设置为 80)
vhostHTTPPort = 8080
# HTTPS 请求入口端口(可选,不使用 Nginx 则设置为 443)
vhostHTTPSPort = 8443
# HTTP 虚拟主机请求的默认超时时间(单位:秒)
vhostHTTPTimeout = 60
# 允许代理绑定的服务端端口范围,即希望服务端映射到公网的端口范围
# 该数据为数组形式,支持通过 start 和 end 设定端口范围,也支持通过 single 设定单独的端口
# vhostHTTPPort / vhostHTTPSPort 不受 allowPorts 控制
allowPorts = [
{ start = 20000, end = 30000 },
{ single = 8090 }
]
# =========================
# 安全认证
# =========================
[auth]
# 安全认证方式
method = "token"
# 建议设置为32 位以上的高强度随机字符串
# 客户端必须保持与服务端 token 一致才可以完成连接
# token 强度过低将会导致被盗用连接
token = "YOUR_STRONG_RANDOM_TOKEN_HERE"
# =========================
# 日志
# =========================
[log]
# 日志保存位置
to = "/opt/frp/frps.log"
# 日志等级
level = "info"
# 日志保存日期
maxDays = 7
# =========================
# Web 管理面板(可选)
# =========================
[webServer]
# 谨慎开放,具备设备管理能力
# addr = "0.0.0.0"
# Web 管理面板端口
# port = 7500
# Web 管理面板账户名称
# user = "admin"
# Web 管理面板账户密码
# password = "strong_password"

3.2 创建 systemd 服务#

Terminal window
sudo tee /etc/systemd/system/frps.service <<EOF
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
User=frp
WorkingDirectory=/opt/frp
ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
Restart=always
RestartSec=5
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF

3.3 启动服务#

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable frps --now
sudo systemctl status frps

3.4 开放防火墙端口#

Terminal window
# UFW(Ubuntu)
sudo ufw allow 7000/tcp # 服务端口
sudo ufw allow 8080/tcp # HTTP 服务端口
sudo ufw allow 8443/tcp # HTTPS 服务端口
sudo ufw allow 8090/tcp
sudo ufw allow 20000:30000/tcp
# firewalld(CentOS)
sudo firewall-cmd --permanent --add-port=7000/tcp
sudo firewall-cmd --permanent --add-port=8080/tcp
sudo firewall-cmd --permanent --add-port=8443/tcp
sudo firewall-cmd --permanent --add-port=8090/tcp
sudo firewall-cmd --permanent --add-port=20000-30000/tcp
sudo firewall-cmd --reload

云服务商(阿里云、腾讯云等)还需在安全组中放行相应端口!

四、FRPC 客户端配置#

4.1 配置 /opt/frp/frpc.toml#

# =========================
# 连接服务端
# =========================
# 公网服务器地址(IP 或域名)
serverAddr = "YOUR_PUBLIC_SERVER_IP"
# 服务端监听端口(必须与 frps.bindPort 一致)
serverPort = 7000
# 定义唯一用户,避免proxy_name重复而无法穿透
user = "YOUR_NAME"
# =========================
# 安全认证
# =========================
[auth]
# 安全认证方式(必须与 frps.auth.method 一致)
method = "token"
# 客户端必须保持与服务端 token 一致才可以完成连接
token = "YOUR_STRONG_RANDOM_TOKEN_HERE"
# =========================
# 代理配置示例
# =========================
# 示例 1:TCP 转发(适用于 Web、数据库、SSH 等)
# 将本地服务通过公网端口暴露出去(remotePort 需在 frps.allowPorts 范围内)
[[proxies]]
name = "my-web-app"
type = "tcp"
# 内网服务地址
localIP = "127.0.0.1"
# 内网服务端口
localPort = 8080
# 公网暴露端口(需在 allowPorts 范围内)
remotePort = 8090
# 可选:启用传输加密与压缩(会增加 CPU 开销,但更安全、传输更省)
transport.useEncryption = true
transport.useCompression = true
# 示例 2:HTTP 虚拟主机(基于域名访问)
# 需满足:
# 1) frps 配置了 vhostHTTPPort(例如 8080)
# 2) DNS 将域名解析到公网服务器 IP
# 3) 若使用 Nginx,占用 80/443,则由 Nginx 反代到 frps.vhostHTTPPort
[[proxies]]
name = "web-vhost"
type = "http"
# 内网服务地址(http 类型可不写 localIP,默认 127.0.0.1)
localIP = "127.0.0.1"
# 内网服务端口
localPort = 3000
# 通过域名区分不同服务
customDomains = ["app.yourdomain.com"]
transport.useEncryption = true
transport.useCompression = true
# 示例 3:HTTPS 虚拟主机(基于域名访问)
# 需满足:
# 1) frps 配置了 vhostHTTPSPort(例如 8443)
# 2) DNS 将域名解析到公网服务器 IP
# 3) 若使用 Nginx,通常建议在 Nginx 终止 TLS,然后转发到 frps.vhostHTTPPort
# 如果你希望 HTTPS 直接由 frps.vhostHTTPSPort 接入,则需要保证链路与证书配置正确
# localPort 对应的是本地 HTTPS 服务端口,FRP 不负责证书管理
[[proxies]]
name = "web-https"
type = "https"
localIP = "127.0.0.1"
localPort = 3443
customDomains = ["secure.yourdomain.com"]
# =========================
# 日志
# =========================
[log]
# 日志保存位置
to = "/opt/frp/frpc.log"
# 日志等级
level = "info"
# 日志保存日期
maxDays = 7
# =========================
# Web 管理面板(可选)
# =========================
[webServer]
# 仅建议监听本机,避免暴露到公网
addr = "127.0.0.1"
# 本地管理面板端口
port = 7400
# Web 管理面板账户名称
user = "admin"
# Web 管理面板账户密码(建议使用高强度密码)
password = "strong_password"

安全提示

  • 避免暴露 SSH(22)、MySQL(3306)、Redis(6379)等高危端口。如必须暴露,请配合 IP 白名单或前置认证网关
  • 云服务商(阿里云、腾讯云等)还需在安全组中放行相应端口!

4.2 创建 systemd 服务#

Terminal window
sudo tee /etc/systemd/system/frpc.service <<EOF
[Unit]
Description=FRP Client
After=network.target
[Service]
Type=simple
User=frp
WorkingDirectory=/opt/frp
ExecStart=/opt/frp/frpc -c /opt/frp/frpc.toml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF

4.3 启动服务#

Terminal window
sudo systemctl daemon-reload
sudo systemctl enable frpc --now
sudo systemctl status frpc

五、验证部署#

5.1 查看日志#

Terminal window
journalctl -u frps -f # 服务端
journalctl -u frpc -f # 客户端

5.2 外网访问测试#

如果已经完成穿透配置,则进行访问测试

  • TCP 服务:telnet <公网IP> 8090
  • HTTP 服务:浏览器访问 http://app.yourdomain.com

六、卸载清理#

Terminal window
# 停止服务
sudo systemctl stop frps frpc
sudo systemctl disable frps frpc
# 删除文件
sudo rm -rf /opt/frp
sudo rm -f /etc/systemd/system/frp*.service
sudo userdel frp
sudo journalctl --vacuum-time=1s # 清理日志(可选)

七、安全建议与常见问题#

7.1 安全建议#

  • Token 长度 ≥ 32 位随机字符串
  • allowPorts 仅放行必要端口
  • 避免直接暴露 SSH / 数据库端口
  • 所有代理启用加密与压缩
  • HTTPS 优先在 Nginx 层终止

7.2 常见错误#

  • login to server failed:Token 不一致
  • proxy name already in use:多个客户端使用相同 name
  • connection refused:防火墙或安全组未放行
  • HTTP 404:域名未解析或 customDomains 配置错误
  • 无日志输出:检查日志路径与目录权限
AMD64 Linux 部署 FRP v0.65 内网穿透
https://www.self4m.com/posts/linux-install-frps-and-frpc/
✍️作者
Self4m
📅发布于
2025-12-15
©️许可协议
CC BY-NC-SA 4.0

商业用途必须事先获得作者授权;
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。