哪吒监控 V1 版本相比于 V0 版本有一个重要更新,那就是从 V1 版本开始,不再区分 Dashboard 和 gRPC 端口,访问与通信均通过默认的 8008 端口。

如此一来,我们就可以只需要一个域名在 Cloudflare 开启 CDN (打开小黄云)并配置反向代理,使面板和 agent 通信都使用同一个域名并且开启 TLS。

Cloudflare 配置

在新版 V1 版本中,我们可以仅使用一个域名开启 CDN,访问与通信均通过一个域名来完成,此处以 dashboard.demo.com 为例。

  1. 在 Cloudflare 的 DNS 记录里添加 dashboard.demo.com 的 A 记录,指向你的面板主控 VPS 地址,并开启小黄云 (开启 CDN)。

  2. 在设置——网络里面打开 WebSockets 和 gRPC 开关。

  3. Cloudflare 设置选项里面 SSL/TLS 加密 模式选择 完全。

安装哪吒监控 V1

官方文档地址:https://nezha.wiki/guide/dashboard.html

安装 Dashboard

curl -L https://raw.githubusercontent.com/nezhahq/scripts/refs/heads/main/install.sh -o nezha.sh && chmod +x nezha.sh && sudo ./nezha.sh

以 Docker 安装为例,安装过程按提示输入以下信息:

  • 请输入站点标题:自定义你的站点标题(自行设置)。

  • 请输入暴露端口:公开访问端口(可直接默认 8008,或自行设置其它端口)。

  • 请指定安装命令中预设的 nezha-agent 连接地址:Agent对接地址【域名/IP:端口】(此处设置为 dashboard.demo.com:443)。

  • 是否希望通过 TLS 连接 agent:Agent 通信使用 TLS 连接(选 y)。

  • 请指定后台语言:选择语言偏好。

输入完成后,等待拉取 Docker 镜像。安装结束后,如果一切正常,你可以通过域名和端口号访问 Dashboard,例如:

http://dashboard.demo.com:8008

如果需要再次运行安装脚本,可输入以下命令:

./nezha.sh

登录到 Dashboard 配置界面

后台管理界面的路径为 /dashboard,你只需访问:

http://dashboard.demo.com:8008/dashboard

首次登录的默认用户名和密码均为 admin。建议登录后立即进入管理页面点击头像 —— 个人信息 —— 更新个人资料修改用户名和密码。

反向代理配置(推荐 1Panel)

从 V1 版本开始,不再区分 Dashboard 和 gRPC 端口,访问与通信均通过默认的 8008 端口。

以我正在使用的 1Panel 为例,在 1Panel 网站 —— 创建站点 —— 反向代理,填写你的公开访问域名,如 dashboard.demo.com,代理地址填写 http://127.0.0.1:8008 并确认保存。

打开刚创建的网站右边的 配置 —— HTTPS 配置你的证书文件(可以直接 1Panel 下 Acme 账户在线申请证书(推荐),也可以使用 Cloudflare 的 15 年源服务器证书。)然后启用 HTTPS。

打开配置文件菜单,在最后面加上以下代码,然后点保存并重载:

# 定义真实 IP 变量
map $http_cf_connecting_ip $real_ip {
    "" $remote_addr;
    default $http_cf_connecting_ip;
}

# 允许头部包含下划线
underscores_in_headers on;
# 设置真实 IP 头部
real_ip_header nz-realip;

# 定义上游服务器
upstream dashboard {
    keepalive 512;
    server 127.0.0.1:8008;
}

如果你使用的是其它面板(比如宝塔)或程序,完整的配置文件结构应该是这样的:

http {
    # 其他全局配置...
    
    # 定义真实IP变量
    map $http_cf_connecting_ip $real_ip {
        "" $remote_addr;
        default $http_cf_connecting_ip;
    }
    
    # 允许头部包含下划线
    underscores_in_headers on;
    # 设置真实IP头部
    real_ip_header nz-realip;
    
    # 定义上游服务器
    upstream dashboard {
        keepalive 512;
        server 127.0.0.1:8008;
    }
    
    # 其他全局配置...
    
    server {
        # server配置...
        
        # 反向代理配置(location块)...
    }
}

打开反向代理 —— 源文,将里面的内容全选删除,并替换为以下代码,然后点确认:

location ^~ / {
    proxy_pass http://127.0.0.1:8008;
    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 REMOTE-HOST $remote_addr;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header nz-realip $real_ip;  # 使用动态确定的真实 IP
    proxy_set_header Connection "upgrade";
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_read_timeout 1800s;
    proxy_send_timeout 1800s;
    proxy_buffer_size 128k;
    proxy_buffers 4 128k;
    proxy_busy_buffers_size 256k;
    proxy_max_temp_file_size 0;
    add_header X-Cache $upstream_cache_status;
    add_header Cache-Control no-cache;
    proxy_ssl_server_name on;
    add_header Strict-Transport-Security "max-age=31536000";
}

# gRPC 服务
location ^~ /proto.NezhaService/ {
    grpc_set_header Host $host;
    grpc_set_header nz-realip $real_ip;  # 使用动态确定的真实 IP
    grpc_read_timeout 600s;
    grpc_send_timeout 600s;
    grpc_socket_keepalive on;
    client_max_body_size 10m;
    grpc_buffer_size 4m;
    grpc_pass grpc://dashboard;
}

# WebSocket 服务
location ~* ^/api/v1/ws/(server|terminal|file)(.*)$ {
    proxy_set_header Host $host;
    proxy_set_header nz-realip $real_ip;  # 使用动态确定的真实IP
    proxy_set_header Origin https://$host;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_read_timeout 1800s;
    proxy_send_timeout 1800s;
    proxy_pass http://127.0.0.1:8008;
}

面板后台设置

  • 前端真实 IP 请求头设置为 nz-realip

  • Agent 真实 IP 请求头设置为 nz-realip

无论是否开启 CDN 都不需要修改这个设置,因为我们通过 Nginx 的 map 指令动态确定了 nz-realip 头部的值:

  • 开启 CDN 时:nz-realip 的值是 Cloudflare 提供的 $http_cf_connecting_ip(访问者真实 IP);

  • 关闭 CDN 时:nz-realip 的值是 $remote_addr(直接访问的 IP)。

此时若Cloudflare 升级 gRPC 配置,导致小鸡下线,可以进入Cloudflare关闭小黄云(cdn)即可。

至此,所有设置完成。你可以直接访问 dashboard.demo.com 来打开面板,进入后台点击服务器 —— 安装命令 —— Linux 复制 agent 命令开始添加你的受控小鸡了。

补充:

为了防止后续 Cloudflare 再将 Agent 上报判定为攻击行为而拦截,我们可以在 Cloudflare 控制面板中添加自定义规则来绕过特定路径的安全检查。

以下是具体步骤:

  1. 登录 Cloudflare 控制面板

  2. 选择域名

  3. 在左侧导航菜单中找到"安全性"或"Security"

  4. 点击"WAF"

  5. 选择"自定义规则"或"Custom Rules"

  6. 点击"创建规则"或"Create Rule"按钮

创建一个新规则,设置如下:

规则名称:允许 Nezha Agent 流量

如果匹配以下条件:
字段 URI 路径 运算符 开头为 值 /proto.NezhaService/
or (或)
字段 URI 路径 运算符 开头为 值 /api/v1/ws/

选择操作:
Skip (跳过)

在下拉列表中勾选:
Browser Integrity Check (浏览器完整性检查)
Security Level (安全级别)

这种方式在面板和 Agent 开启 CDN 的同时,可以解决 Agent 上报被拦截的问题。且仍然保留了其他安全功能,如DDoS保护、IP信誉等。

注:本人并非原创,个人整合RyanZ的文章。原文请参考:

1.https://misaka.es/archives/42.html 2.https://misaka.es/archives/48.html