Remnawave面板搭建全流程

流量拼车的好搭档

Author Avatar

ghung

  ·  4 min read

由于最近新买了一个DMIT,流量有些多所以有了拼车的需求。我之前使用的搭建节点的方式是「233boy」一键脚本或者「3-XUI」等一些面板。这些方式适合自用,对于拼车来说用户管理不方便,而且也看不到流量具体的使用情况,或者订阅到期的情况。如果使用「 Xboard 」的这些机场面板的话,又显得太重了。

在网上冲浪的时候刷到了 Remnawave。只看了一眼这个面板的外观,便被它吸引了。经过搭建使用后,发现它不仅外表美丽,并且功能也十分强大,属于是中看又中用。

它的使用场景仅限于自用或者拼车,更推荐拼车使用。

20260130000026685.png

缺点 #

  1. 协议支持不全,这个面板是基于 「Xray」的,所以有些协议是无法支持的,例如 hy2。并且有些协议(例如 Shadowsocks-2022 ),它也暂时没有支持。
  2. 占用资源比较多,因为这个系统无论是面板端还是节点端,都是使用Docker部署的。节点端(也就是搭建节点的小机)需要 5GB 左右的储存空间。内存无所谓,只要能跑起来 Docker 就行。面板端需要10GB左右的储存空间。
  3. 上手难度比较高,不仅指的是部署难度,也指它的节点配置是需要手搓配置文件的。

优点 #

  1. 对于多用户支持比较好。可以针对每个用户设置以下内容:流量充值时间、流量限额、流量到期时间等,也就是说比较适合拼车
  2. 主从架构设计。具有一个面板端和多个节点端,可以通过面板端下发配置文件,统一修改。节点端不需要做过多操作,用来控制多台小鸡的体验十分爽。
  3. 手写配置更加灵活可控。
  4. 内置订阅转换功能。对于多个客户端,可以下发不同的订阅模板,也就是说内置了订阅转换的功能。
  5. 具有非常直观的统计页面,可以看到具体的统计数据。

总体来说,这个面板非常适合喜欢折腾的用户使用。最终的效果和功能还是十分令人满意的,用了之后觉得回不去之前用的 X-UI 等面板了。


到了部署的部分,其实官方的部署文档是我自部署这么多服务以来遇到的最详细的。它里面包含了非常详细的步骤,并给出了非常详细的配置模板。跟着官方文档来,基本上没有遇到什么问题,也没有踩到什么坑。

官方链接:Remnawave Documentation | quick-start

部署记录 #

首先是面板端:

  1. 这个面板端不是必须要搭建在节点的机器上,可以在任何机器上。
  2. 面板端最好是有公网 IP。如果没有公网 IP 的话,也可以尝试用其他方法,但还是建议优先使用公网 IP。
  3. 该面板必须通过 SSL 进行访问。

面板端搭建 #

Remnawave Panel 是 Remnawave 的核心组件,用于管理用户、节点、订阅等。

安装 Docker:

sudo curl -fsSL https://get.docker.com | sh

创建项目目录并进入:

  mkdir /opt/remnawave && cd /opt/remnawave

下载 docker-compose.yml 和 .env.sample:

  curl -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
  curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sample

配置 .env 文件

  # 以下生成的密码都是为了程序内部使用,一般是不需要记录下来的
  #JWT_AUTH_SECRET 与 JWT_API_TOKENS_SECRET 用于认证与安全相关功能。建议生成安全密钥:
  
  sed -i "s/^JWT_AUTH_SECRET=.*/JWT_AUTH_SECRET=$(openssl rand -hex 64)/" .env && \
  sed -i "s/^JWT_API_TOKENS_SECRET=.*/JWT_API_TOKENS_SECRET=$(openssl rand -hex 64)/" .env

  #生成 Metrics 与 Webhook 密钥:

  sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env && \
  sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .env

  #强烈建议修改默认 Postgres 密码(并同步更新 DATABASE_URL):

  pw=$(openssl rand -hex 24) && \
  sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env && \
  sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^\@]*\(@.*\)|\1$pw\2|" .env

然后手动打开 .env,修改以下变量:

vim .env
  • FRONT_END_DOMAIN:面板访问域名(例如 panel.example.com
  • SUB_PUBLIC_DOMAIN:目前填写面板域名并追加 /api/sub(例如 panel.example.com/api/sub

启动容器:

docker compose up -d && docker compose logs -f -t

启动后稍等片刻,应看到面板相关输出。

panel_up-577201a05d97a2b7fec5a582f6631689.jpg

Nginx 反向代理配置 #

关于这一部分,官方给出的实例配置文件非常详细,涵盖了各种常用的服务(例如 Nginx 和 Caddy),可以直接参考并照抄官方的配置文件。 Remnawave Documentation | reverse-proxie

针对 Nginx ,官方给出的是 Docker 运行的 Nginx 服务配置文件,我这里给出独立运行的 Nginx 配置文件供参考:

upstream remnawave {
    #Change this part
    server 127.0.0.1:port;
}

server {
    listen 80;
    listen [::]:80;
    #Change this part
    server_name panel.example.com;
    location / {
        return 301 https://$host$request_uri;
    }
}

server {
    server_name panel.example.com;

    listen 443 ssl http2 reuseport;
    listen [::]:443 ssl http2 reuseport;

    location / {
        proxy_http_version 1.1;
        proxy_pass http://remnawave;
        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_set_header X-Forwarded-Proto $scheme;
    }

    # SSL Configuration (Mozilla Intermediate Guidelines)
    ssl_protocols          TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets    off;
    #Change this part
    ssl_certificate "/etc/ssl/certs/panel.example.com.pem";
    ssl_certificate_key "/etc/ssl/private/panel.example.com.key";
    #ssl_trusted_certificate "/etc/ssl/certs/yzyy.de.pem";

   # ssl_stapling           on;
   # ssl_stapling_verify    on;
    resolver               1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    resolver_timeout       2s;

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types
        application/atom+xml
        application/geo+json
        application/javascript
        application/x-javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rdf+xml
        application/rss+xml
        application/xhtml+xml
        application/xml
        font/eot
        font/otf
        font/ttf
        image/svg+xml
        text/css
        text/javascript
        text/plain
        text/xml;
}

到这一步,访问 panel.example.com 并设置管理员账户应该就可以看到面板主页了。

Image_2026-01-30_01-20-18_ikdlhpmi.rzp.png

Remnawave 节点安装与配置 #

Remnawave 节点的建立方式,是通过面板端下发配置文件到节点端运行的,所以我们需要在面板端设置好节点搭建所需要的配置文件。

Xray-core本身支持非常多的协议,具体需要看 Xray 的官方文档。我对这方面了解较浅,所以以下的教程就以我们最常用的的 VLESS-TCP-Reality 节点作为例子。

创建配置文件 #

 在 配置文件菜单项 里新建一个配置文件,配置文件的名称可以用英文随意命名,我们就以 VLESS-TCP-Reality 作为名称。
![Image_2026-01-30_01-32-05_hivtzu1y.zko.png](https://webp.050612.xyz/2026/01/20260130013208636.png)

Vless-tcp-reality配置示例:

{
  "log": {
    "loglevel": "info"
  },
  "inbounds": [
    {
      "tag": "VLESS_TCP_REALITY",
      "port": 443,
      "protocol": "vless",
      "settings": {
        "clients": [],
        "decryption": "none"
      },
      "sniffing": {
        "enabled": true,
        "destOverride": [
          "http",
          "tls",
          "quic"
        ]
      },
      "streamSettings": {
        "network": "raw",
        "security": "reality",
        "realitySettings": {
          "show": false,
          "xver": 0,
          "target": "www.cloudflare.com:443",
          "shortIds": [
            ""
          ],
          "privateKey": "填写生成的私钥",
          "fingerprint": "chrome",
          "serverNames": [
            "www.cloudflare.com"
          ]
        }
      }
    }
  ],
  "outbounds": [
    {
      "tag": "DIRECT",
      "protocol": "freedom"
    },
    {
      "tag": "BLOCK",
      "protocol": "blackhole"
    }
  ],
  "routing": {
    "rules": []
  }
}

填入节点配置参数:

其中节点的公钥和私钥的生成,可以利用面板中提供的生成工具。在配置文件中,只需要把生成的私钥填上去,至于公钥会自动计算并配置给节点端。

因为本教程只涉及后端的搭建,关于SNI的寻找,可以查找相关教程。

20260130220526111

另外,一份配置文件里可以设置多个入站。也就是说,可以在一份配置文件里同时在节点机器上搭建多个不同类型的节点,让一个节点同时支持多种协议和传输方式。

例如可以将 VLESS-XHTTP-Reality、VLESS-TCP-Reality 或者 Shadowsocks 这几种协议都配置在同一个文件里。


创建节点 #

找到节点菜单下,现在创建一个节点。

在这可以首先说一下 Remnawave 面板中“节点”的概念到底是什么。其实是给系统内部看的,和我们在代理客户端中看到的Vless节点不一样,它存在的意义就是为了在面板中显示。也就是这个主从架构中的"从"。

Image_2026-01-31_00-50-31_qli1qvb0.b5e.png

这里要注意 Node Port 这个参数。这个参数只是为了给面板端和节点端通信使用,并不是 Vless节点 的端口,而Vless节点的端口已经是在配置文件中指明的,可以随便给。

填写相关信息后点击下一步:

Image_2026-01-31_00-53-27_g1zc3cxs.442.png

选择我们刚刚创建的配置文件,并点击复制 docker-compose.yml 文件。

这是为了给我们在节点端机器上使用。

现在我们要在节点VPS上进行操作,首先,节点 VPS也需要安装 Docker。

创建目录:

mkdir /opt/remnanode && cd /opt/remnanode

创建 compose 文件,并将我们刚刚复制的 docker-compose.yml 的内容粘贴到这里。

vim docker-compose.yml

如果有使用 UFW 防火墙或者有服务器外部防火墙的话,需要注意放行两个端口:

  1. 节点端口
  2. 面板端与节点端的通信端口 Node Port,因为面板端 VPS 一般都有固定 IP ,可以只开放这个端口给固定的 IP,这样会更加安全一些。
sudo ufw allow from 1.2.3.4 to any port 2222

启动服务:

docker compose up -d

一会儿便可以看到节点列表中,该节点颜色变绿,说明已经连接成功。

Image_2026-01-31_01-06-08_glen4mdw.azn.png

现在点击这个节点可以进行管理:

可以设置该节点的流量消耗倍率,默认是一倍。值得注意的是,RW面板的流量只记录单向流量消耗。如果你的节点 VPS 是双向计费的话,可以在此把流量消耗的流量倍率设置为 2.0。

Image_2026-01-31_01-36-03_zvo3cd0y.byf.png

如果节点连接不上,除了网络问题外,一般是Xray-core配置有误,可以通过下面的命令来检查remnanode容器的日志:

docker compose logs -f

如果看到有类似这样的错误提示,则可以确定是Xray-core配置有误:

XML-RPC fault: SPAWN_ERROR: xray

然后使用下面的命令来查看Xray-core的日志,根据Xray-core的日志信息来解决相应的问题:

docker exec -it remnanode tail -n +1 -f /var/log/supervisor/xray.out.log

创建主机 #

关于 Remnawave 面板中主机的概念,官方是这样介绍的:

Image_2026-01-31_01-09-20_k3jt34nb.1d3.png

根据我的理解,主机的概念与 Remnawave 面板中节点的概念是一组对应。

  1. 节点(Node):是为了在面板中进行内部管理。
  2. 主机(Host):是为了对外进行展示。

简单来说,配置的一个“主机”就是用户未来在代理客户端(如clash party)中看到的一个具体的节点.

现在我们创建一个 VLESS TCP Reality 节点给用户使用。

进行添加一个主机:

  1. 备注:这就是用户在代理客户端中看到的节点名字,可以按照习惯进行填写,例如🇺🇸US01。
  2. 配置文件:每个主机都要选择一个配置文件,选择刚刚写的配置文件即可
  3. 地址:如果你在协议中带了 TLS,可以填写相应的域名;如果没有过 CDN,就填写主机的 IP 地址(节点端VPS的 IP 地址)
  4. 端口:一般可以通过配置文件自动填入。
  5. 节点:选择我们刚刚添加的节点,
  6. 最后点击上面的“主机可见性”,点击保存即可

Image_2026-01-31_01-13-31_lsjdzs30.fzr.png


订阅设置 #

这就是Remnawave 面板自带的节点转换功能,可以根据用户使用的不同客户端,下放不同的配置模板。

Image_2026-01-31_01-30-12_4zu0c25f.0hc.png

订阅信息这一项,每一个可配置的参数都给出了详细的解释,可以自行设置。例如“配置标题”这一个参数,就可以在 clash内核 的一些 GUI 中显示配置名称。

Image_2026-01-31_01-34-19_iew210ok.ucc.png

Image_2026-01-31_01-33-37_ucbvkcjc.tfr.png

自定义备注这一项,可以设置在订阅过期、流量用尽或用户被禁用时,在用户代理客户端中添加一些名称为这些备注的节点。这些信息主要用来提醒客户,防止用户失联。

Image_2026-01-31_01-37-52_5nqsdmyi.s1e.png

Image_2026-01-31_01-39-57_oobm2w1r.wif.png

模板设置 #

根据用户使用的不同客户端,发放的一些模板配置。我目前只说一下关于 Clash 或者 Clash Meta(Mihomo)的配置文件:

proxies 段必须存在且为空,并且保留注入点:

proxies: # LEAVE THIS LINE!

后续 proxy-group 中的每一个组都会自动注入在 Remnawave 面板中设置的节点。

如果有分组不想注入这些节点,必须显式地写: remnawave: include-proxies: false

其实这部分还挺复杂的,因为不同代理客户端所支持的配置文件类型或者格式也不尽相同,需要查阅不同客户端、不同内核对于配置文件格式的支持情况。


创建用户分组 #

Remnawave 面板支持两种用户分组,都是为了访问控制:

  1. 内部分组:为了控制用户能看到哪些节点
  2. 外部分组:为了控制用户能获得哪种订阅模板,例如,带精细分流和没有精细分流的

点击“内部分组”菜单项,可以在系统自带的默认分组上进行修改,也可以新建一个:

  1. 选择你想包含的配置文件,这样使用该配置文件创建的节点都会包含进来
  2. 点击保存即可
    Image_2026-01-31_01-25-54_sj3a4tls.eqo.png

点击“外部分组”菜单项,同样的,可以使用系统自带的默认分组,也可以新建一个:

  1. 选择你想给这个分组使用的订阅模板
  2. 点击保存即可
    Image_2026-01-31_01-50-39_jzdxkvzs.ii0.png

创建用户 #

可以在此设置该用户的流量限制和重置时间。

重置时间一般是以自然月循环(例如每月重置一次)。此外,还可以设置订阅到期时间。

关于访问控制:通过刚刚设置的内部分组和外部分组,来控制该用户可以获取到的节点和订阅模板

Image_2026-01-31_01-54-04_xvyh5c5w.td0.png

我们再次点击该用户,就可以看到专属于这个用户的订阅URL。

Image_2026-01-31_01-57-00_y45zrbsa.mhy.png


至此,我们就可以获得一个非常完美的订阅链接,包含订阅转换、流量控制、到期时间等。

搭建 Subscription Page(可选) #

当我们通过浏览器打开获取到的订阅链接时,可以看到一个算得上精美的、独立的订阅页面。

并且还有一个额外的好处是隐藏我们的面板域名。

当设置这个订阅页面程序时,需要额外为此绑定一个不同于订阅面板的域名,之后获取到的订阅链接就都是这个域名了。

Image_2026-01-31_02-02-55_jkiyqnvs.yzc.png

部署流程:

编辑Remnawave面板的.env配置文件:

cd /opt/remnawave && vim .env

把之前的这个配置:

SUB_PUBLIC_DOMAIN=remnawave.example.com/api/sub

修改为你的订阅页面域名:

SUB_PUBLIC_DOMAIN=subscription.example.com

创建compose文件:

mkdir -p /opt/remnawave/subscription && cd /opt/remnawave/subscription && nano docker-compose.yml

写入如下配置:

services:
    remnawave-subscription-page:
        image: remnawave/subscription-page:latest
        container_name: remnawave-subscription-page
        hostname: remnawave-subscription-page
        restart: always
        environment:
            - REMNAWAVE_PANEL_URL=https://remnawave.example.com
            - APP_PORT=3010
            - META_TITLE="Subscription Page Title"
            - META_DESCRIPTION="Subscription Page Description"
        ports:
            - '127.0.0.1:3010:3010'
        networks:
            - remnawave-network

networks:
    remnawave-network:
        driver: bridge
        external: true

注意:REMNAWAVE_PANEL_URL这里要指向你的面板URL,但是有多种配置方法。

1、此订阅页面程序与面板不在同一台服务器部署,那么这里就填写面板的域名,并且去掉compose内的external: true配置。

2、在同一服务器部署,可以直接填面板服务的主机名:3000,例如:http://remnawave:3000,也可以直接填写域名。

启动:

docker compose up -d

配置反向代理:

我这里使用的是 Nginx。在刚刚为面板配置的 Nginx 配置文件中,添加以下 server块 即可。

upstream remnawave-subscription-page {
	#Change this part
    server 127.0.0.1:port;
}

server {
    server_name subscription.example.com;

    listen 443 ssl http2;
    listen [::]:443 ssl http2;

    location / {
        proxy_http_version 1.1;
        proxy_pass http://remnawave-subscription-page;
        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_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Port $server_port;

        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }

    # SSL Configuration (Mozilla Intermediate Guidelines)
    ssl_protocols          TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-CHACHA20-POLY1305;

    ssl_session_timeout 1d;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets    off;
    ssl_certificate "/etc/ssl/certs/050612.xyz.pem";
    ssl_certificate_key "/etc/ssl/private/050612.xyz.key";
    ssl_trusted_certificate "/etc/ssl/certs/050612.xyz.pem";

    ssl_stapling           on;
    ssl_stapling_verify    on;
    resolver               1.1.1.1 1.0.0.1 8.8.8.8 8.8.4.4 208.67.222.222 208.67.220.220 valid=60s;
    resolver_timeout       2s;

    # Gzip Compression
    gzip on;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 6;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_min_length 256;
    gzip_types
        application/atom+xml
        application/geo+json
        application/javascript
        application/x-javascript
        application/json
        application/ld+json
        application/manifest+json
        application/rdf+xml
        application/rss+xml
        application/xhtml+xml
        application/xml
        font/eot
        font/otf
        font/ttf
        image/svg+xml
        text/css
        text/javascript
        text/plain
        text/xml;
}

此外,Remnawave 具有丰富的社区生态。比如说,面板本身没有对接支付系统,但在以下链接中,有一个项目可以在 Telegram 中配置 Bot 并对接一些支付系统,只是没有中国大陆经常使用的支付方式罢了。

awesome-remnawave

由于我没有用到,便在此不做过多介绍,请大家自行探索吧。

备用链接:在 Remnawave 中配置中转或者落地