侧边栏壁纸
  • 累计撰写 4 篇文章
  • 累计创建 7 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Frp高级应用:双向验证、SSL、STCP

Admin
2025-06-06 / 0 评论 / 2 点赞 / 114 阅读 / 0 字
温馨提示:
部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

Frp高级应用:双向验证、SSL、STCP

参考文献:


本文使用条件

  • 域名一枚,需备案(第三部分域名SSL访问需要)

  • 服务端:Linux(Debian) Docker (snowdreamtech/frps v0.62.1)+ Docker Compose

  • 服务端反代工具:1Panel (与宝塔面类似)+ OpenResty(配置可与Nginx通用)

  • 客户端1:Linux(Debian/Alpine) Docker(snowdreamtech/frpc v0.62.1) + Docker Compose

  • 客户端2:Windows frpc.exe(snowdreamtech/frpc v0.62.1)+NSSM


目录


一、部署

1.1 Linux部署

可参考https://gofrp.org/zh-cn/docs/setup/直接使用二进制文件运行frp并使用systemdsupervisor使之能自动启动

本文演示使用docker、docker compose来部署frp:

1.1.1 文件路径演示:

frp/         #根文件夹           
│
├── conf/         #配置文件夹
│   └── frps.toml or frpc.toml
│
├── ssl/          #证书文件夹
│   ├── ca.crt
│   ├── server.crt or client.crt
│   └── server.key or client.key
│
└── docker-compose.yml 

1.1.2 部署命令Linux

Linux环境

使用ssh连接机器

以下是Debian命令(其他架构自行搜索)

  1. 切换root

    sudo -i
    
  2. 创建并进入文件夹

    # frps
    mkdir -p /root/data/docker_data/frps/
    
    # frpc
    mkdir -p /root/data/docker_data/frpc/
    
    
    # frps
    cd /root/data/docker_data/frps/
    
    # frpc
    cd /root/data/docker_data/frpc/
    
    
    mkdir conf ssl
    
  3. 创建docker-compose.yml

    vim docker-compose.yml
    
    • frps

      复制并粘贴以下代码

      services:
        frps:
          image: snowdreamtech/frps:0.62.1
          container_name: frps
          restart: always
          network_mode: host
          volumes:
            - ./conf/frps.toml:/etc/frp/frps.toml
            - ./ssl:/etc/frp/ssl
          command: -c /etc/frp/frps.toml
      
    • frpc

      复制并粘贴以下代码

      services:
        frpc:
          image: snowdreamtech/frpc:0.62.1
          container_name: frpc
          restart: always
          network_mode: host
          volumes:
            - ./conf/frpc.toml:/etc/frp/frpc.toml
            - ./ssl:/etc/frp/ssl
          command: -c /etc/frp/frps.toml
      
  4. 创建frps/c.toml

    • frps

      vim /root/data/docker_data/frps/conf/frps.toml
      

      复制并粘贴以下代码

      参考:https://github.com/fatedier/frp/blob/dev/conf/frps_full_example.toml

      bindAddr = "0.0.0.0"
      bindPort = 7000
      
      kcpBindPort = 7000
      quicBindPort = 7002
      
      auth.method = "token"
      auth.token = "your_token"
      #建议token尽可能复杂
      
      #本教程未使用。如已存在反代工具,需要修改
      #vhostHTTPPort = 80   
      #vhostHTTPSPort = 443
      
      webServer.addr = "0.0.0.0"
      webServer.port = 6443
      webServer.user = "admin"
      webServer.password = "dash_password"
      #建议尽可能复杂
      
      transport.maxPoolCount = 2000
      transport.tcpMux = true
      transport.tcpMuxKeepaliveInterval = 60
      transport.tcpKeepalive = 7200
      
      transport.tls.certFile = "/etc/frp/ssl/server.crt"
      transport.tls.keyFile = "/etc/frp/ssl/server.key"
      transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
      #证书路径本文展示为相对路径,配合本文docker-compose.yml使用。应该也可使用绝对路径,如本文可改为/root/data/docker_data/frps/ssl/ca.crt
      
      log.to = "./frps.log"
      log.level = "info"
      log.maxDays = 3
      log.disablePrintColor = false
      
      allowPorts = [
        { start = 50000, end = 59999 }
      ]
      #frpc中remote port的范围,建议30000以上端口,一般不会冲突
      
      maxPortsPerClient = 0  #frpc代理数量上限
      udpPacketSize = 1500
      natholeAnalysisDataReserveHours = 168
      
    • frpc

      vim /root/data/docker_data/frpc/conf/frpc.toml
      

      复制并粘贴以下代码

      serverAddr = "frps_ip"
      serverPort = 7000
      
      log.to = "./frpc.log"
      log.level = "info"
      log.maxDays = 3
      
      auth.method = "token"
      auth.token = "your_token"
      #与frps匹配
      
      #webServer.addr = "127.0.0.1"
      #webServer.port = 7400
      #webServer.user = "admin"
      #webServer.password = "admin"
      
      transport.tls.certFile = "/etc/frp/ssl/client.crt"
      transport.tls.keyFile = "/etc/frp/ssl/client.key"
      transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
      #证书路径本文展示为相对路径,配合本文docker-compose.yml使用。应该也可使用绝对路径,如本文可改为/root/data/docker_data/frps/ssl/ca.crt
      
      #nas
      [[proxies]]
      name = "nas"
      type = "tcp"
      localIP = "{nas内网ip}"
      localPort = 5000
      remotePort = 50001
      transport.useEncryption = true
      transport.useCompression = true
      
      
      [[proxies]]
      name = "nas_stcp_ssh"
      type = "stcp" 
      secretKey = "stcp_key" #建议尽可能复杂
      localIP = "{nas内网ip}"
      localPort = XXXX #改为nas ssh端口
      transport.useEncryption = true
      transport.useCompression = true
      

      stcp使用参见四、STCP

  5. 创建证书

    如何创建参见二、双向验证

    复制到ssl文件夹内

  6. 启动容器

    docker-compose up -d
    

    查看运行状态

    docker ps
    
    docker logs frps   #查看frps报错信息
    docker logs frpc   #查看frpc报错信息
    

1.2 Windows部署

一键脚本frpc v0.62.1打包下载:frp_win_with_script.zip
已在Github开源:https://github.com/Vekixx/frp_windows_with_script

找到对应文件右键单击-下载

2025-06-06_173948

1.2.1 文件路径演示:

frp/         #根文件夹           
│
├── frpc.toml     #配置文件
│
├── ssl/          #证书文件夹
│   ├── ca.crt
│   ├── client.crt
│   └── client.key
│
├── src/         #nssm 脚本文件夹
├── nssm.exe     #可使命令转化为Windows服务(可开机自启)
│ 
├── install.bat     #运行服务脚本(开机自启)
│
└── uninstall.bat   #删除服务脚本

1.2.2 文件准备

  1. 下载frpc.exe

  2. 下载nssm

  3. 准备启动服务和停止服务的脚本

    使用ai创建

  4. 准备frpc.toml

    serverAddr = "frps_ip" #frps_ip也可改为域名,需要将域名指向frps的ip地址
    serverPort = 7000
    
    log.to = "./frpc.log"
    log.level = "info"
    log.maxDays = 3
    
    auth.method = "token"
    auth.token = "your_token" #与frps匹配
    
    transport.tls.certFile = "./ssl/client.crt"
    transport.tls.keyFile = "./ssl/client.key"
    transport.tls.trustedCaFile = "./ssl/ca.crt"
    #证书路径本文展示为windows中相对路径
    
    [[visitors]]
    name = "nas_stcp_ssh visitor"
    type = "stcp"
    serverName = "nas_stcp_ssh" #与对应frpc stcp的name相同
    secretKey = "stcp_key" #与对应frpc stcp的secretKey相同
    bindAddr = "127.0.0.1"
    bindPort = 60001 
    transport.useEncryption = true
    transport.useCompression = true
    

1.2.3 运行

  • 初次运行:双击install.bat即可
  • 修改配置:修改frpc.toml后先后双击uninstall.batinstall.bat即可
  • 停止运行:双击uninstall.bat即可

二、双向验证

参考:https://gofrp.org/zh-cn/docs/features/common/network/network-tls/

需使用openssl(linux自带,Windows需要下载Win32OpenSSL

用 openssl 生成 ca 和双方 SAN 证书。

2.1创建文件夹

mkdir -p /root/openssl


cd /root/openssl

2.2 创建默认 OpenSSL 配置文件

cat > my-openssl.cnf << EOF
[ ca ]
default_ca = CA_default
[ CA_default ]
x509_extensions = usr_cert
[ req ]
default_bits        = 2048
default_md          = sha256
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes          = req_attributes
x509_extensions     = v3_ca
string_mask         = utf8only
[ req_distinguished_name ]
[ req_attributes ]
[ usr_cert ]
basicConstraints       = CA:FALSE
nsComment              = "OpenSSL Generated Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = CA:true
EOF

2.3 生成默认 ca:

openssl genrsa -out ca.key 2048

openssl req -x509 -new -nodes -key ca.key -subj "/CN={your_name}.ca.com" -days 50000 -out ca.crt
  • "/CN={your_name}.ca.com"中的{your_name}换成你的二级域名,如"/CN=vekixx.ca.com"
  • -days 50000为50000天后过期,可适当修改。默认365天,但需每年运行此命令

2.4 生成 frps 证书:

openssl genrsa -out server.key 2048

openssl req -new -sha256 -key server.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN={your_domain}" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf " [SAN] subjectAltName=DNS:{your_domain},IP:{your_frpsip},DNS:{your_domain}")) \
    -out server.csr

openssl x509 -req -days 36500 -sha256 \
	-in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(printf "subjectAltName=DNS:{your_domain},IP:{your_frpsip},DNS:{your_domain}") \
	-out server.crt
  • 注1:用查找替换替换本文的{your_frpsip}为你的frpc.toml中serverAddr的值,如IP:177.10.10.10IP:frp.vekixx.com

  • 注2:使用查找替换替换本文的{your_domain}为你的二级域名,如CN=vekixx.comDNS:vekixx.com

  • 注3:-days 36500为36500天后过期,可适当修改。默认365天,但需每年运行此命令

2.5 生成 frpc 的证书:

openssl genrsa -out client.key 2048

openssl req -new -sha256 -key client.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN={your_domain}" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf " [SAN] subjectAltName=DNS:{your_domain},DNS:{your_domain}")) \
    -out client.csr

openssl x509 -req -days 36500 -sha256 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
	-extfile <(printf "subjectAltName=DNS:{your_domain},DNS:{your_domain}") \
	-out client.crt
  • 注1:使用查找替换替换本文的{your_domain}为你的二级域名,如CN=vekixx.comDNS:vekixx.com
  • 注2:-days 36500为36500天后过期,可适当修改。默认365天,但需每年运行此命令

2.6 将证书复制到相应文件夹

  • ca.crt —> frps/ssl frpc/ssl
  • server.crt server.key —> frps/ssl
  • client.crt client.key —> frpc/ssl
cp ./ca.crt ./frps/ssl/ca.crt
cp ./ca.crt ./frpc/ssl/ca.crt

cp ./server.crt ./frps/ssl/server.crt
cp ./server.key ./frps/ssl/server.key

cp ./client.crt ./frps/ssl/client.crt
cp ./client.key ./frps/ssl/client.key
  • 将frps/ssl文件夹复制到frps相应位置

  • 将frpc/ssl文件夹复制到frpc相应位置

三、SSL

以下说明均以需要使用https://nas.xxxx.com访问本地的群晖NAShttp://10.0.0.1:5000为例,frps服务器公网ip地址为172.10.10.10

示意图:
mermaid-202567 122612

3.1 前期准备

3.1.1 DNS设置

在域名托管商中将需要使用的域名指向frps的ip地址,

本例即在类型选择A,在名称填写nas,在IPv4地址172.10.10.10,代理状态关闭(Cloudflare专有设置),最后点击保存。

2025-06-06_192549

使用*表示这个域名仅用于该服务器使用,不可再指向其他服务器ip。

3.1.2 安装1Panel、安装OpenResty

安装1Panel:

安装OpenResty

  • 进入1Panel面板,选择应用商店,进入应用商店页面,第一个就为OpenResty,点击安装,使用默认安装即可

3.1.3 证书准备

  • 进入1Panel面板,选择网站-证书,进入证书页面

  • 选择Acme 账户,创建一个账户(只需要填一个邮箱地址即可),用于自动更新证书

  • 选择DNS账户,创建一个账户,需要事先获取域名托管商的Access key和secret(名称不一样),用于申请证书

  • 创建泛域名证书

    • 泛域名证书可以给所有的三级域名加上SSL,使用方便
    • 点击申请证书,主域名填*.your_domain.com,其他域名填your_domain.com(只有一个输入框则填入*.your_domain.com,your_domain.com)。例如我的就需填写*.vekixx.comvekixx.com
    • 最后点击确定或者申请

3.2 frp穿透

  • frps.toml无需操作

  • frpc.toml

    serverAddr = "172.10.10.10"
    serverPort = 7000
    
    log.to = "./frpc.log"
    log.level = "info"
    log.maxDays = 3
    
    auth.method = "token"
    auth.token = "12345678901234567890"
    #与frps匹配
    
    transport.tls.certFile = "/etc/frp/ssl/client.crt"
    transport.tls.keyFile = "/etc/frp/ssl/client.key"
    transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"
    
    
    #nas
    [[proxies]]
    name = "nas"
    type = "tcp"
    localIP = "10.0.0.1"
    localPort = 5000
    remotePort = 50001
    transport.useEncryption = true
    transport.useCompression = true
    

    本例演示其实使用http://172.10.10.10:50001已经可以开始登录本地的NAS,但尚未完成SSL,无法使用域名访问

3.3 反向代理

  • 进入1Panel面板,选择网站-网站,进入网站页面

  • 点击创建,选择反向代理,分组不用管,主域名填写nas.xxxx.com,代号自动填写,代理地址填写ip:port,点击确认

    此处完成通过https://nas.xxxx.com访问本地50001端口,而50001端口已于本地群晖NAS登录网页http://10.0.0.1:5000绑定,即通过https://nas.xxxx.com访问本地群晖NAShttp://10.0.0.1:5000

    但是尚未完成所有设置

    image-20250606201604364
  • 创建成功后,出现网站列表,点击域名进入网站设置(注意先后顺序

    • HTTPS:点击启用HTTPS后的按钮,只需要Acme账户选择刚才的邮箱,证书自动选择刚才的泛域名证书(只有一个证书的情况下),点最下面的确认

      2025-06-06_202329
    • 反向代理:本次无需修改

    • 配置文件:本次无需修改

  • 此时,访问域名https://nas.xxxx.com即可跳转到本地群晖NAS登录界面http://10.0.0.1:5000

    注:此时frps服务器防火墙中50001端口可不放开,但7000端口必须打开

3.4 批量反向代理

如果想要大规模的反代,一个一个添加过于繁琐,故通过修改配置文件以达到批量反代的效果

3.4.1 前期准备

  • DNS设置:将其他需要反代的域名也指向frps ip(如使用*指向frps ip则跳过此步)
  • 安装1Panel、安装OpenResty证书准备无需再次操作

3.4.2 frp穿透

  • frpc.toml只需继续增加端口

    [[proxies]]
    name = "emby"   #不可重复
    type = "tcp"
    localIP = "10.0.0.1"
    localPort = 3096  
    remotePort = 50002  #不可重复
    transport.useEncryption = true
    transport.useCompression = true
    
    [[proxies]]
    name = "alist"   #不可重复
    type = "tcp"
    localIP = "10.0.0.1"
    localPort = 5244  
    remotePort = 50003  #不可重复
    transport.useEncryption = true
    transport.useCompression = true
    

3.4.3 反向代理

  • 创建网站:

    • 如果是新创建网站,只需要在其他域名添加(一个域名一行,不要标点符号),反向代理填主域名(也可以随便填,后面删掉)

      alist.xxxx.com
      emby.xxxx.com
      aria.xxxx.com
      .
      .
      .
      qb.xxxx.com
      
    • 已创建网站,只需要在点击域名,进入网站设置页面-域名设置-新增域名,添加新域名即可(格式和上面一样,一个域名一行,不要标点符号

  • HTTPS:同3.3中操作即可

    必须在修改配置文件前完成,一旦修改了配置文件,就无法操作HTTPS了(打开页面提示“服务错误”,https开关自动关闭,这是正常情况)

  • 反向代理建议删掉所有反向代理,通过配置文件完成反向代理

3.4.4 修改配置文件(重点)

  • 点击配置文件(网站设置标题的右侧),进入配置文件修改页面

    server {
        listen 80 ; 
        server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com; 
        index index.php index.html index.htm default.php default.htm default.html; 
        proxy_set_header Host $host; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        proxy_set_header X-Forwarded-Host $server_name; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_http_version 1.1; 
        proxy_set_header Upgrade $http_upgrade; 
        proxy_set_header Connection $http_connection; 
        access_log /www/sites/nas.vekixx.com/log/access.log main; 
        error_log /www/sites/nas.vekixx.com/log/error.log; 
        location ^~ /.well-known/acme-challenge {
            allow all; 
            root /usr/share/nginx/html; 
        }
        include /www/sites/nas.vekixx.com/proxy/*.conf; 
        if ($scheme = http) {
            return 301 https://$host$request_uri; 
        }
        ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; 
        ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; 
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
        ssl_prefer_server_ciphers on; 
        ssl_session_cache shared:SSL:10m; 
        ssl_session_timeout 10m; 
        error_page 497 https://$host$request_uri; 
        proxy_set_header X-Forwarded-Proto https; 
        add_header Strict-Transport-Security "max-age=31536000"; 
    }
    
  • 只需保留几项,在此基础上修改

    server {
        listen 80 ; 
        server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com; 
        ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; 
        ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; 
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
    }
    
  • 添加相应代码

    将第3行之后的代码剪切至其他地方,原位添加:return 301 https://$host$request_uri;

    server {
        listen 80 ; 
        server_name nas.vekixx.com emby.xxxx.com aria.xxxx.com ... qb.xxxx.com;
        return 301 https://$host$request_uri; 
    }
    

    在下方粘贴

    server {
      listen 443 ssl http2 ; 
      server_name nas.vekixx.com; 
    
      location / {
          proxy_pass http://127.0.0.1:50001; 
          proxy_set_header Host $host; 
          proxy_set_header X-Real-IP $remote_addr; 
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
          proxy_http_version 1.1; 
          proxy_set_header Connection ""; 
      }
    }
    

    server_name 下一行粘贴剪切走的代码

    server {
        listen 443 ssl http2 ; 
        server_name nas.vekixx.com; 
        ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; 
        ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; 
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
        location / {
            proxy_pass http://127.0.0.1:50001; 
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_http_version 1.1; 
            proxy_set_header Connection ""; 
        }
    }
    

    上述内容即可当成模板,需要添加一个服务就复制一遍,修改server_name后的域名proxy_pass http://127.0.0.1:45001;中的端口号 ,以alist为例

    server {
        listen 443 ssl http2 ; 
        server_name nas.vekixx.com; 
        ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; 
        ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; 
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
        location / {
            proxy_pass http://127.0.0.1:50001; 
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_http_version 1.1; 
            proxy_set_header Connection ""; 
        }
    }
    server {
        listen 443 ssl http2 ; 
        server_name alist.vekixx.com; 
        ssl_certificate /www/sites/nas.vekixx.com/ssl/fullchain.pem; 
        ssl_certificate_key /www/sites/nas.vekixx.com/ssl/privkey.pem; 
        ssl_protocols TLSv1.3 TLSv1.2 TLSv1.1 TLSv1; 
        ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:!aNULL:!eNULL:!EXPORT:!DSS:!DES:!RC4:!3DES:!MD5:!PSK:!KRB5:!SRP:!CAMELLIA:!SEED; 
        location / {
            proxy_pass http://127.0.0.1:50002; 
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_http_version 1.1; 
            proxy_set_header Connection ""; 
        }
    }
    

    注1:此时frps服务器防火墙中5000150002端口可不放开,但7000端口必须打开

    注2:此外,对于部分文件应用,nginx默认不大于50M,需要传输大文件的需要增加一些代码,如对于Alist

    server {
        listen 443 ssl http2 ; 
        server_name alist.vekixx.com; 
        .
        .
        .
        .        
        .       
        location / {
            proxy_pass http://127.0.0.1:50002; 
            proxy_set_header Host $host; 
            proxy_set_header X-Real-IP $remote_addr; 
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
            proxy_http_version 1.1; 
            proxy_set_header Connection ""; 
            #在此后添加
            client_max_body_size 10G; #文件大小10G以下 
            proxy_send_timeout 7200;  #超时时间7200s
            proxy_read_timeout 7200;  #超时时间7200s
        }
    }
    
  • 点击保存并重载完成配置,即完成多个域名反代

四、STCP

上述操作(双向验证+HTTPS)访问本地服务安全已经较高,但是本地服务中还有许多服务不宜暴露在外网,比如SSH、路由器的网页等,一旦被破解,极易造成本地服务崩溃、数据丢失,而STCP则是将其通过更加安全的方法(类VPN)暴露此类服务,即在外网不运行frpc则无法访问此类服务。

示意图:
mermaid-202567 122531

双方frpc.toml代码示意图:

2025-06-07_125541
#被访问者
serverAddr = "frps_ip"
serverPort = 7000
auth.method = "token"
auth.token = "your_token" #与frps匹配
transport.tls.certFile = "/etc/frp/ssl/client.crt"
transport.tls.keyFile = "/etc/frp/ssl/client.key"
transport.tls.trustedCaFile = "/etc/frp/ssl/ca.crt"</br>
[[proxies]]
name = "nas_stcp_ssh"  #≈账号
type = "stcp" 
secretKey = "stcp_key"  #≈密码
localIP = "10.0.0.1"
localPort = 3333
transport.useEncryption = true
transport.useCompression = true
#访问者
serverAddr = "frps_ip" 
serverPort = 7000
auth.method = "token"
auth.token = "your_token" #与frps匹配
transport.tls.certFile = "./ssl/client.crt"
transport.tls.keyFile = "./ssl/client.key"
transport.tls.trustedCaFile = "./ssl/ca.crt"</br>
[[visitors]]
name = "nas_stcp_ssh visitor"
type = "stcp"
serverName = "nas_stcp_ssh" #与被访问者name对应 ≈账号
secretKey = "stcp_key"   #与被访问者secretKey对应 ≈密码
bindAddr = "127.0.0.1"
bindPort = 60001 
transport.useEncryption = true
transport.useCompression = true

使用方法:

  • 若是10.0.0.1:3333为一网页端口,则使用浏览器访问http://127.0.0.1:60001即显示http://10.0.0.1:3333内容

  • 若是10.0.0.1:3333为一SSH端口,则可使用ssh {user_name}@127.0.0.1 -p 60001即可打开10.0.0.1的终端

    SSH软件使用:

    • 以Windterm为例:

      image-20250606223847915
    • 其他SSH软件大多数存在主机端口用户,按需填写即可

2

评论区