Eatta
Eatta
Published on 2026-02-03 / 19 Visits
0
0

云服务器 + frp + nginx实现内网穿透方案说明

📖 文章目录

  • 一、方案简介:了解整体架构

  • 二、云服务器端配置:部署FRP服务端与Nginx

  • 三、本地客户端配置:在本地机器配置FRP客户端

  • 四、配置验证:测试服务是否成功穿透

  • 五、总结与建议:回顾关键点与后续步骤


✨ 一、方案简介

本文详细介绍一种利用 云服务器FRPNginx 实现内网穿透的稳定方案。其核心原理是:在具有公网IP的云服务器上部署FRP服务端(frps),在内网主机上部署FRP客户端(frpc)。客户端将内网服务的端口“映射”到服务器,再由Nginx提供安全的HTTPS反向代理,最终使外部用户可以通过域名安全访问内网服务。


🛠️ 二、云服务器端配置 (frps & Nginx)

此部分在云服务器上操作。

步骤 1: 下载 FRP

首先,登录你的云服务器,下载并解压 FRP 最新版本。

# 创建并进入工作目录
mkdir -p /root/app/frp
cd /root/app/frp

# 下载FRP (请替换为Github上的最新版本号)
wget "https://gh-proxy.org/https://github.com/fatedier/frp/releases/download/v0.67.0/frp_0.67.0_linux_amd64.tar.gz"

步骤 2: 配置 FRP 服务端

解压后,将必要文件复制到系统目录。

# 解压
tar -xzvf frp_0.67.0_linux_amd64.tar.gz
cd frp_0.67.0_linux_amd64/

# 创建系统目录并复制文件
mkdir /usr/local/frp
cp frps /usr/local/frp/
cp frps.toml /usr/local/frp/

步骤 3: 配置 frps.toml 文件

这是服务端的核心配置文件,需仔细设置。

  1. 生成强密码:

    cd /usr/local/frp
    # 生成认证令牌
    openssl rand -base64 32
    # 生成仪表板密码
    openssl rand -base64 24
  2. 编辑配置文件:

    vim frps.toml

    以下为关键配置示例(请将token_exampledashboard_password替换为上一步生成的实际密码):

    # ==================== 基础配置 ====================
    bindAddr = "0.0.0.0"
    # 此端口需要开放给公网访问
    bindPort = 7000
    # HTTP反向代理端口,nginx会代理到这个端口
    vhostHTTPPort = 8082
    
    # ==================== 认证配置 ====================
    auth.method = "token"
    auth.token = "token_example"  # 使用上一步openssl生成的强密码
    
    # ==================== 连接限制 ====================
    # 连接超时
    transport.heartbeatTimeout = 90
    transport.tcpKeepAlive = 7200
    
    # ==================== 协议限制 ====================
    # 只允许特定协议(按需开启)
    # allowPorts = [
    #   { start = 8000, end = 8100 },    # Web服务
    #   { start = 22, end = 22 },        # SSH
    #   { start = 3389, end = 3389 }     # RDP
    # ]
    
    # 禁止某些客户端连接
    # authentication.banIPs = ["192.168.1.100", "10.0.0.1"]
    
    # ==================== Web控制面板 ====================
    webServer.addr = "127.0.0.1"  # 建议仅本地访问,通过SSH隧道或Nginx反向代理
    webServer.port = 7500
    webServer.user = "admin" # 建议修改名称
    webServer.password = "dashboard_password"  # 使用上一步openssl生成的强密码
    #webServer.tls.certFile = "/path/to/dashboard.crt"  # 如果启用HTTPS
    #webServer.tls.keyFile = "/path/to/dashboard.key"
    
    # ==================== 日志配置 ====================
    log.level = "info"
    log.to = "/var/log/frps.log"
    log.maxDays = 3
    log.disablePrintColor = true
    
    # ==================== 高级安全配置 ====================
    
    # 限制每个代理的带宽(单位:MB)
    # bandwidthLimit = "10MB"
    
    # 子域名配置(如果使用子域名功能)
    subdomainHost = "example.com"
    
    # ==================== 性能优化 ====================
    transport.quic.keepalivePeriod = 10
    transport.quic.maxIdleTimeout = 30
    transport.quic.maxIncomingStreams = 100000

💡 提示bindPort(如7000)和vhostHTTPPort(如8082)需在云服务器控制台的安全组规则中开放。

步骤 4: 配置 Nginx 反向代理

此步骤通过Nginx提供HTTPS访问。假设你的域名是 example.com,子域名为 xxx.example.com

编辑Nginx配置文件(如 /etc/nginx/nginx.conf 或在 /etc/nginx/conf.d/ 下新建),添加以下 server 块配置:

    # ....

	# xxx 子域名 HTTP 重定向到 HTTPS
    server {
        listen       80;
        server_name  xxx.example.com;
        return 301 https://$host$request_uri;
    }

	# ....

    # xxx 子域名 HTTPS 配置
    server {
        listen 443 ssl;
        server_name xxx.example.com;

        # 使用同一证书(需证书支持通配符或包含该子域名)
        ssl_certificate /path/to/your/cacert/example.com.crt;
        ssl_certificate_key /path/to/your/cacert/example.com.key;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 10m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;

        location / {
            proxy_pass http://127.0.0.1:8082; # vhostHTTPPort配置的端口
            client_max_body_size 10m; # 根据实际情况修改
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_max_temp_file_size 0;
            proxy_redirect off;
            proxy_read_timeout 240s;
        }
    }
	# ....

配置后,执行 nginx -t 测试配置,无误后 systemctl reload nginx 重载。

步骤 5: 创建系统服务并启动

将FRP服务端设置为系统服务,实现开机自启和便捷管理。

  1. 创建服务文件:

    sudo vim /etc/systemd/system/frps.service
  2. 写入以下内容:

    [Unit]
    # 服务名称,可自定义
    Description = frp server
    After = network.target syslog.target
    Wants = network.target
    
    [Service]
    Type = simple
    # 启动frps的命令,需修改为您的frps的安装路径
    ExecStart = /usr/local/frp/frps -c /usr/local/frp/frps.toml
    
    [Install]
    WantedBy = multi-user.target
  3. 启用并启动服务:

    sudo systemctl enable frps
    sudo systemctl start frps
    sudo systemctl status frps  # 检查状态

💻 三、本地客户端配置 (frpc)

个人常用的主机是Debian和MacOS,所以下面以Debian为例进行说明,如果您使用的是Win和MacOS,请自行解决安装问题。配置文件可以参考下文步骤3的说明的说明。

以下部分在需要穿透的内网Linux主机上操作。

步骤 1: 下载并准备 FRP

与服务器端类似,下载客户端软件包。

mkdir -p ~/Software/frp
cd ~/Software/frp
wget "https://gh-proxy.org/https://github.com/fatedier/frp/releases/download/v0.67.0/frp_0.67.0_linux_amd64.tar.gz"
tar -zxvf frp_0.67.0_linux_amd64.tar.gz
cd frp_0.67.0_linux_amd64

步骤 2: 配置 FRP 客户端

将客户端文件复制到系统位置。

sudo mkdir -p /etc/frp
sudo cp frpc /usr/local/bin/
sudo cp frpc.toml /etc/frp/

步骤 3: 配置 frpc.toml 文件

这是客户端的核心配置文件,需与服务器端配置对应。

sudo nano /etc/frp/frpc.toml

写入以下配置:

# 远程腾讯云服务器的公网IP
serverAddr = "xxx.xxx.xxx.xxx"
# 远程腾讯云服务器的frps监听端口
serverPort = 7000

# 鉴权方式
auth.method = "token"
# 鉴权token,与frps的token必须相同
auth.token = "token_example"  # 使用frps.toml中配置的auth.token

# 代理配置
[[proxies]]
# 代理本地的服务名称,名称根据服务来命名即可
name = "service_name"
# 代理类型,以http类型的服务为例,这里填写http,更多类型请参考官方文档
type = "http"
# 本地服务IP,默认为127.0.0.1
localIP = "127.0.0.1"
# 本地服务端口
localPort = 8888
# frps的配置文件已经配置了二级域名subdomainHost = "example.com",所以这里只需要配置三级域名的名称就可以了,会自动组合成xxx.example.com完整域名
subDomain = "xxx"

注意serverAddrserverPortauth.token 必须与服务端配置完全匹配,subDomain 需与你在DNS和Nginx中配置的子域名前缀一致。

步骤 4: 创建客户端服务并启动

同样,将客户端设置为系统服务。

  1. 创建服务文件:

    sudo vim /etc/systemd/system/frpc.service
  2. 写入以下内容:

    [Unit]
    Description=Frp Client Service
    After=network.target
    
    [Service]
    Type=simple
    User=nobody
    Restart=on-failure
    RestartSec=5s
    ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
    
    [Install]
    WantedBy=multi-user.target
  3. 启用并启动服务:

    sudo systemctl enable frpc
    sudo systemctl start frpc
    sudo systemctl status frpc  # 检查状态

🔍 四、验证配置

全部配置完成后,打开浏览器,访问 https://xxx.example.com。如果一切正常,你将能访问到运行在内网主机 127.0.0.1:8888 上的服务。

常用管理与排查命令

作用

服务器端命令

客户端命令

启动服务

sudo systemctl start frps

sudo systemctl start frpc

查看状态

sudo systemctl status frps

sudo systemctl status frpc

查看日志

tail -f /var/log/frps.log

journalctl -u frpc -f


💎 五、总结与建议

✅ 核心配置检查清单

在最终验证前,请务必确认以下几点:

  1. 云服务器安全组:已开放 7000 (FRP通信) 和 443 (HTTPS) 端口。

  2. 域名解析xxx.example.com 已正确解析到云服务器的公网IP。

  3. 密码与令牌:服务端与客户端配置文件中 auth.token 完全一致。

  4. 端口对应:客户端 localPort 与本地实际运行的服务端口一致;Nginx中 proxy_pass 端口与服务端 vhostHTTPPort 一致。

🔧 后续优化建议

  • 安全性提升:可考虑将FRP服务端的 webServer (管理面板) 也通过Nginx反代并设置更复杂的访问密码,或通过SSH隧道访问。

  • 配置简化:可使用环境变量或分离的密钥文件来管理配置文件中的敏感信息(如token),避免明文硬编码。

  • 协议选择:对于需要更高安全性的场景,可以在FRP配置中启用TLS加密传输。


Comment