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

相关推荐
wdfk_prog43 分钟前
[Linux]学习笔记系列 -- lib/sort.c 通用的排序库(Generic Sorting Library) 为内核提供标准的、高效的排序功能
linux·运维·c语言·笔记·stm32·学习·bug
闲人编程1 小时前
深入理解Python的`if __name__ == ‘__main__‘`:它到底做了什么?
服务器·数据库·python·main·name·魔法语句
黑马金牌编程1 小时前
简易分析慢 SQL 的流程和方法
linux·数据库·mysql·性能优化·性能分析·慢日志
什么半岛铁盒1 小时前
C++项目:仿muduo库高并发服务器---------LoopThreadPool模块和TcpServer模块的实现
linux·服务器·c++·mysql·ubuntu
それども2 小时前
本地怎么远程调试服务器
运维·服务器
Lin_Aries_04213 小时前
容器化 Flask 应用程序
linux·后端·python·docker·容器·flask
鹏大师运维3 小时前
麒麟系统中修改 WPS 默认新建文件格式的方法
linux·操作系统·wps·docx·麒麟·word文档·excel文档
Lin_Aries_04214 小时前
通过配置 GitLab 自动触发项目自动化构建与部署
运维·docker·容器·自动化·云计算·gitlab
zybsjn4 小时前
【实战】理解服务器流量监控中的“上行”和“下行”
运维·服务器
尘埃不入你眼眸4 小时前
Docker操作命令
运维·docker·容器