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 软件安装包
mkdir -p /opt/frpwget https://github.com/fatedier/frp/releases/download/v0.65.0/frp_0.65.0_linux_amd64.tar.gztar -zxvf frp_0.65.0_linux_amd64.tar.gz -C /opt/frp --strip-components=1cd /opt/frp2.2 创建 FRP 组和用户
# 创建 frp 组sudo groupadd frp
# 创建 frp 用户,不允许登录、不创建 home 目录sudo useradd -r -g frp -s /sbin/nologin -M frp2.3 设置权限
# 设置目录所有者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 服务
sudo tee /etc/systemd/system/frps.service <<EOF[Unit]Description=FRP ServerAfter=network.target
[Service]Type=simpleUser=frpWorkingDirectory=/opt/frpExecStart=/opt/frp/frps -c /opt/frp/frps.tomlRestart=alwaysRestartSec=5LimitNOFILE=65536
[Install]WantedBy=multi-user.targetEOF3.3 启动服务
sudo systemctl daemon-reloadsudo systemctl enable frps --nowsudo systemctl status frps3.4 开放防火墙端口
# UFW(Ubuntu)sudo ufw allow 7000/tcp # 服务端口sudo ufw allow 8080/tcp # HTTP 服务端口sudo ufw allow 8443/tcp # HTTPS 服务端口sudo ufw allow 8090/tcpsudo ufw allow 20000:30000/tcp
# firewalld(CentOS)sudo firewall-cmd --permanent --add-port=7000/tcpsudo firewall-cmd --permanent --add-port=8080/tcpsudo firewall-cmd --permanent --add-port=8443/tcpsudo firewall-cmd --permanent --add-port=8090/tcpsudo firewall-cmd --permanent --add-port=20000-30000/tcpsudo 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 = truetransport.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 = truetransport.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 = 3443customDomains = ["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 服务
sudo tee /etc/systemd/system/frpc.service <<EOF[Unit]Description=FRP ClientAfter=network.target
[Service]Type=simpleUser=frpWorkingDirectory=/opt/frpExecStart=/opt/frp/frpc -c /opt/frp/frpc.tomlRestart=alwaysRestartSec=5
[Install]WantedBy=multi-user.targetEOF4.3 启动服务
sudo systemctl daemon-reloadsudo systemctl enable frpc --nowsudo systemctl status frpc五、验证部署
5.1 查看日志:
journalctl -u frps -f # 服务端journalctl -u frpc -f # 客户端5.2 外网访问测试:
如果已经完成穿透配置,则进行访问测试
- TCP 服务:
telnet <公网IP> 8090 - HTTP 服务:浏览器访问
http://app.yourdomain.com
六、卸载清理
# 停止服务sudo systemctl stop frps frpcsudo systemctl disable frps frpc
# 删除文件sudo rm -rf /opt/frpsudo rm -f /etc/systemd/system/frp*.servicesudo userdel frpsudo journalctl --vacuum-time=1s # 清理日志(可选)七、安全建议与常见问题
7.1 安全建议
- Token 长度 ≥ 32 位随机字符串
allowPorts仅放行必要端口- 避免直接暴露 SSH / 数据库端口
- 所有代理启用加密与压缩
- HTTPS 优先在 Nginx 层终止
7.2 常见错误
login to server failed:Token 不一致proxy name already in use:多个客户端使用相同nameconnection refused:防火墙或安全组未放行- HTTP 404:域名未解析或
customDomains配置错误 - 无日志输出:检查日志路径与目录权限
AMD64 Linux 部署 FRP v0.65 内网穿透
https://www.self4m.com/posts/linux-install-frps-and-frpc/
商业用途必须事先获得作者授权;
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。
非商业用途可以使用,但必须注明出处;
若有改编需采用相同许可协议发布。