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

相关推荐
武子康20 小时前
Java-166 Neo4j 安装与最小闭环 | 10 分钟跑通 + 远程访问 Docker neo4j.conf
java·数据库·sql·docker·系统架构·nosql·neo4j
toooooop820 小时前
Nginx 反向代理 HTTPS CDN 配置检查清单(避坑版)
运维·nginx·https·cdn
群联云防护小杜21 小时前
国产化环境下 Web 应用如何满足等保 2.0?从 Nginx 配置到 AI 防护实战
运维·前端·nginx
计算机小手1 天前
使用 llama.cpp 在本地高效运行大语言模型,支持 Docker 一键启动,兼容CPU与GPU
人工智能·经验分享·docker·语言模型·开源软件
尽兴-1 天前
[特殊字符] 微前端部署实战:Nginx 配置 HTTPS 与 CORS 跨域解决方案(示例版)
前端·nginx·https·跨域·cors·chrom
岚天start1 天前
KubeSphere在线安装单节点K8S集群
docker·容器·kubernetes·k8s·kubesphere·kubekey
xyhshen1 天前
记录一次K8S跨命名空间访问 xxx.xxx.svc.cluster.local 类似内部服务不通的问题
云原生·容器·kubernetes
栗子~~1 天前
shell-基于k8s/docker管理容器、监控模型训练所消耗的最大CPU与最大内存脚本
docker·容器·kubernetes
海鸥811 天前
在k8s中部署seaweedfs,上传文件到seaweedfs方法
云原生·容器·kubernetes
半梦半醒*1 天前
k8s——pod详解2
linux·运维·docker·容器·kubernetes·负载均衡