实战: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 秒自动重生的高可用监控方案。
一、方案核心原理与前置准备
- 核心逻辑:在本地创建回环映射(
127.0.0.1:<本地映射端口>),利用 SSH 隧道将流量经过一台无端口限制的正常 VPS(跳板机)转寄至哪吒面板真实的 IPv4 端口(面板IPv4:5555);探针仅需连接本地回环即可。 - NAT 控制台前置设置(关键):若你的机器是共享 IPv4 的 NAT VPS,需提前进入服务商网页控制台的 “端口映射” 菜单,在分配给你的公网端口范围中,挑选并预留一个内网端口(本文以占位符
<本地映射端口>代指,例如16697),确保该端口在系统内部未被占用且具备常规网络权限。 - 避免 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 状态,说明整个后台自愈系统部署成功。即使服务器重启或遭遇网络闪断,探针均能在恢复后自动连回面板。