搭建内网穿透环境 FRP 实战
实例场景
-
公网服务器:腾讯云/阿里云,IP:
xx.xx.xx.xx -
内网机器:家里的树莓派/旧电脑,euler,IP:
192.168.1.151 -
目标:在外网能 SSH 登录家里的机器,并能访问家里的 Web 服务
第一步:准备工作
1.1 下载 FRP
在公网服务器和内网机器上都执行(注意选择对应系统的版本):
bash
# 查看系统架构 arch # x86_64 系统下载 amd64 版本 # armv7l 系统下载 arm64 版本 # 下载最新版本(以 v0.58.0 为例) wget https://github.com/fatedier/frp/releases/download/v0.58.0/frp_0.58.0_linux_amd64.tar.gz # 解压 tar -zxvf frp_0.58.0_linux_amd64.tar.gz cd frp_0.58.0_linux_amd64
1.2 文件说明
-
frps.toml:服务端程序及配置文件(用于公网服务器) -
frpc.toml:客户端程序及配置文件(用于内网机器) -
frps-full.example.toml:服务端配置示例(参考用)
第二步:配置服务端(公网服务器)
2.1 编辑配置文件
bash
# 进入目录 cd ~/frp_0.58.0_linux_amd64 # 编辑服务端配置 vim frps.toml
写入以下内容:
toml
# frps.toml
bindPort = 7000 # frp 服务端通信端口
kcpBindPort = 7000 # KCP 协议支持(可选,用于优化弱网环境)
# 身份验证
auth.method = "token"
auth.token = "MySecureToken123!@#" # 自定义一个复杂密码
# 仪表盘配置(可选,用于监控)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin123"
# 日志配置
log.to = "./frps.log"
log.level = "info"
log.maxDays = 3
2.2 启动服务端
bash
# 前台启动(测试用) ./frps -c frps.toml # 如果能正常运行,按 Ctrl+C 停止,改为后台运行
2.3 使用 systemd 管理服务(推荐)
bash
# 创建 systemd 服务文件 sudo vim /etc/systemd/system/frps.service
写入:
ini
[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=root Restart=on-failure RestartSec=5s ExecStart=/home/ubuntu/frp_0.58.0_linux_amd64/frps -c /home/ubuntu/frp_0.58.0_linux_amd64/frps.toml LimitNOFILE=1048576 [Install] WantedBy=multi-user.target
启动服务:
bash
# 重新加载 systemd sudo systemctl daemon-reload # 启动服务 sudo systemctl start frps # 设置开机自启 sudo systemctl enable frps # 查看状态 sudo systemctl status frps # 查看日志 sudo journalctl -u frps -f
遇到的错误
[root@iZj6c5292t3vftcw67j1p0Z frp_0.58.0_linux_amd64]# systemctl status frps
● frps.service - Frp Server Service
Loaded: loaded (/etc/systemd/system/frps.service; disabled; vendor preset: disabled)
Active: activating (auto-restart) (Result: exit-code) since Tue 2026-03-10 11:53:12 CST; 3s ago
Process: 7346 ExecStart=/root/frp_0.58.0_linux_amd64/frps -c /root/frp_0.58.0_linux_amd64/frps.toml (code=exited, status=203/EXEC)
Main PID: 7346 (code=exited, status=203/EXEC)Mar 10 11:53:12 iZj6c5292t3vftcw67j1p0Z systemd[1]: frps.service: Main process exited, code=exited, status=203/EXEC
Mar 10 11:53:12 iZj6c5292t3vftcw67j1p0Z systemd[1]: frps.service: Failed with result 'exit-code'.
权限问题 编写的sever脚本 用户使用的
User=nobody 改为 User=root 就正确了
因为我的程序 是放在 /root/frp_0.58.0_linux_amd64/frps 下的
如果不想使用root 运行 可以将程序 移到其他位置 并修改权限
2.4 防火墙设置
bash
# 开放端口 #ubuntu debian 服务器 sudo ufw allow 7000/tcp # frp 通信端口 sudo ufw allow 7000/udp # KCP 端口(如果启用了) sudo ufw allow 7500/tcp # 仪表盘端口 sudo ufw allow 6000/tcp # SSH 穿透端口 sudo ufw allow 8080/tcp # Web 穿透端口 #openeuler服务器 sudo firewall-cmd --zone=public --add-port=7000/tcp --permanent # 云服务器记得在安全组也开放这些端口
第三步:配置客户端(内网机器)
3.1 编辑配置文件
bash
cd ~/frp_0.58.0_linux_amd64 vim frpc.toml
写入以下内容:
toml
# frpc.toml serverAddr = "xx.xx.xx.xx" # 你的公网服务器 IP serverPort = 7000 # 与服务端的 bindPort 一致 # 身份验证(必须与服务端一致) auth.method = "token" auth.token = "MySecureToken123!@#" # 日志配置 log.to = "./frpc.log" log.level = "info" log.maxDays = 3 # ============ 代理配置 ============ # 1. SSH 服务穿透 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000 # 访问公网服务器的 6000 端口 = 访问内网的 22 端口 # 2. Web 服务穿透(例如家里的 NAS 或 Web 应用) [[proxies]] name = "portainer" # 穿透服务名 type = "tcp" # 代理的类型为 TCP 协议 localIP = "192.168.1.151" # 指定要穿透的本地服务所在的 IP 地址 内网 IP,也可以用 127.0.0.1 /如用是访问 Docker容器 服务这里使用docker 网关 IP:172.17.0.1 localPort = 80 # 指定要穿透的本地服务的端口号 remotePort = 8080 # 指定在 FRP 服务端(具有公网 IP 的服务器)上监听的端口号 # 3. 如果有多个 Web 服务,可以用 HTTP 类型(需要服务端配置 vhostHTTPPort) # [[proxies]] # name = "blog" # type = "http" # localPort = 8080 # customDomains = ["blog.example.com"] # 需要域名解析到公网服务器
3.2 启动客户端
bash
# 测试启动 ./frpc -c frpc.toml # 如果正常,会显示 "start proxy success" # 按 Ctrl+C 停止,然后配置为服务
3.3 使用 systemd 管理客户端
bash
sudo vim /etc/systemd/system/frpc.service
写入:
ini
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=gs1
Group=gensang
Restart=on-failure
RestartSec=5s
#注意 frpc 放在home 目录下会 被selinux 阻止 这里将其放到 /usr/local/目录下
ExecStart=/usr/local/frpc/frpc -c /usr/local/frpc/frpc.toml
LimitNOFILE=1048576
[Install]
WantedBy=multi-user.target
启动服务:
bash
sudo systemctl daemon-reload sudo systemctl start frpc sudo systemctl enable frpc sudo systemctl status frpc
第四步:测试连接
4.1 测试 SSH 穿透
在任意外网电脑上执行:
bash
# 假设内网机器的用户名是 pi ssh -p 6000 pi@xx.xx.xx.xx
如果能成功登录,说明 SSH 穿透成功!🎉
4.2 测试 Web 服务
-
首先在内网机器上启动一个测试 Web 服务:
bash
# 如果没安装 python3,先安装 python3 -m http.server 80
-
在外网浏览器访问:
text
http://xx.xx.xx.xx:8080
如果能看到目录列表,说明 Web 穿透成功!🎉
4.3 查看监控仪表盘
浏览器访问:
text
http://xx.xx.xx.xx:7500
用户名密码:admin / admin12345
第五步:高级配置示例
5.1 多个 SSH 用户
toml
# frpc.toml [[proxies]] name = "ssh-pi" type = "tcp" localIP = "192.168.1.151" localPort = 22 remotePort = 6001 [[proxies]] name = "ssh-ubuntu" type = "tcp" localIP = "192.168.1.151" localPort = 22 remotePort = 6002
5.2 STCP 模式(安全的 TCP,需要双方都装 frpc)
toml
# 服务端无需特殊配置,客户端配置: [[proxies]] name = "secret-ssh" type = "stcp" secretKey = "your-secret-key" localIP = "127.0.0.1" localPort = 22 # 访问方配置: [[visitors]] name = "secret-ssh-visitor" type = "stcp" serverAddr = "xx.xx.xx.xx" serverPort = 7000 secretKey = "your-secret-key" bindAddr = "127.0.0.1" bindPort = 2222
5.3 负载均衡
toml
# frpc.toml(多台内网机器) [[proxies]] name = "web1" type = "tcp" localIP = "192.168.1.101" localPort = 80 remotePort = 8080 group = "web" groupKey = "web-group-key" [[proxies]] name = "web2" type = "tcp" localIP = "192.168.1.102" localPort = 80 remotePort = 8080 group = "web" groupKey = "web-group-key"
常见问题排查
❌ 连接失败
-
检查防火墙:确保公网服务器的端口都开放了
-
检查 token:服务端和客户端的 token 必须一致
-
查看日志:
journalctl -u frpc -f或查看 frp 目录下的 .log 文件
❌ SSH 连接被拒绝
bash
# 检查内网机器的 SSH 服务 systemctl status sshd # 测试本地是否能连 ssh localhost
❌ 端口被占用
bash
# 查看端口占用 netstat -tlnp | grep 7000
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐

所有评论(0)