想象一下这个场景:你正在家里用Windows电脑开发一个网站,本地测试一切正常,但想让外地的同事帮你看看效果。或者你需要从公司访问家里的电脑处理文件,但家里没有固定公网IP。这时候就需要内网穿透技术了。
内网穿透的本质是打通内外网之间的通道。由于大多数家庭和企业的网络都位于NAT(网络地址转换)设备之后,外部设备无法直接访问内部网络中的计算机。FRP作为一款开源的反向代理工具,能够完美解决这个问题。
我实际使用中发现,相比其他工具,FRP有几个明显优势:
在开始之前,你需要准备:
注意:如果使用国内云服务器,记得在控制台安全组中开放所需端口
访问FRP的GitHub发布页,下载对应版本:
frp_0.xx.0_linux_amd64.tar.gz)frp_0.xx.0_windows_amd64.zip)解压后你会看到这些关键文件:
code复制frps.exe # 服务端主程序
frpc.exe # 客户端主程序
frps.ini # 服务端配置模板
frpc.ini # 客户端配置模板
在云服务器上创建frps.ini文件,建议放在/etc/frp/目录下(Linux)或C:\frp\(Windows):
ini复制[common]
bind_port = 7000
token = your_secure_token_123
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = StrongPassword@2023
关键参数说明:
bind_port:客户端连接的端口,建议修改默认值token:务必设置复杂令牌,这是最重要的安全屏障dashboard_*:监控面板配置,建议修改默认凭证为了提升安全性,我推荐添加这些配置:
ini复制[common]
...
# 限制客户端IP(如果固定)
allow_ports = 20000-30000 # 只允许开放这个范围的端口
max_pool_count = 50 # 防止资源耗尽
tls_only = true # 强制TLS加密
启动服务端:
bash复制./frps -c ./frps.ini
验证是否启动成功:
bash复制netstat -tulnp | grep frps
# 应该看到7000端口监听
在Windows客户端创建frpc.ini:
ini复制[common]
server_addr = your_server_ip
server_port = 7000
token = your_secure_token_123
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 13389
启动客户端:
powershell复制.\frpc.exe -c .\frpc.ini
测试连接:
服务器IP:13389假设你在本地5000端口运行了Node.js应用:
ini复制[web]
type = http
local_port = 5000
custom_domains = yourdomain.com
# 如果要用HTTPS
[https_web]
type = https
local_port = 443
custom_domains = yourdomain.com
配置完成后,访问http://yourdomain.com就能看到本地服务。
创建start_frpc.bat文件避免每次输入命令:
bat复制@echo off
cd /d %~dp0
start frpc.exe -c frpc.ini
exit
使用NSSM工具将FRP设为服务:
powershell复制nssm install frpc "C:\frp\frpc.exe" "-c C:\frp\frpc.ini"
nssm start frpc
确保Windows防火墙放行相关端口:
powershell复制New-NetFirewallRule -DisplayName "FRP Client" -Direction Inbound -Program "C:\frp\frpc.exe" -Action Allow
连接失败怎么办?
bind_port和客户端server_port是否一致如何提升传输速度?
[common]添加:ini复制tcp_mux = true
protocol = kcp
Dashboard看不到数据?
我在实际部署中发现,最常出现的问题是端口冲突。建议用netstat -ano检查端口占用情况,尽量选择10000以上的高端口。
allow_ports和privilege_allow_ips[common]添加:ini复制tls_enable = true
frps.log异常连接记得去年有次因为token太简单导致被扫描,后来加了IP白名单和复杂token才解决。安全配置宁可麻烦点,也别留隐患。