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

相关推荐
yang_xiao_wu_6 分钟前
docker
docker·容器·eureka
呼啦啦呼啦啦啦啦啦啦8 分钟前
修改Docker容器内的时间(实践有效版)
运维·docker·容器
梦游钓鱼9 分钟前
Ubuntu:20.04中安装docker
ubuntu·docker·eureka
Mrdaliang11 分钟前
【无标题】
linux·运维·服务器·网络
耳边轻语99912 分钟前
欧拉系统 nginx ./configure: No such file or directory
linux·运维·服务器
大苏打seven15 分钟前
Docker学习笔记:数据卷
笔记·学习·docker
浪小满18 分钟前
怎样解决在ubuntu 22.04上QT: DataVisualization控件显示黑屏的问题
linux·qt·ubuntu
盛夏绽放24 分钟前
Python 目录操作详解
java·服务器·python
我要升天!1 小时前
Linux -- Ext系列文件系统介绍
linux·运维·服务器
山岚的运维笔记1 小时前
如何将 MX Linux 的垂直任务栏面板移到底部
linux·运维·服务器·mx linux·任务栏面板