FRP 内网穿透完全指南
GTP-5
FRP 是一个功能强大、配置灵活的内网穿透工具,希望这份文档能帮助您快速上手 FRP,实现安全高效的内网穿透!🚀
GTP-5
FRP 是一个功能强大、配置灵活的内网穿透工具,希望这份文档能帮助您快速上手 FRP,实现安全高效的内网穿透!🚀
FRP (Fast Reverse Proxy) 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP、UDP、HTTP、HTTPS 等多种协议。可以将内网服务以安全、便捷的方式通过具有公网 IP 的节点中转暴露到公网。
┌─────────────┐ ┌──────────────┐ ┌─────────────┐
│ │ │ │ │ │
│ 客户端 │◄────────┤ 公网服务器 ├────────►│ 内网服务 │
│ (访问者) │ │ (frps) │ │ (frpc) │
│ │ │ │ │ │
└─────────────┘ └──────────────┘ └─────────────┘
公网访问 中转服务器 本地服务
| 端口 | 用途 | 说明 |
|---|---|---|
| 7000 | frp 服务端口 | frpc 与 frps 通信 |
| 7500 | Dashboard | Web 管理面板 |
| 80 | HTTP | HTTP 服务穿透 |
| 443 | HTTPS | HTTPS 服务穿透 |
| 6000-6100 | TCP/UDP | 自定义服务端口 |
访问 GitHub 发布页面:https://github.com/fatedier/frp/releases
# 服务端(假设是 Linux amd64)
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz
# 解压
tar -xzf frp_0.53.2_linux_amd64.tar. gz
mv frp_0.53.2_linux_amd64 frp
cd frp
# 查看文件
ls -la
# frpc - 客户端可执行文件
# frps - 服务端可执行文件
# frpc. ini - 客户端配置文件
# frps.ini - 服务端配置文件
# Linux ARM (树莓派)
wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_arm64.tar.gz
# macOS
wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_darwin_amd64.tar.gz
# Windows
# 下载 frp_0.53.2_windows_amd64.zip 并解压
# 创建配置目录
mkdir -p /opt/frp/conf
# 创建配置文件(见下文配置示例)
vim /opt/frp/conf/frps.ini
# 运行容器
docker run -d \
--name frps \
--restart=always \
--network host \
-v /opt/frp/conf/frps.ini:/etc/frp/frps.ini \
snowdreamtech/frps:latest
# 创建配置文件
mkdir -p ~/frp
vim ~/frp/frpc. ini
# 运行容器
docker run -d \
--name frpc \
--restart=always \
--network host \
-v ~/frp/frpc.ini:/etc/frp/frpc.ini \
snowdreamtech/frpc:latest
# 安装 Go 环境 (需要 Go 1.20+)
# 参考:https://golang.org/doc/install
# 克隆仓库
git clone https://github.com/fatedier/frp.git
cd frp
# 编译
make
# 编译后的文件在 bin/ 目录下
ls bin/
[common]
# 监听地址,0.0.0.0 表示监听所有网卡
bind_addr = 0.0.0.0
# frp 服务端口,用于接收 frpc 连接
bind_port = 7000
# HTTP 服务端口
vhost_http_port = 80
# HTTPS 服务端口
vhost_https_port = 443
# Dashboard 管理面板配置
dashboard_addr = 0.0.0.0
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = your_secure_password
# 启用 Prometheus 监控
enable_prometheus = true
# 日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
# 身份验证令牌(重要!)
authentication_method = token
token = your_secret_token_here
# 心跳配置
heartbeat_timeout = 90
# 允许客户端绑定的端口范围
allow_ports = 6000-6100,8000-8100
[common]
bind_addr = 0.0.0.0
bind_port = 7000
token = your_secret_token
# 子域名配置
subdomain_host = frp.example.com
# 最大连接池大小
max_pool_count = 5
# TCP 多路复用
tcp_mux = true
tcp_mux_keepalive_interval = 60
# TLS 配置
tls_only = false
# tls_cert_file = /path/to/cert.pem
# tls_key_file = /path/to/key. pem
# 自定义 404 页面
# custom_404_page = /path/to/404.html
# 端口白名单(只允许这些端口)
# allow_ports = 2000-3000,3001,3003,4000-50000
# 限制单个客户端的最大连接数
max_ports_per_client = 0
# 启用 TLS 加密(客户端也需要配置)
# tls_enable = true
[common]
# 服务器地址(公网 IP 或域名)
server_addr = your_server_ip
server_port = 7000
# 身份验证令牌(必须与服务端一致)
authentication_method = token
token = your_secret_token
# 日志配置
log_file = /var/log/frpc. log
log_level = info
log_max_days = 3
# 客户端管理面板
admin_addr = 127.0.0.1
admin_port = 7400
admin_user = admin
admin_pwd = admin
# 连接池配置
pool_count = 5
# 心跳间隔
heartbeat_interval = 30
heartbeat_timeout = 90
# TCP 多路复用
tcp_mux = true
# 启动时自动连接
login_fail_exit = true
# 协议类型
protocol = tcp
[common]
server_addr = your_server_ip
server_port = 7000
token = your_secret_token
# 穿透 Web 服务
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
# 自定义域名(需要域名解析到服务器 IP)
custom_domains = www.example.com
# 或者使用子域名
# subdomain = myapp
# 实际访问地址:myapp.frp.example.com
# HTTP 认证
http_user = user
http_pwd = password
# 自定义 Host Header
host_header_rewrite = localhost
# 添加自定义 Header
header_X-From-Where = frp
[https_web]
type = https
local_ip = 127.0.0.1
local_port = 443
custom_domains = secure.example.com
# 如果本地是 HTTP,通过 frps 加 TLS
# plugin = https2http
# plugin_local_addr = 127.0.0.1:80
# SSH 穿透
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
# 远程端口
remote_port = 6000
# 使用加密和压缩
use_encryption = true
use_compression = true
# MySQL 穿透
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 6001
use_encryption = true
# RDP 远程桌面穿透
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6002
# DNS 服务穿透
[dns]
type = udp
local_ip = 8.8.8.8
local_port = 53
remote_port = 6003
# 游戏服务器穿透
[game_server]
type = udp
local_ip = 127.0.0.1
local_port = 7777
remote_port = 7777
# 服务端(提供服务的一方)
[secret_ssh]
type = stcp
# 访问密钥
sk = secret_key
local_ip = 127.0.0.1
local_port = 22
# 客户端(访问服务的一方)需要配置 visitor
访问者配置:
[secret_ssh_visitor]
type = stcp
# 要访问的服务名称
server_name = secret_ssh
# 访问密钥(必须与服务端一致)
sk = secret_key
# 本地监听端口
bind_addr = 127.0.0.1
bind_port = 6000
# 服务器 1
[web01]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = www.example.com
group = web
group_key = 123456
# 服务器 2
[web02]
type = http
local_ip = 127.0.0.1
local_port = 8081
custom_domains = www.example.com
group = web
group_key = 123456
[web_with_health_check]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = www.example.com
# 健康检查配置
health_check_type = http
health_check_url = /health
health_check_interval_s = 10
health_check_max_failed = 3
health_check_timeout_s = 3
将本地运行在 localhost:3000 的 Web 应用暴露到公网。
[common]
bind_port = 7000
vhost_http_port = 80
token = my_secret_token_2024
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = admin123
[common]
server_addr = 1.2.3.4
server_port = 7000
token = my_secret_token_2024
[web_app]
type = http
local_ip = 127.0.0.1
local_port = 3000
custom_domains = myapp.example.com
# 服务端
./frps -c frps.ini
# 客户端
./frpc -c frpc.ini
浏览器访问:http://myapp.example.com
在任何地方通过公网服务器 SSH 到家里的 Linux 机器。
[common]
server_addr = your_vps_ip
server_port = 7000
token = ssh_token_2024
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000
use_encryption = true
use_compression = true
# 通过公网服务器连接
ssh -p 6000 user@your_vps_ip
# 或者在 ~/. ssh/config 中配置
Host home-server
HostName your_vps_ip
Port 6000
User your_username
# 然后可以直接使用
ssh home-server
微信要求回调地址必须是 HTTPS,本地开发需要穿透。
[common]
server_addr = your_vps_ip
server_port = 7000
token = wechat_dev_token
[wechat_dev]
type = https
local_ip = 127.0.0.1
local_port = 3000
custom_domains = wechat.example.com
# 如果本地是 HTTP 服务
plugin = https2http
plugin_local_addr = 127.0.0.1:3000
# 添加自定义 Header
header_X-Real-IP = visitor
在服务端安装 Let's Encrypt 证书:
# 安装 certbot
sudo apt install certbot
# 申请证书
sudo certbot certonly --standalone -d wechat.example.com
# 证书路径
# /etc/letsencrypt/live/wechat.example. com/fullchain.pem
# /etc/letsencrypt/live/wechat.example.com/privkey.pem
配置 Nginx 反向代理(在 VPS 上):
server {
listen 443 ssl http2;
server_name wechat.example.com;
ssl_certificate /etc/letsencrypt/live/wechat.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/wechat.example.com/privkey. pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
远程访问家里的群晖 NAS (DSM 管理界面和文件服务)。
[common]
server_addr = your_vps_ip
server_port = 7000
token = nas_token_2024
# DSM Web 管理界面
[dsm_http]
type = http
local_ip = 192.168.1.100
local_port = 5000
custom_domains = nas.example.com
# HTTPS 管理界面
[dsm_https]
type = https
local_ip = 192.168.1.100
local_port = 5001
custom_domains = nas.example.com
# SSH 访问
[nas_ssh]
type = tcp
local_ip = 192.168.1.100
local_port = 22
remote_port = 6022
use_encryption = true
# FTP 文件传输
[nas_ftp]
type = tcp
local_ip = 192.168.1.100
local_port = 21
remote_port = 6021
同时穿透多个内网服务(Web、数据库、RDP 等)。
[common]
server_addr = your_vps_ip
server_port = 7000
token = multi_service_token
admin_addr = 127.0.0.1
admin_port = 7400
# 前端项目
[frontend]
type = http
local_ip = 127.0.0.1
local_port = 3000
custom_domains = frontend. example.com
# 后端 API
[backend]
type = http
local_ip = 127.0.0.1
local_port = 8080
custom_domains = api.example.com
# MySQL 数据库
[mysql]
type = tcp
local_ip = 127.0.0.1
local_port = 3306
remote_port = 6306
use_encryption = true
# Redis 缓存
[redis]
type = tcp
local_ip = 127.0.0.1
local_port = 6379
remote_port = 6380
use_encryption = true
# Windows 远程桌面
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 6389
# 内网文件共享
[samba]
type = tcp
local_ip = 192.168.1.10
local_port = 445
remote_port = 6445
远程访问和控制家里的树莓派。
# 下载 ARM 版本
cd ~
wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_arm64.tar.gz
tar -xzf frp_0.53.2_linux_arm64.tar.gz
cd frp_0.53.2_linux_arm64
[common]
server_addr = your_vps_ip
server_port = 7000
token = raspberry_pi_token
log_file = /home/pi/frpc.log
# SSH 访问
[pi_ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6022
use_encryption = true
# VNC 远程桌面
[pi_vnc]
type = tcp
local_ip = 127.0.0.1
local_port = 5900
remote_port = 6900
# Home Assistant (如果安装了)
[homeassistant]
type = http
local_ip = 127.0.0.1
local_port = 8123
custom_domains = home.example.com
创建系统服务文件:
sudo vim /etc/systemd/system/frpc.service
写入以下内容:
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=pi
Restart=on-failure
RestartSec=5s
ExecStart=/home/pi/frp_0.53.2_linux_arm64/frpc -c /home/pi/frp_0.53.2_linux_arm64/frpc.ini
ExecReload=/bin/kill -s HUP $MAINPID
[Install]
WantedBy=multi-user.target
启动服务:
# 重载配置
sudo systemctl daemon-reload
# 启动服务
sudo systemctl start frpc
# 设置开机自启
sudo systemctl enable frpc
# 查看状态
sudo systemctl status frpc
和朋友一起玩局域网游戏服务器。
[common]
server_addr = your_vps_ip
server_port = 7000
token = game_server_token
# Minecraft Java 版
[minecraft]
type = tcp
local_ip = 127.0.0.1
local_port = 25565
remote_port = 25565
use_compression = true
# Minecraft 基岩版
[minecraft_bedrock]
type = udp
local_ip = 127.0.0.1
local_port = 19132
remote_port = 19132
玩家连接:your_vps_ip:25565
[common]
log_level = trace # 最详细的日志级别
日志级别:trace > debug > info > warn > error
# 不使用 -d 参数,直接在前台运行
./frps -c frps.ini
# 或客户端
./frpc -c frpc.ini
# Linux
netstat -tulnp | grep 7000
ss -tulnp | grep 7000
lsof -i: 7000
# 检查 frp 进程
ps aux | grep frp
# 测试服务端端口是否开放
telnet your_vps_ip 7000
nc -vz your_vps_ip 7000
# 测试 HTTP 穿透
curl -v http://your_domain.com
curl -H "Host: your_domain.com" http://your_vps_ip
# 测试 TCP 穿透
telnet your_vps_ip 6000
访问服务端 Dashboard:
http://your_vps_ip:7500
可以查看:
客户端 Admin 面板:
http://127.0.0.1:7400
# 使用 tcpdump 抓包
sudo tcpdump -i any port 7000 -w frp.pcap
# 使用 Wireshark 分析
wireshark frp.pcap
# 查看服务日志
tail -f /var/log/frps.log
tail -f /var/log/frpc.log
# 查看 systemd 服务日志
journalctl -u frps -f
journalctl -u frpc -f
# 查看最近 100 行
journalctl -u frpc -n 100
# 验证配置文件语法
./frps verify -c frps.ini
./frpc verify -c frpc.ini
# 重载配置(需要配置 admin_port)
curl http://127.0.0.1:7400/api/reload
# 查看客户端状态
curl http://127.0.0.1:7400/api/status
# 查看代理配置
curl http://127.0.0.1:7400/api/config
#!/bin/bash
# frp_debug.sh - FRP 问题排查脚本
echo "=== FRP 调试信息收集 ==="
echo -e "\n1. 检查 frp 进程"
ps aux | grep frp | grep -v grep
echo -e "\n2. 检查端口监听"
netstat -tulnp | grep -E "7000|7500|80|443"
echo -e "\n3. 检查防火墙状态"
sudo ufw status
sudo iptables -L -n | grep -E "7000|80|443"
echo -e "\n4. 测试网络连接"
ping -c 3 your_vps_ip
telnet your_vps_ip 7000
echo -e "\n5. 检查配置文件"
cat frpc.ini | grep -v "^#" | grep -v "^$"
echo -e "\n6. 查看最近日志"
tail -20 /var/log/frpc.log
echo -e "\n7. 检查系统资源"
free -h
df -h
top -bn1 | head -20
echo "=== 调试信息收集完成 ==="
[common]
# 使用复杂的 token
token = $(openssl rand -base64 32)
# Dashboard 强密码
dashboard_pwd = $(openssl rand -base64 16)
服务端配置:
[common]
bind_port = 7000
tls_only = true
客户端配置:
[common]
tls_enable = true
[common]
# 只允许特定端口
allow_ports = 6000-6100
# 限制每个客户端的端口数
max_ports_per_client = 5
使用防火墙限制访问:
# 只允许特定 IP 访问 frp 服务端口
sudo ufw allow from 1.2.3.4 to any port 7000
sudo ufw allow from 5.6.7.8 to any port 7000
sudo ufw deny 7000
# 或使用 iptables
sudo iptables -A INPUT -p tcp -s 1.2.3.4 --dport 7000 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 7000 -j DROP
[web]
type = http
local_port = 8080
custom_domains = app.example.com
# 添加 HTTP 基础认证
http_user = admin
http_pwd = secure_password_here
# 更安全的点对点连接
[secret_service]
type = stcp
sk = $(openssl rand -base64 32)
local_ip = 127.0.0.1
local_port = 22
使用 Cloudflare 等 CDN 服务隐藏服务器真实 IP:
客户端 → Cloudflare CDN → frps 服务器 → frpc → 内网服务
服务端限制带宽:
# 使用 tc 命令限制带宽
tc qdisc add dev eth0 root tbf rate 10mbit burst 32kbit latency 400ms
# 定期检查更新
curl -s https://api.github.com/repos/fatedier/frp/releases/latest | grep tag_name
# 自动更新脚本
#!/bin/bash
LATEST=$(curl -s https://api.github.com/repos/fatedier/frp/releases/latest | grep tag_name | cut -d '"' -f 4)
CURRENT=$(./frps --version | awk '{print $3}')
if [ "$LATEST" != "$CURRENT" ]; then
echo "New version available: $LATEST"
# 执行更新逻辑
fi
[common]
tcp_mux = true
tcp_mux_keepalive_interval = 60
[common]
# 客户端配置
pool_count = 5
# 服务端配置
max_pool_count = 10
[web]
type = http
local_port = 8080
custom_domains = app.example.com
use_compression = true
[common]
# 减少心跳频率(适用于稳定网络)
heartbeat_interval = 60
heartbeat_timeout = 180
# 增加文件描述符限制
ulimit -n 65535
# 修改 /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# 优化 TCP 参数
sudo sysctl -w net.core.rmem_max=26214400
sudo sysctl -w net.core.wmem_max=26214400
sudo sysctl -w net.ipv4.tcp_rmem='4096 87380 26214400'
sudo sysctl -w net.ipv4.tcp_wmem='4096 65536 26214400'
# 安装 dnsmasq
sudo apt install dnsmasq
# 配置本地 DNS
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
http {
# 启用 HTTP/2
server {
listen 443 ssl http2;
# 启用 gzip 压缩
gzip on;
gzip_types text/plain application/json;
# 缓冲区优化
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
# 保持长连接
proxy_http_version 1.1;
proxy_set_header Connection "";
location / {
proxy_pass http://127.0.0.1:8080;
}
}
}
原因:
解决:
# 检查防火墙
sudo ufw allow 7000
sudo firewall-cmd --add-port=7000/tcp --permanent
# 检查服务状态
systemctl status frps
# 测试连接
telnet server_ip 7000
原因:token 不匹配
解决: 确保服务端和客户端的 token 完全一致。
原因:
解决:
# 检查域名解析
nslookup your_domain.com
dig your_domain.com
# 检查服务端配置
grep vhost_http_port frps.ini
# 测试
curl -H "Host: your_domain.com" http://server_ip
错误信息:bind: address already in use
解决:
# 查找占用端口的进程
sudo lsof -i: 7000
sudo netstat -tulnp | grep 7000
# 杀死进程
sudo kill -9 PID
# 或更换端口
解决:
# 检查配置
[common]
dashboard_addr = 0.0.0.0 # 不要用 127.0.0.1
dashboard_port = 7500
# 开放防火墙
sudo ufw allow 7500
原因:
解决:
[common]
# 增加超时时间
heartbeat_timeout = 180
# 启用 TCP keepalive
tcp_mux = true
解决:
# 启用压缩
use_compression = true
# 增加连接池
pool_count = 10
# 优化 TCP
tcp_mux = true
解决:
# 使用 Let's Encrypt 申请免费证书
sudo certbot certonly --standalone -d your_domain.com
# 或者使用 plugin 插件
[web]
type = https
plugin = https2http
plugin_local_addr = 127.0.0.1:80
检查:
# 确认本地服务正在运行
netstat -tuln | grep 8080
curl http://localhost:8080
# 检查防火墙
sudo ufw status
# 查看 frpc 日志
tail -f /var/log/frpc.log
优化:
# 增加连接池
pool_count = 20
max_pool_count = 50
# 启用 TCP 多路复用
tcp_mux = true
# 系统优化
ulimit -n 65535
服务端 (/etc/systemd/system/frps.service):
[Unit]
Description=Frp Server Service
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/opt/frp/frps -c /opt/frp/frps.ini
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
客户端 (/etc/systemd/system/frpc.service):
[Unit]
Description=Frp Client Service
After=network.target
[Service]
Type=simple
User=frp
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/bin/kill -s HUP $MAINPID
LimitNOFILE=65536
[Install]
WantedBy=multi-user. target
启动服务:
sudo systemctl daemon-reload
sudo systemctl start frps
sudo systemctl enable frps
sudo systemctl status frps
创建 /etc/logrotate.d/frp:
/var/log/frps.log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
create 0644 root root
postrotate
systemctl reload frps > /dev/null 2>&1 || true
endscript
}
/var/log/frpc. log {
daily
rotate 7
missingok
notifempty
compress
delaycompress
create 0644 frp frp
postrotate
systemctl reload frpc > /dev/null 2>&1 || true
endscript
}
使用 Prometheus + Grafana 监控:
# prometheus.yml
scrape_configs:
- job_name: 'frps'
static_configs:
- targets: ['localhost:7500']
#!/bin/bash
# backup_frp_config.sh
BACKUP_DIR="/backup/frp"
DATE=$(date +%Y%m%d_%H%M%S)
mkdir -p $BACKUP_DIR
# 备份配置文件
cp /opt/frp/frps.ini $BACKUP_DIR/frps_$DATE.ini
cp /etc/frp/frpc.ini $BACKUP_DIR/frpc_$DATE.ini
# 保留最近 30 天的备份
find $BACKUP_DIR -name "*. ini" -mtime +30 -delete
echo "Backup completed: $DATE"
使用多个 frps 服务器 + Keepalived:
客户端 → VIP (Keepalived) → frps-master / frps-backup
FRP 是一个功能强大、配置灵活的内网穿透工具,适用于各种场景。掌握以下要点:
✅ 核心概念:理解 frps/frpc 的工作原理 ✅ 安全第一:使用强 token、启用加密、限制访问 ✅ 合理配置:根据实际需求选择合适的代理类型 ✅ 性能优化:启用 TCP 多路复用、连接池、压缩 ✅ 稳定运行:使用 systemd 管理、配置日志轮转、监控告警 ✅ 问题排查:善用日志、Dashboard、抓包工具
暂无目录