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

相关推荐
报错小能手1 小时前
讲讲libevent底层机制
linux·服务器
i***22073 小时前
springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice
spring boot·后端·docker
代码AC不AC3 小时前
【Linux】计算机的基石:从冯·诺依曼体系结构到操作系统管理
linux·操作系统·冯诺依曼体系结构
大柏怎么被偷了4 小时前
【Linux】进程等待
linux·运维·服务器
互联网老欣5 小时前
2025年保姆级教程:阿里云服务器部署Dify+Ollama,打造专属AI应用平台
服务器·阿里云·ai·云计算·dify·ollama·deepseek
偶像你挑的噻5 小时前
12-Linux驱动开发- SPI子系统
linux·驱动开发·stm32·嵌入式硬件
羑悻的小杀马特5 小时前
轻量跨云·掌控无界:Portainer CE + cpolar 让远程容器运维像点外卖一样简单——免复杂配置,安全直达对应集群
运维·网络·安全·docker·cpolar
松涛和鸣5 小时前
16、C 语言高级指针与结构体
linux·c语言·开发语言·数据结构·git·算法
念风5 小时前
[lvgl]如何优雅地向lv_port_linux中添加tslib支持
linux
悦悦欧呐呐呐呐6 小时前
数据库事务是什么,怎么用的
服务器·数据库·oracle