核心摘要
- SmokePing基于Docker容器化部署,资源占用低,单台t3.small实例即可运行完整监控系统
- 支持ICMP、TCP、DNS、HTTP等多协议探测,可监控专线网络质量、跨区域服务性能及关键业务端口
- 通过Amazon SNS或自定义Python脚本实现告警推送,支持Master/Slave分布式架构扩展
- RRD数据库高效存储历史监控数据,便于故障溯源与性能趋势分析
AWS中国区SmokePing网络监控部署指南:Docker容器化与SNS告警集成
为什么需要轻量级网络监控方案
在亚马逊云科技中国区运营环境中,由于缺乏托管的网络监控管理服务(如Network Synthetic Monitor),运维团队在多个关键场景中面临监控盲区。Direct Connect专线网络质量波动、Overlay网络可达性异常、跨区域服务访问延迟以及关键业务端口的可用性状态,这些都需要持续性的监控覆盖。
市面上主流的监控方案如Prometheus blackbox-exporter + Grafana组合虽然功能全面,但其部署复杂度和资源消耗往往超出轻量级监控场景的实际需求。对于仅需监控特定网络链路或服务端点的场景,一个能在单台小型实例上稳定运行、同时提供直观可视化界面的解决方案更具实用价值。
SmokePing技术特性与架构优势
SmokePing作为一款经过长期验证的开源网络延迟监测工具,在轻量化监控领域具备显著优势。其核心设计理念是以最小的系统开销实现精确的网络性能测量。
核心技术优势
- 容器化部署:基于Docker的部署方式将依赖项降至最低,环境一致性得到保障
- 资源效率:内存和CPU占用极低,t3.small甚至更小规格的实例即可满足运行需求
- 配置灵活性:通过文本配置文件定义监控目标和探测参数,版本控制友好
- 可视化呈现:内置Web界面提供网络性能趋势图表,延迟抖动一目了然
功能覆盖范围
- 精确延迟测量:同时追踪数据包丢失率和往返时间(RTT)变化
- 多协议支持:涵盖ICMP、TCP、DNS、HTTP等常用网络协议
- 多级告警机制:支持基于丢包模式和延迟阈值的复合告警规则
- RRD数据存储:采用环形数据库高效存储时序数据,自动归档历史记录
- 分布式架构:Master/Slave模式支持跨可用区或跨区域的多点探测
这套方案还支持与Amazon SNS集成或通过第三方API推送告警通知,确保运维团队能够及时响应网络异常。如果您正在寻找多云账单代付解决方案来优化云资源成本管理,轻量级监控工具的选择同样需要考虑运维效率与成本平衡。
部署前的环境准备
在开始SmokePing部署之前,需要完成以下基础设施准备工作:
EC2访问密钥对
准备用于SSH登录的密钥对,确保能够安全连接到目标实例进行配置操作。
安全组配置
创建安全组并开放必要端口:SSH端口(22)用于管理访问,监控页面端口(默认8888)用于Web界面访问。根据实际网络架构,可能还需要开放探测目标所需的出站规则。
EC2 IAM角色配置
IAM角色的权限配置需根据实际功能需求确定:
ECR镜像拉取权限(使用自建ECR作为镜像源时需要):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken",
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage"
],
"Resource": "*"
}
]
}
告警功能权限:如需使用SNS发送通知或通过Lambda触发自定义告警脚本,需添加相应的sns:Publish和lambda:InvokeFunction权限。
VPC Endpoint配置(可选)
若EC2部署在无互联网访问的私有子网中,需要为ECR、SNS、Lambda等服务创建VPC Endpoint,确保实例能够访问这些AWS服务。
SmokePing安装与配置流程
构建ECR镜像(推荐)
由于linuxserver/docker-smokeping官方镜像的下载可能受网络环境影响,建议将镜像下载后更新组件并推送至ECR,便于后续稳定使用。
官方Dockerfile未预装Python环境,无法直接使用自定义Python脚本实现告警。根据告警需求选择不同的代码仓库:
- 需要Python脚本告警(SNS、Lambda或自定义API):
git clone https://github.com/mengchen-tam/docker-smokeping - 仅使用SMTP告警:
git clone https://github.com/linuxserver/docker-smokeping
ECR镜像构建脚本
使用以下Bash脚本构建并推送镜像至ECR,执行前需更新相关参数:
#!/bin/bash
set -e
# 默认参数
ECR_ACCOUNT=""
ECR_REGION=""
ECR_REPO_NAME=""
TAG="latest"
DOCKER_DIR="/xxxx/docker-smokeping"
# 构建完整的 ECR 仓库 URL
ECR_URL="${ECR_ACCOUNT}.dkr.ecr.${ECR_REGION}.amazonaws.com.cn"
ECR_REPO="${ECR_URL}/${ECR_REPO_NAME}"
FULL_IMAGE_NAME="${ECR_REPO}:${TAG}"
echo "===== SmokePing Docker 构建和推送脚本 ====="
echo "ECR 账号: $ECR_ACCOUNT"
echo "ECR 区域: $ECR_REGION"
echo "ECR URL: $ECR_URL"
echo "仓库名称: $ECR_REPO_NAME"
echo "镜像标签: $TAG"
echo "目标镜像: $FULL_IMAGE_NAME"
# 进入 docker-smokeping 目录
cd "$DOCKER_DIR"
# 构建 Docker 镜像
echo "正在构建 Docker 镜像..."
docker build \
--no-cache \
--pull \
-t "$FULL_IMAGE_NAME" .
# 登录到 ECR
echo "正在登录到 ECR..."
aws ecr get-login-password --region $ECR_REGION | docker login --username AWS --password-stdin $ECR_URL
# 检查仓库是否存在,如果不存在则创建
if ! aws ecr describe-repositories --repository-names $ECR_REPO_NAME --region $ECR_REGION &> /dev/null; then
echo "创建 ECR 仓库 $ECR_REPO_NAME..."
aws ecr create-repository --repository-name $ECR_REPO_NAME --region $ECR_REGION
fi
# 推送镜像到 ECR
echo "正在推送镜像到 ECR..."
docker push "$FULL_IMAGE_NAME"
echo "===== 完成! ====="
echo "镜像已成功构建并推送到: $FULL_IMAGE_NAME"
EC2实例配置与软件安装
启动一台Ubuntu 24 EC2实例(使用默认Ubuntu AMI),推荐t3.small或更高规格。配置要点:
- 附加准备好的密钥对和安全组
- Metadata response hop limit需设置为2(确保容器内能访问实例元数据)
- 启动后通过Modify IAM role附加准备好的EC2角色
登录EC2后安装必要软件:
sudo snap install aws-cli --classic
sudo apt update
sudo apt upgrade
sudo apt install docker.io docker-compose
SmokePing容器初始化
按以下步骤完成容器部署和配置文件提取:
# 第1步:将当前用户添加到 docker 组
sudo usermod -aG docker $USER
newgrp docker
# 第2步:设置环境变量
export AWS_ACCOUNT_ID=""
export AWS_REGION=""
export REPO_NAME=""
export ECR_REGISTRY="${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com.cn"
export IMAGE_TAG="latest"
# 第3步:ECR登录
aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${ECR_REGISTRY}
# 第4步:拉取和标记镜像
docker pull ${ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG}
docker tag ${ECR_REGISTRY}/${REPO_NAME}:${IMAGE_TAG} smokeping:${IMAGE_TAG}
# 第5步:首次运行容器
docker run --name smokeping -d --rm -p 8888:80 -e TZ=Asia/Shanghai smokeping:${IMAGE_TAG}
# 第6步:准备数据目录
sudo mkdir -p /data/smokeping
sudo chown -R $USER:$USER /data/smokeping
# 第7步:复制初始配置文件到EC2文件系统中
docker cp smokeping:/data/ /data/smokeping/
docker cp smokeping:/config/ /data/smokeping/
# 第8步:停止临时容器
docker stop smokeping
# 第9步:挂载本地文件启动smokeping
docker run --name smokeping -d \
--restart unless-stopped \
-p 8888:80 \
-e TZ=Asia/Shanghai \
-v ~/smokeping/data:/data \
-v ~/smokeping/config:/config \
smokeping:${IMAGE_TAG}
配置文件目录结构
安装完成后,/data/smokeping目录结构如下:
smokeping/
├── config/ # 配置文件目录
│ ├── Alerts # 告警配置文件,定义告警规则和触发条件
│ ├── Database # 数据库配置文件,定义 RRD 数据库存储参数
│ ├── General # 通用配置文件,包含基本设置如所有者信息、网站标题等
│ ├── Presentation # 展示配置文件,定义网页显示相关参数
│ ├── Probes # 探测器配置文件,定义不同类型的监控探测方式
│ ├── Slaves # 从节点配置文件,用于分布式监控设置
│ └── Targets # 监控目标配置文件,定义要监控的主机和服务
└── data/ # 数据存储目录
├── DNS/ # DNS监控相关的数据目录
└── DNSProbes/ # DNS探测器的数据目录
其中Targets和Alerts是最核心的配置文件,其他配置通常保持默认即可。
监控目标配置示例
根据实际监控需求编辑/data/smokeping/config/Targets文件。以下是一个针对AWS中国区服务的监控配置示例:
*** Targets ***
probe = FPing
menu = Top
title = AWS China Network Latency
remark = AWS中国区网络延迟监控
+ Console
menu = 控制台
title = AWS控制台监控
remark = AWS中国区控制台访问监控
++ BeijingConsole
menu = 北京控制台
title = AWS北京区控制台
host = console.amazonaws.cn
++ NingxiaConsole
menu = 宁夏控制台
title = AWS宁夏区控制台
host = cn-northwest-1.console.amazonaws.cn
+ Storage
menu = 存储服务
title = AWS存储服务监控
remark = AWS中国区存储服务监控
probe = TCPPing
++ BeijingS3
menu = 北京S3
title = AWS北京区S3
host = s3.cn-north-1.amazonaws.com.cn
port = 443
++ NingxiaS3
menu = 宁夏S3
title = AWS宁夏区S3
host = s3.cn-northwest-1.amazonaws.com.cn
port = 443
+ DNS
menu = DNS服务
title = AWS DNS服务监控
remark = AWS中国区DNS服务器监控
++ DNS_115
menu = DNS-115
title = AWS DNS Server 115
host = ns-intl-115.awsdns-cn-07.com
port = 53
++ DNS_1457
menu = DNS-1457
title = AWS DNS Server 1457
host = ns-1457.awsdns-cn-27.net
port = 53
Docker Compose配置
创建docker-compose.yml文件以便于容器管理:
cd /data/smokeping/
cat > docker-compose.yml << 'EOF'
version: '3'
services:
smokeping:
container_name: smokeping
image: smokeping
ports:
- "8888:80"
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Shanghai
volumes:
- /data/smokeping/data:/data
- /data/smokeping/config:/config
restart: unless-stopped
EOF
使用Docker Compose启动服务:
docker stop smokeping
docker remove smokeping
cd /data/smokeping/
docker-compose up -d
SmokePing使用指南
访问监控界面
通过http://[EC2公网IP]:8888访问SmokePing Web界面。由于默认探测间隔为300秒,首次访问需等待约5分钟才能看到监控数据。如需更换访问端口,修改/data/smokeping/docker-compose.yml中的端口映射配置即可。
配置更新与数据持久化
根据监控需求修改/data/smokeping/config/目录下的配置文件后,执行docker-compose restart使配置生效。历史监控数据保存在/data/smokeping/data目录中,采用RRD文件格式按目录层级存储:
├── data
│ ├── Console
│ │ ├── BeijingConsole.rrd
│ │ └── NingxiaConsole.rrd
配置更新或镜像升级不会导致历史数据丢失,这一设计确保了监控数据的连续性和可追溯性。
历史数据查询
在Web界面中点击对应的监控图表可进入详细监控页面。在详细页面中,支持通过拖选时间段或指定time range参数查看特定时间段的监控数据,便于故障时间点的精确定位。
告警系统配置
告警规则定义
在/data/smokeping/config/Alerts文件中定义告警类型和通知方式:
*** Alerts ***
to = |/config/alertsns.py
from = [email protected]
+someloss
type = loss
# in percent
pattern = >0%,*12*,>0%,*12*,>0%
comment = loss 3 times in a row
+hostdown
type = loss
# in percent
pattern = >60%
edgetrigger = yes
comment = Massive loss for 5 mins
告警通知方式选择:
- SMTP环境:直接配置收件邮箱地址
- 内网环境:通过脚本触发Lambda或SNS服务
目标级别告警配置
在config/Targets文件中为特定目录或主机启用告警:
+ Demo_Monitor
menu = Monitor Demo (Demo using fake IP)
title = Monitor Demo (Demo using fake IP)
alerts = someloss,hostdown
此配置将对Demo_Monitor目录下所有监控目标启用someloss和hostdown两种告警类型。
SNS告警脚本实现
以下Python脚本实现了与Amazon SNS的集成,通过EC2实例元数据服务获取临时凭证:
#!/usr/bin/env python3
# 导入必要的库
import sys
import time
import boto3
import requests
import json
from datetime import datetime
def get_imdsv2_token():
"""
获取 EC2 实例元数据服务 V2 版本的 token
这是 AWS 推荐的安全实践,用于防止 SSRF 攻击
"""
token_url = "http://169.254.169.254/latest/api/token"
headers = {
"X-aws-ec2-metadata-token-ttl-seconds": "21600"
}
token = requests.put(token_url, headers=headers).text
return token
def get_credentials():
"""
从 EC2 实例元数据服务获取临时安全凭证
"""
# 首先获取 IMDSv2 token
token = get_imdsv2_token()
headers = {
"X-aws-ec2-metadata-token": token
}
# 获取 IAM 角色名称
role_name_url = "http://169.254.169.254/latest/meta-data/iam/security-credentials/"
role_name = requests.get(role_name_url, headers=headers).text
# 使用角色名称获取临时凭证
credentials_url = f"http://169.254.169.254/latest/meta-data/iam/security-credentials/{role_name}"
credentials = requests.get(credentials_url, headers=headers).json()
return credentials
def send_sns(topic_arn, message):
"""
发送消息到 AWS SNS 主题
"""
# 获取临时凭证
credentials = get_credentials()
# 初始化 SNS 客户端
sns = boto3.client(
'sns',
region_name='cn-north-1',
aws_access_key_id=credentials['AccessKeyId'],
aws_secret_access_key=credentials['SecretAccessKey'],
aws_session_token=credentials['Token']
)
try:
# 发布消息到 SNS 主题
response = sns.publish(
TopicArn=topic_arn,
Message=message
)
print(f"Message published successfully: {response['MessageId']}")
return response
except Exception as e:
print(f"Failed to publish message: {str(e)}")
return None
def main():
"""
主函数:处理命令行参数并发送告警
命令行参数格式:alertname target losspattern rtt hostname
"""
# 验证命令行参数数量
if len(sys.argv) != 6:
print("Usage: {} alertname target losspattern rtt hostname".format(sys.argv[0]))
sys.exit(1)
# 解析命令行参数
alertname = sys.argv[1]
target = sys.argv[2]
losspattern = sys.argv[3]
rtt = sys.argv[4]
hostname = sys.argv[5]
# 生成当前时间戳并记录日志
current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
log_message = f"""
{current_time}: Received parameters:
alertname: {alertname}
target: {target}
losspattern: {losspattern}
rtt: {rtt}
hostname: {hostname}
"""
print(log_message)
# 构建告警消息
alert_message = f"SMOKEPING_ALERT|{int(time.time())}|{alertname}|{target}|{losspattern}|{rtt}|{hostname}"
print(alert_message)
# 构建格式化的 SNS 消息
sns_message = f"""
SmokePing Alert Details:
========================
Alert Name: {alertname}
Target: {target}
Loss Pattern: {losspattern}
RTT: {rtt}
Hostname: {hostname}
Time: {current_time}
"""
# 发送到 SNS 主题(需替换实际的 AWS 账号和主题名)
topic_arn = "arn:aws-cn:sns:cn-north-1::"
send_sns(topic_arn, sns_message)
if __name__ == "__main__":
main()
SNS告警功能检查清单
- 在Targets配置中明确指定需要触发告警的监控目标
- 确保EC2能够通过公网或VPC Endpoint访问SNS服务
- SNS可替换为其他API(如第三方短信服务),需相应修改Python脚本
实施要点与注意事项
网络连通性验证
部署完成后,建议先使用ping或telnet命令从EC2实例手动验证目标主机的可达性,确保安全组和网络ACL配置正确。
探测间隔调优
默认300秒的探测间隔适用于大多数场景。对于需要更高精度监控的关键链路,可在Probes配置中调整step参数,但需注意更短的间隔会增加系统负载。
存储容量规划
RRD数据库采用固定大小的环形存储结构,长期运行不会导致磁盘空间持续增长。但监控目标数量较多时,建议预留足够的/data分区空间。
高可用性考量
对于生产环境,可考虑部署Master/Slave架构,将Slave节点分布在不同可用区,既能实现多点探测,也能提供一定程度的冗余能力。
方案适用场景
这套SmokePing监控方案特别适合以下场景:
- 尚未建立完整网络监控体系的环境,需要快速搭建基础监控能力
- Direct Connect专线底层网络质量的持续监测
- 外部依赖服务(如第三方API、合作伙伴系统)的可用性监控
- 跨区域服务访问延迟的基准测量与趋势分析
- 预算有限但需要可视化监控界面的轻量级运维场景
AWS/GCP/多云账单代付 – 免实名 & 支持 USDT 支付 | Payment 解决方案为企业提供灵活的