在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统一处理。

相关推荐
佳児素花痴╮20 分钟前
C语言链接库
linux·运维·服务器
雷电小将军31 分钟前
诡秘之主手游占卜家序列加点 诡秘之主手游占卜家怎么加点
服务器·网络·游戏·电脑·玩游戏
云飞云共享云桌面35 分钟前
苏州昆山精密机械加工厂研发部门10个SolidWorks可以部署云飞云共享云桌面吗?
大数据·运维·服务器·自动化·汽车·制造
聚美智数35 分钟前
图片水印-图片剪裁-图片缩放API接口介绍
java·服务器·数据库
wWYy.1 小时前
Linux发送数据包的过程
linux·网络
小嵌同学1 小时前
Linux 内核中的 Per-CPU 机制详解
linux·运维·arm开发·嵌入式
云飞云共享云桌面1 小时前
自动化设备厂 10 人研发团队,如何共用一台服务器做 SolidWorks 建模?
运维·服务器·网络·3d·自动化·制造
筝筝ba2 小时前
Configure IP Address Via Different User Roles And Verify(1)
服务器
QH139292318802 小时前
NVIDIA H200 H300服务器
运维·服务器·开发语言·网络·信息与通信
xixiaoyunya2 小时前
中小微企业轻量组网方案的技术选型与实践:从传统专线到软定义隧道的成本与效能分析
服务器·php·apache