基于Docker的内网穿透实战:frp 0.68 + Nginx最佳实践
在实际应用中,我们常常遇到这样的需求:
-
家里的NAS服务器、开发环境、测试服务,需要暴露到公网访问
-
企业内部系统,仅允许在特定域名或端口暴露,但没有公网IP
-
多个内网应用,希望通过一个统一的外网入口访问
传统方法(如端口映射、VPN)存在种种局限。 这时候,轻量、高效、开源的 frp(Fast Reverse Proxy) 成为了解决方案的首选。
本文将以 frp 0.68为例,结合Docker容器化部署,并通过Nginx反向代理优化访问体验,完整讲解一套生产级实践方案。
1️⃣ frp适用场景概览
frp 是一款高性能的反向代理应用,主要应用于:
-
内网穿透:将内网服务(如SSH、Web)暴露到公网
-
远程办公:安全地访问公司内部资源
-
异地数据同步:建立点对点连接
-
微服务通信:跨网段通信
-
个人项目发布:将家里的开发环境一键发布到公网展示
相较于传统VPN,frp部署简单、资源占用小,支持多种协议(TCP、UDP、HTTP、HTTPS、STCP、SUDP),尤其适合快速搭建和灵活扩展。
2️⃣ 快速部署教程(基于 micrograils/frp 镜像)
假设我们有一台云服务器,公网域名为:www.sample.com
。 目标是将家中一台机器的本地Web服务(localhost:8080)安全暴露到公网。
2.1 服务端(frps)部署
① 配置 frps.toml
创建 frps.toml
文件:
bindAddr = "0.0.0.0"
bindPort = 7000vhostHttpPort = 8080auth.method = "token"
auth.token = "strong_token_here"transport.tls.force = true[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "admin"
说明:
-
监听
7000
端口接受客户端连接 -
监听
8080
端口作为 HTTP 虚拟主机端口 -
开启
token认证
和TLS强制加密
-
管理后台开放7500端口
② 启动 frps 容器
docker run -d \--name frps \-p 7000:7000 \-p 8080:8080 \-p 127.0.0.1:7500:7500 \-v $(pwd)/frps.toml:/etc/frp/frps.toml \-e FRP_MODE=server \micrograils/frp:latest
Tips:
-
管理后台7500端口只绑定127.0.0.1,避免暴露到公网
-
容器内读取本地挂载的配置文件
2.2 客户端(frpc)部署
在本地机器(比如家庭服务器)创建 frpc.toml
:
serverAddr = "你的服务器公网IP或域名"
serverPort = 7000transport.tls.enable = trueauth.method = "token"
auth.token = "strong_token_here"[webServer]
addr = "0.0.0.0"
port = 7400
user = "admin"
password = "admin"[[proxies]]
name = "home-web"
type = "http"
localIP = "127.0.0.1"
localPort = 8080
customDomains = ["www.sample.com"]
③ 启动 frpc 容器(使用host网络)
docker run -d \--name frpc \--network host \-v $(pwd)/frpc.toml:/etc/frp/frpc.toml \-e FRP_MODE=client \micrograils/frp:latest
说明:
-
使用
--network host
,frpc容器直接访问本机服务 -
将本地8080端口通过frp注册到服务器
-
绑定域名
www.sample.com
3️⃣ 优化:Server端引入前置Nginx,隐藏8080端口
frp默认的 HTTP服务使用 vhostHttpPort
(比如8080), 如果直接访问,需要带端口号,如:
http://www.sample.com:8080
体验极差!
标准解决方法:在服务器上用Nginx反向代理,将80端口请求转发到8080端口。
① 安装Nginx
Ubuntu/Debian系统:
sudo apt update
sudo apt install nginx
② 配置Nginx反向代理
编辑 /etc/nginx/sites-available/default
或创建新conf:
server {listen 80;server_name www.sample.com;location / {proxy_pass http://127.0.0.1:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;}
}
③ 重启Nginx
sudo systemctl restart nginx
④ 测试访问
现在可以直接通过:
http://www.sample.com
优雅访问你本地服务器的Web服务啦!
(无须携带8080端口,体验更好,SEO友好)
4️⃣ 完善实践建议
在实际生产部署中,还推荐做如下优化:
项目 | 建议 |
---|---|
HTTPS加密 | 给Nginx配置 Let's Encrypt 免费SSL证书(推荐用certbot自动续期) |
防火墙加固 | 只允许必要端口开放,如7000/80/443,管理端口7500仅内网可访问 |
frp限速 | 根据需求在frps中配置带宽控制(bandwidth.limit) |
多域名管理 | 支持多个customDomains,在frp配置中扩展 |
容灾备份 | 保留 frps 和 frpc 的配置文件快照 |
5️⃣ 小结
通过 frp + Docker + Nginx 的组合方案,我们可以:
-
快速、安全地将内网服务暴露到公网
-
保持访问体验优雅(无端口号访问)
-
实现灵活的多域名、多服务映射
-
保证通信过程加密认证,提高安全性
对于中小企业办公、远程访问、个人项目展示,这是一套成本低、扩展性强的内网穿透实战方案。
如果你的应用场景中,需要更多定制(比如双向认证、动态注册等),frp也提供了丰富的扩展功能,值得深入挖掘!
📢 最后提示
-
本文所有部署基于 frp 0.68版,不同版本请注意配置项差异
-
示例用镜像
micrograils/frp
,推荐搭配Docker统一管理,简洁高效 -
Nginx反向代理不仅提升体验,也是未来统一接入网关建设的基础