利用frp实现多协议内网穿透:从SSH到Web服务的全攻略

张开发
2026/4/16 21:10:40 15 分钟阅读

分享文章

利用frp实现多协议内网穿透:从SSH到Web服务的全攻略
1. 为什么你需要frp内网穿透想象一下这个场景你正在咖啡馆办公突然需要访问家里电脑上的文件或者调试办公室局域网里的开发服务器。这时候如果没有公网IP常规方法根本无法直接连接。这就是内网穿透工具存在的意义——它能让外部网络直接访问你局域网内的设备和服务。frpFast Reverse Proxy是我用过最顺手的内网穿透工具之一。它用起来就像给内网设备开了个专属快递通道外部的访问请求通过公网服务器中转frp会准确地把包裹送到内网指定设备上。最棒的是它支持SSH、HTTP、HTTPS等多种协议配置起来比同类工具简单不少。我最初接触frp是为了远程维护树莓派后来发现它能做的远不止这些暴露本地开发环境给同事测试、搭建私人网盘外网访问、甚至实现智能家居远程控制。下面这些典型场景你可能也会遇到远程SSH管理Linux服务器在外网访问NAS上的文件调试微信小程序需要域名访问本地服务向客户演示尚未部署的Web项目2. 十分钟快速搭建frp环境2.1 准备你的传送门服务器首先需要一台有公网IP的服务器作为中转站比如阿里云ECS。我在测试时用过最低配的1核1G机器实测同时处理SSH和Web流量完全够用。关键步骤其实就三步去GitHub下载对应版本的frp注意区分服务器和客户端的系统架构wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz tar -zxvf frp_0.51.3_linux_amd64.tar.gz服务端配置frps.ini就像设置快递中转站[common] bind_port 7000 # 这是快递总站的入口 token your_secure_password # 快递员验证密码 dashboard_port 7500 # 物流监控后台 dashboard_user admin dashboard_pwd dashboard_password启动服务端./frps -c ./frps.ini安全提示记得在云服务器安全组开放7000服务端口和7500仪表盘端口但不要用默认密码2.2 配置你的发货端客户端内网设备上的frpc.ini文件相当于发货单告诉服务器如何转运数据。这是我的常用模板[common] server_addr 你的公网服务器IP server_port 7000 # 必须和服务端bind_port一致 token your_secure_password # 要和服务器设置的token一致 [ssh] # 这是第一个快递包裹 type tcp local_ip 127.0.0.1 local_port 22 # 本地SSH端口 remote_port 6000 # 外网访问端口启动客户端时遇到过两个坑一是防火墙没放行本地端口二是token两边不一致报auth failed。建议先用systemctl stop firewalld临时关闭防火墙测试。3. 实战SSH远程控制配置好基础环境后SSH穿透是最容易上手的应用。我在客户端的frpc.ini里添加这段配置[ssh] type tcp local_ip 127.0.0.1 # 如果是其他设备可改成内网IP local_port 22 remote_port 2222 # 避免用6000等常见端口防扫描重点注意这几个参数remote_port相当于给你的SSH服务分配的外部门牌号local_port如果是连接内网其他机器要改成那台机器的SSH端口authentication_timeout如果网络不稳定可以调大超时时间连接测试时在外部机器运行ssh -oPort2222 username公网服务器IP实测延迟主要取决于中转服务器的网络质量。我用香港服务器连接北京办公室延迟能控制在50ms左右比TeamViewer这类图形工具流畅多了。4. 暴露Web服务的进阶技巧4.1 HTTP基础配置要让外网访问本地运行的网站http类型的配置比SSH更简单[web] type http local_port 8080 # 本地服务端口 custom_domains dev.yourdomain.com # 已解析到服务器的域名服务端需要额外开启http端口[common] vhost_http_port 80 # 默认http端口 vhost_https_port 443 # https端口域名备案提示在国内服务器使用时确保域名已完成ICP备案否则80/443端口可能被阻断4.2 HTTPS安全加固现在没有HTTPS都不好意思说自己是正经网站。frp支持两种https方案方案一frp端终止TLS[web_https] type https local_port 3000 custom_domains dev.yourdomain.com # 证书配置 plugin https2http plugin_local_addr 127.0.0.1:3000 plugin_cert_path /path/to/cert.pem plugin_key_path /path/to/key.pem方案二本地服务处理TLS更推荐这种方式证书更新更方便[web_https] type tcp local_port 443 remote_port 84434.3 流量管理技巧通过frp仪表盘http://服务器IP:7500可以实时监控每个服务的在线状态流量统计和连接数最近的错误日志我通常会设置nginx反向代理到frp的http端口这样可以实现多个子域名共用80端口静态文件缓存加速基本的CC攻击防护5. 企业级稳定运行方案5.1 开机自启动配置生产环境最怕服务意外中断。用systemd守护进程是最可靠的方式这是我的服务配置模板[Unit] DescriptionFrp Client Service Afternetwork.target [Service] Typesimple Usernobody Restarton-failure RestartSec5s ExecStart/usr/local/bin/frpc -c /etc/frp/frpc.ini [Install] WantedBymulti-user.target部署步骤sudo cp frpc /usr/local/bin/ sudo mkdir /etc/frp sudo cp frpc.ini /etc/frp/ sudo cp frpc.service /etc/systemd/system/ sudo systemctl enable frpc sudo systemctl start frpc5.2 安全加固 checklist根据实际运维经验这些安全措施非常必要修改默认的dashboard端口和密码配置防火墙只允许特定IP访问管理端口定期轮换token认证密钥为不同服务设置独立子域名启用frp的tls_enable加密通信5.3 性能调优参数高并发场景下可以调整这些参数[common] tcp_mux true # 启用多路复用 pool_count 5 # 连接池大小 heartbeat_timeout 90 # 心跳超时遇到连接不稳定时可以尝试# 客户端调试模式 ./frpc -c frpc.ini --log_leveldebug # 服务端查看实时日志 journalctl -u frps -f6. 特殊场景解决方案6.1 穿透多层内网遇到过最复杂的情况是要穿透两层NAT公司主路由器将某端口映射到部门网关部门网关再映射到具体开发机解决方案是在部门网关和开发机分别部署frpc形成级联穿透。关键配置是# 部门网关frpc.ini [dev_machine] type tcp local_ip 192.168.2.100 # 开发机内网IP local_port 22 remote_port 2222 # 开发机frpc.ini [ssh] type tcp local_port 22 remote_port 2222 # 与上级frpc的local_port一致6.2 UDP协议支持视频监控、游戏服务器等场景需要UDP穿透[dns] type udp local_ip 192.168.1.53 local_port 53 remote_port 60053测试UDP连通性dig 公网IP -p 60053 example.com6.3 负载均衡方案当单台frps成为性能瓶颈时可以用nginx做负载均衡stream { upstream frp_servers { server frp1.example.com:7000; server frp2.example.com:7000; } server { listen 7000; proxy_pass frp_servers; } }客户端配置多个server_addr实现故障转移[common] server_addr frp1.example.com,frp2.example.com server_port 70007. 常见问题排坑指南连接超时问题排查流程检查服务器安全组/防火墙规则telnet测试端口连通性查看服务端/客户端日志用tcpdump抓包分析性能问题优化步骤调整pool_count增加连接池启用tcp_mux减少连接数考虑升级服务器带宽对Web服务启用压缩我遇到过的典型报错port already used检查是否有其他程序占用端口broken pipe通常是网络不稳定导致auth timeout检查token和服务器时间是否同步最后分享一个真实案例有次紧急出差时需要调试客户现场的设备通过提前部署的frp穿透到客户内网直接SSH连回公司开发机解决问题。这种随时随地能连接的体验正是内网穿透技术的魅力所在。

更多文章