📖 文章目录
一、方案简介:了解整体架构
二、云服务器端配置:部署FRP服务端与Nginx
三、本地客户端配置:在本地机器配置FRP客户端
四、配置验证:测试服务是否成功穿透
五、总结与建议:回顾关键点与后续步骤
✨ 一、方案简介
本文详细介绍一种利用 云服务器、FRP 及 Nginx 实现内网穿透的稳定方案。其核心原理是:在具有公网IP的云服务器上部署FRP服务端(frps),在内网主机上部署FRP客户端(frpc)。客户端将内网服务的端口“映射”到服务器,再由Nginx提供安全的HTTPS反向代理,最终使外部用户可以通过域名安全访问内网服务。
🛠️ 二、云服务器端配置 (frps & Nginx)
此部分在云服务器上操作。
步骤 1: 下载 FRP
首先,登录你的云服务器,下载并解压 FRP 最新版本。
# 创建并进入工作目录
mkdir -p /root/app/frp
cd /root/app/frp
# 下载FRP (请替换为Github上的最新版本号)
wget "https://gh-proxy.org/https://github.com/fatedier/frp/releases/download/v0.67.0/frp_0.67.0_linux_amd64.tar.gz"步骤 2: 配置 FRP 服务端
解压后,将必要文件复制到系统目录。
# 解压
tar -xzvf frp_0.67.0_linux_amd64.tar.gz
cd frp_0.67.0_linux_amd64/
# 创建系统目录并复制文件
mkdir /usr/local/frp
cp frps /usr/local/frp/
cp frps.toml /usr/local/frp/步骤 3: 配置 frps.toml 文件
这是服务端的核心配置文件,需仔细设置。
生成强密码:
cd /usr/local/frp # 生成认证令牌 openssl rand -base64 32 # 生成仪表板密码 openssl rand -base64 24编辑配置文件:
vim frps.toml以下为关键配置示例(请将
token_example和dashboard_password替换为上一步生成的实际密码):# ==================== 基础配置 ==================== bindAddr = "0.0.0.0" # 此端口需要开放给公网访问 bindPort = 7000 # HTTP反向代理端口,nginx会代理到这个端口 vhostHTTPPort = 8082 # ==================== 认证配置 ==================== auth.method = "token" auth.token = "token_example" # 使用上一步openssl生成的强密码 # ==================== 连接限制 ==================== # 连接超时 transport.heartbeatTimeout = 90 transport.tcpKeepAlive = 7200 # ==================== 协议限制 ==================== # 只允许特定协议(按需开启) # allowPorts = [ # { start = 8000, end = 8100 }, # Web服务 # { start = 22, end = 22 }, # SSH # { start = 3389, end = 3389 } # RDP # ] # 禁止某些客户端连接 # authentication.banIPs = ["192.168.1.100", "10.0.0.1"] # ==================== Web控制面板 ==================== webServer.addr = "127.0.0.1" # 建议仅本地访问,通过SSH隧道或Nginx反向代理 webServer.port = 7500 webServer.user = "admin" # 建议修改名称 webServer.password = "dashboard_password" # 使用上一步openssl生成的强密码 #webServer.tls.certFile = "/path/to/dashboard.crt" # 如果启用HTTPS #webServer.tls.keyFile = "/path/to/dashboard.key" # ==================== 日志配置 ==================== log.level = "info" log.to = "/var/log/frps.log" log.maxDays = 3 log.disablePrintColor = true # ==================== 高级安全配置 ==================== # 限制每个代理的带宽(单位:MB) # bandwidthLimit = "10MB" # 子域名配置(如果使用子域名功能) subdomainHost = "example.com" # ==================== 性能优化 ==================== transport.quic.keepalivePeriod = 10 transport.quic.maxIdleTimeout = 30 transport.quic.maxIncomingStreams = 100000
💡 提示:
bindPort(如7000)和vhostHTTPPort(如8082)需在云服务器控制台的安全组规则中开放。
步骤 4: 配置 Nginx 反向代理
此步骤通过Nginx提供HTTPS访问。假设你的域名是 example.com,子域名为 xxx.example.com。
编辑Nginx配置文件(如 /etc/nginx/nginx.conf 或在 /etc/nginx/conf.d/ 下新建),添加以下 server 块配置:
# ....
# xxx 子域名 HTTP 重定向到 HTTPS
server {
listen 80;
server_name xxx.example.com;
return 301 https://$host$request_uri;
}
# ....
# xxx 子域名 HTTPS 配置
server {
listen 443 ssl;
server_name xxx.example.com;
# 使用同一证书(需证书支持通配符或包含该子域名)
ssl_certificate /path/to/your/cacert/example.com.crt;
ssl_certificate_key /path/to/your/cacert/example.com.key;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:8082; # vhostHTTPPort配置的端口
client_max_body_size 10m; # 根据实际情况修改
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_redirect off;
proxy_read_timeout 240s;
}
}
# ....配置后,执行 nginx -t 测试配置,无误后 systemctl reload nginx 重载。
步骤 5: 创建系统服务并启动
将FRP服务端设置为系统服务,实现开机自启和便捷管理。
创建服务文件:
sudo vim /etc/systemd/system/frps.service写入以下内容:
[Unit] # 服务名称,可自定义 Description = frp server After = network.target syslog.target Wants = network.target [Service] Type = simple # 启动frps的命令,需修改为您的frps的安装路径 ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.toml [Install] WantedBy = multi-user.target启用并启动服务:
sudo systemctl enable frps sudo systemctl start frps sudo systemctl status frps # 检查状态
💻 三、本地客户端配置 (frpc)
个人常用的主机是Debian和MacOS,所以下面以Debian为例进行说明,如果您使用的是Win和MacOS,请自行解决安装问题。配置文件可以参考下文步骤3的说明的说明。
以下部分在需要穿透的内网Linux主机上操作。
步骤 1: 下载并准备 FRP
与服务器端类似,下载客户端软件包。
mkdir -p ~/Software/frp
cd ~/Software/frp
wget "https://gh-proxy.org/https://github.com/fatedier/frp/releases/download/v0.67.0/frp_0.67.0_linux_amd64.tar.gz"
tar -zxvf frp_0.67.0_linux_amd64.tar.gz
cd frp_0.67.0_linux_amd64步骤 2: 配置 FRP 客户端
将客户端文件复制到系统位置。
sudo mkdir -p /etc/frp
sudo cp frpc /usr/local/bin/
sudo cp frpc.toml /etc/frp/步骤 3: 配置 frpc.toml 文件
这是客户端的核心配置文件,需与服务器端配置对应。
sudo nano /etc/frp/frpc.toml写入以下配置:
# 远程腾讯云服务器的公网IP
serverAddr = "xxx.xxx.xxx.xxx"
# 远程腾讯云服务器的frps监听端口
serverPort = 7000
# 鉴权方式
auth.method = "token"
# 鉴权token,与frps的token必须相同
auth.token = "token_example" # 使用frps.toml中配置的auth.token
# 代理配置
[[proxies]]
# 代理本地的服务名称,名称根据服务来命名即可
name = "service_name"
# 代理类型,以http类型的服务为例,这里填写http,更多类型请参考官方文档
type = "http"
# 本地服务IP,默认为127.0.0.1
localIP = "127.0.0.1"
# 本地服务端口
localPort = 8888
# frps的配置文件已经配置了二级域名subdomainHost = "example.com",所以这里只需要配置三级域名的名称就可以了,会自动组合成xxx.example.com完整域名
subDomain = "xxx"✅ 注意:
serverAddr、serverPort、auth.token必须与服务端配置完全匹配,subDomain需与你在DNS和Nginx中配置的子域名前缀一致。
步骤 4: 创建客户端服务并启动
同样,将客户端设置为系统服务。
创建服务文件:
sudo vim /etc/systemd/system/frpc.service写入以下内容:
[Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml [Install] WantedBy=multi-user.target启用并启动服务:
sudo systemctl enable frpc sudo systemctl start frpc sudo systemctl status frpc # 检查状态
🔍 四、验证配置
全部配置完成后,打开浏览器,访问 https://xxx.example.com。如果一切正常,你将能访问到运行在内网主机 127.0.0.1:8888 上的服务。
常用管理与排查命令
💎 五、总结与建议
✅ 核心配置检查清单
在最终验证前,请务必确认以下几点:
云服务器安全组:已开放
7000(FRP通信) 和443(HTTPS) 端口。域名解析:
xxx.example.com已正确解析到云服务器的公网IP。密码与令牌:服务端与客户端配置文件中
auth.token完全一致。端口对应:客户端
localPort与本地实际运行的服务端口一致;Nginx中proxy_pass端口与服务端vhostHTTPPort一致。
🔧 后续优化建议
安全性提升:可考虑将FRP服务端的
webServer(管理面板) 也通过Nginx反代并设置更复杂的访问密码,或通过SSH隧道访问。配置简化:可使用环境变量或分离的密钥文件来管理配置文件中的敏感信息(如token),避免明文硬编码。
协议选择:对于需要更高安全性的场景,可以在FRP配置中启用TLS加密传输。