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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

遇见火星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值