在Linux上搭建FRP服务器及Docker部署FRP实现内网穿透方案二(Nginx前置 + FRP TCP穿透)

使用Nginx前置代理与FRP实现安全内网穿透

一、方案概述

本方案通过Nginx统一管理HTTPS证书和域名路由,FRP仅处理TCP层流量穿透,实现:

  • 多子域名共享443端口
  • 证书集中管理
  • 避免FRP重复处理HTTPS
  • 生产级安全加固

二、服务端部署(FRP + Nginx)

1. FRP服务端配置(Docker版)

frps.toml 核心配置
bash 复制代码
bindAddr = "0.0.0.0"
bindPort = 7000  # FRP控制通道端口
transport.tls.force = true  # 强制TLS加密

auth.method = "token"
auth.token = "your_secure_token"

# 开放Nginx转发用的TCP端口范围
allowPorts = [{ start = 10080, end = 10100 }]

# 管理面板(可选)
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "admin@Secure123"
Docker启动命令
bash 复制代码
docker run -d --name frps \
  -p 7000:7000 \
  -p 7500:7500 \
  -p 10080-10100:10080-10100 \	# 映射开放Nginx转发用的TCP端口范围
  --network host \  # 推荐host模式避免端口映射嵌套
  -v /data/frp/frps.toml:/etc/frp/frps.toml \
  -v /data/frp/logs:/var/log/frp \
  snowdreamtech/frps:latest

端口映射说明

  • 7000:FRP客户端连接端口
  • 10080-10100:Nginx反向代理转发端口
  • 7500:管理面板端口

2. Nginx服务端配置

证书准备
bash 复制代码
mkdir -p /etc/nginx/ssl/
# 将证书放入以下路径(需包含完整链)
/etc/nginx/ssl/www.loveddz.com.crt
/etc/nginx/ssl/www.loveddz.com.key
Nginx虚拟主机配置
bash 复制代码
# /etc/nginx/conf.d/frp_proxy.conf
# 主域名代理
server {
    listen 443 ssl;
    server_name www.loveddz.com;
    
    ssl_certificate /etc/nginx/ssl/www.loveddz.com.crt;
    ssl_certificate_key /etc/nginx/ssl/www.loveddz.com.key;
    
    location / {
        proxy_pass http://127.0.0.1:10080;  # 转发到FRP监听的端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

# 子域名代理示例
server {
    listen 443 ssl;
    server_name api.loveddz.com;
    
    ssl_certificate /etc/nginx/ssl/api.loveddz.com.crt;
    ssl_certificate_key /etc/nginx/ssl/api.loveddz.com.key;
    
    location / {
        proxy_pass http://127.0.0.1:10081;
        proxy_set_header Host $host;
    }
}
Docker启动Nginx
bash 复制代码
docker run -d --name nginx \
  --network host \  # 与frps共享网络命名空间
  -v /etc/nginx/conf.d:/etc/nginx/conf.d \
  -v /etc/nginx/ssl:/etc/nginx/ssl \
  nginx:latest

三、客户端配置(FRP TCP模式)

frpc.toml 示例
bash 复制代码
# ========================
# 全局配置
# ========================
serverAddr = "114.113.112.111"  	# FRP服务器IP
serverPort = 7000              		# 与服务端bindPort一致
auth.method = "token"
auth.token = "your_secure_token" 	# 与服务端auth.token一致
transport.tls.enable = true     	# 启用TLS加密传输(必须与服务端一致)

# ========================
# 代理配置(TCP模式)
# ========================

# 代理1:主域名 www.loveddz.com→ 本地8088
[[proxies]]
name = "web_tcp"	
type = "tcp"                    	# 必须为tcp模式(由Nginx处理HTTPS)
localIP = "127.0.0.1"
localPort = 8088                	# 本地服务端口
remotePort = 10080              	# 对应Nginx的proxy_pass端口

# 代理2:子域名 api.loveddz.com→ 本地8089
[[proxies]]
name = "api_tcp"
type = "tcp"
localPort = 8089
remotePort = 10081              	# Nginx中配置的另一个proxy_pass端口

四、安全加固建议

  1. 防火墙规则

    bash 复制代码
    # 仅开放必要端口
    ufw allow 443,7000,7500,10080:10081/tcp
  2. Nginx安全头

    bash 复制代码
    add_header X-Frame-Options DENY;
    add_header X-Content-Type-Options nosniff;
    add_header Content-Security-Policy "default-src 'self'";
  3. FRP日志监控

    bash 复制代码
    # 实时监控异常连接
    tail -f /data/frp/logs/frps.log | grep -E 'failed|error'

五、验证与调试

  1. 检查服务连通性

    bash 复制代码
    curl -vk https://www.loveddz.com
    curl -vk https://api.loveddz.com
  2. 端口占用检查

    bash 复制代码
    ss -tulnp | grep -E '7000|7500|10080'
  3. Nginx日志分析

    bash 复制代码
    docker logs -f nginx | grep "10080"

六、常见问题解决

问题现象 解决方案
Nginx报502 Bad Gateway 检查FRP客户端是否运行,且localPort与本地服务一致
HTTPS证书错误 确保证书包含完整链,且域名与server_name完全匹配
FRP连接超时 检查服务端防火墙/安全组是否放行7000端口

七、方案优势

  1. 证书集中管理:无需在FRP中配置证书
  2. 性能优化:Nginx处理HTTPS卸载,降低FRP负担
  3. 扩展性强:新增子域名只需修改Nginx配置,无需重启FRP

部署效果

通过 https://www.loveddz.com 访问本地8088端口服务,https://api.loveddz.com 访问8089端口服务,所有HTTPS加密由Nginx统一处理。

相关推荐
dog2506 小时前
网络的时延抖动
linux·运维·网络
阿钱真强道6 小时前
01 嵌入式操作系统 | 课程导论与虚拟机安装 Ubuntu
linux·ubuntu·嵌入式·虚拟机
devpotato6 小时前
高可用系统如何定义可用性
服务器·网络·可用性测试
程序员-Benothing6 小时前
Linux 软件包管理:yum / apt / dnf 命令使用全解析
linux·运维·服务器
GeW6 小时前
拿RHCE证书只是起点:这样备考,顺便把真实运维能力也练了
linux
stellanke7 小时前
Linux网络编程实战2:TCP Socket 基础与实践
linux·网络·c++
芯飞云7 小时前
芯飞云服务器日常使用体验:从配置选型到实际负载的技术分析
运维·服务器
严谨的麻辣烫7 小时前
AI Agent为什么越来越需要固定出口IP?从API白名单到生产环境网络管理
服务器·网络·tcp/ip·代理服务器
DigitalOcean7 小时前
Omarchy 将研发基础设施迁移至 DigitalOcean 云平台
linux·agent
牢姐与蒯7 小时前
Linux文件(一).前传之基础IO
linux·运维·服务器