基于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 = 7000

vhostHttpPort = 8080

auth.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 = 7000

transport.tls.enable = true

auth.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反向代理不仅提升体验,也是未来统一接入网关建设的基础

相关推荐
冬奇Lab4 小时前
一天一个开源项目(第46篇):Caddy - 自动 HTTPS 的现代化 Web 服务器,支持 HTTP/3
网络协议·nginx·开源
Java陈序员2 天前
轻量强大!一款现代化的 Kubernetes 集群管理与监控工具!
云原生·容器·kubernetes
顺风尿一寸2 天前
Nginx源码分析:变量系统的设计与请求生命周期中的日志记录
nginx
Sheffield3 天前
Docker的跨主机服务与其对应的优缺点
linux·网络协议·docker
Sheffield4 天前
Alpine是什么,为什么是Docker首选?
linux·docker·容器
马艳泽4 天前
win10下运行Start Broker and Proxy报错解决
docker
用户13573999256605 天前
Windows 从 0 搭建 WSL2 原生 AI 开发环境:Codex + Docker + VSCode
docker
vi_h5 天前
在 macOS 上通过 Docker 安装并运行 Ollama(详细可执行教程)
macos·docker·ollama
黑心老魔5 天前
通过 Docker 创建开发环境
docker·开发环境
冬奇Lab5 天前
一天一个开源项目(第41篇):Workout.cool - 现代化开源健身教练平台,训练计划与进度追踪
docker·开源·资讯