🚀 运行: ...
IP: ...
ISP: 检测中...

实战:Alpine Linux NAT VPS 绕过出站拦截部署哪吒探针并配置 OpenRC 开机与故障自愈

在部分 NAT VPS 或轻量级容器(如 LXC / Docker)环境中,上级母鸡服务商常出于安全策略,对外部非标端口(如哪吒面板默认的 5555 gRPC 端口)做严格的出站(Outbound)拦截。探针在直连面板时会直接抛出 dial tcp ... connect: connection refused 错误。

由于哪吒探针(Nezha Agent)基于 Go 语言编译,其网络库绕过标准 C 库直接调用 Linux 内核系统调用(Syscall),传统使用 proxychains 进行动态库预加载(LD_PRELOAD)的全局代理方式对 Go 原生程序完全无效。

本文将通过 SSH 本地端口转发打通隧道,并结合 Alpine Linux 的 OpenRC supervise-daemon 机制,实现开机自启进程崩溃/断线 2 秒自动重生的高可用监控方案。

一、方案核心原理与前置准备

  1. 核心逻辑:在本地创建回环映射(127.0.0.1:<本地映射端口>),利用 SSH 隧道将流量经过一台无端口限制的正常 VPS(跳板机)转寄至哪吒面板真实的 IPv4 端口(面板IPv4:5555);探针仅需连接本地回环即可。
  2. NAT 控制台前置设置(关键):若你的机器是共享 IPv4 的 NAT VPS,需提前进入服务商网页控制台的 “端口映射” 菜单,在分配给你的公网端口范围中,挑选并预留一个内网端口(本文以占位符 <本地映射端口> 代指,例如 16697),确保该端口在系统内部未被占用且具备常规网络权限。
  3. 避免 IPv6 优先握手解析: 若面板域名同时绑定了 AAAA 记录,转发目标建议直接填写哪吒面板的纯 IPv4 地址,避免因双栈策略导致跳板机优先走 IPv6 拨号而引发二次握手拒绝。

二、环境依赖安装

登录 Alpine NAT VPS 终端,安装轻量级密码交互工具 sshpass(避免开机启动服务时无法交互输入密码):

Bash

apk update
apk add sshpass

三、配置 SSH 隧道开机自启与自愈守护 (nezha-tunnel)

为避免网络抖动、母鸡闪断或进程意外退出导致隧道永久离线,我们利用 OpenRC 的 supervise-daemon 配合 --respawn-delay 2 --respawn-max 0 实现进程守护与无限次自愈重拉。

使用编辑器打开服务文件:

Bash

nano /etc/init.d/nezha-tunnel

将以下内容完整粘贴到文件中(注意替换大写参数):

Bash

#!/sbin/openrc-run

supervisor=supervise-daemon
name="nezha-tunnel"
description="SSH Tunnel for Nezha Agent"

# ================= 配置区域按需修改=================
SSH_PASS="你的跳板机ROOT密码"
SSH_HOST="你的跳板机IP"
SSH_PORT="你的跳板机SSH端口"
LOCAL_PORT="<本地映射端口>"
REMOTE_TARGET="你的面板IPv4地址:5555"
# ======================================================

command="/usr/bin/sshpass"
command_args="-p ${SSH_PASS} ssh -N -o StrictHostKeyChecking=no -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -L 127.0.0.1:${LOCAL_PORT}:${REMOTE_TARGET} root@${SSH_HOST} -p ${SSH_PORT}"

# 守护参数崩溃或断线后 2 秒自动重启0 表示无限次重试
supervise_daemon_args="--respawn-delay 2 --respawn-max 0"

output_log="/var/log/nezha-tunnel.log"
error_log="/var/log/nezha-tunnel.err"

depend() {
    need net
    before nezha-agent
}

保存并退出 nano(按 Ctrl + O,回车保存,按 Ctrl + X 退出),接着赋予可执行权限:

Bash

chmod +x /etc/init.d/nezha-tunnel

四、配置哪吒 Agent 客户端守护服务 (nezha-agent)

编辑探针的主服务脚本 /etc/init.d/nezha-agent,将连接目标 -s 指向本地回环端口:

Bash

nano /etc/init.d/nezha-agent

写入如下配置:

Bash

#!/sbin/openrc-run

supervisor=supervise-daemon
name="Nezha Agent"
description="哪吒探针监控端"

command=/opt/nezha/agent/nezha-agent
# 连接本地映射端口并填入后台生成的 Client Secret
command_args="-s 127.0.0.1:<本地映射端口> -p 你的面板ClientSecret"

name=$(basename $(readlink -f $command))
directory="/root"
supervise_daemon_args="--stdout /var/log/${name}.log --stderr /var/log/${name}.err"

depend() {
    need net nezha-tunnel
}

保存退出后赋予执行权限:

Bash

chmod +x /etc/init.d/nezha-agent

五、启动服务并固化开机自启

清理 OpenRC 缓存依赖并按依赖顺序拉起双服务:

Bash

# 1. 清理缓存并启动隧道服务
rc-service nezha-tunnel zap
rc-service nezha-tunnel restart
rc-update add nezha-tunnel default

# 2. 启动哪吒探针服务
rc-service nezha-agent restart
rc-update add nezha-agent default

六、验证运行状态与自愈测试

1. 检查服务与端口

执行以下组合检查命令:

Bash

rc-service nezha-tunnel status
rc-service nezha-agent status
netstat -tunlp | grep <本地映射端口>
  • 正常标准
    • 两项服务均输出 * status: started
    • netstat 明确显示 127.0.0.1:<本地映射端口> ... LISTEN
    • 哪吒监控面板网页后台显示该机器绿灯在线。

2. 进程自愈保活测试

在终端中模拟异常断线或暴力击杀:

Bash

killall -9 ssh sshpass
sleep 3
rc-service nezha-tunnel status
netstat -tunlp | grep <本地映射端口>

若服务依然保持 started 且本地端口在 2 秒内重新进入 LISTEN 状态,说明整个后台自愈系统部署成功。即使服务器重启或遭遇网络闪断,探针均能在恢复后自动连回面板。