主要内容:
Zabbix报警机制(创建触发器、设置邮箱、执行动作),Zabbix进阶操作(主动发现、主被动监控模式、拓扑图、聚合图形)、监控案例(监控Nginx服务状态、监控TCP连接状态)
一、Zabbix报警机制概念
- 自定义的监控项默认不会自动报警,首页也不显示报警错误提示,需要配置触发器与报警动作才可实现自动报警,如图所示:
1)触发器(Trigger)
创建触发器时,需要定义表达式(Expression)
当触发条件发生后,会导致一个触发事件,触发事件会执行某个动作;(例如:内存不足300M、用户超过30个等)
触发器表达式格式:
{<server>:<key>.<function>(<parameter>)}<operator><constant>
解释:{主机: key.函数(参数)}常数
Expression表达式示例:
① {web1:system.cpu.load[all,avg1].last(0)}>5 //0为最新数据
解释:如果web1主机最新的CPU平均负载值大于5,则触发器状态Problem
② {vfs.fs.size[/,free].max(5m)}
解释:根分区,最近5分钟的最大容量小于10G,则状态进入Problem
③ {vfs.file.cksum[/etc/passwd].diff(0)}>0 //0为最新数据
解释:最新一次校验/etc/passwd如果与上一次有变化,则状态进入Problem
补充:大多数函数使用秒作为参数,可以使用#来表示其他含义
avg, count, last, min and max 等函数支持额外的第二个参数time_shift(时间偏移量),这个参数允许从过去一段时间内引用数据;
2)动作(Action)
触发器的条件被触发后的行为(执行动作)(例如:发送邮件、重启某个服务等)
案例1:实现Zabbix报警功能
案例要求:沿用前面的Zabbix练习环境,使用Zabbix实现报警功能,实现以下目标:
- 1)监控Linux服务器系统账户数量
- 2)创建Media,设置邮件服务器及收件人邮箱
- 3)当系统账户数量超过21人时发送报警邮件
整体思路:
- 1)创建触发器并定义表达式
- 2)设置Media报警媒介-邮箱(发件人,收件人)
- 3)创建并设置Action动作
步骤1:创建触发器规则
1)创建触发器(当系统账户数量超过21人,发送报警)
注意:创建触发器时,建议使用英文语言环境;
通过【Configuration配置】--->【Templates模板】,找到创建的<count.line.passwd模板>,点击模板后面的<triggers触发器>,打开触发器的页面
点击<Create triggers创建触发器>按钮,创建触发器;
2)触发器表达式
填写【name触发器名称】(可任意),定义【serverity触发器报警级别】;
- 触发器名称:passwd_line-gt-21
- 触发器报警级别:Warning
触发器报警级别:
- ① 未分类Not classified
- ② 一般信息Information
- ③ 一般告警Warning
- ④ 危险告警Average
- ⑤ 高危告警High
- ⑥ 灾难告警Disaster
定义【表达式Expression】,表达式是触发异常的条件,点击<add添加>自动定义表达式(填写表达式:监控项、功能、账户数量大于21),当自定义完成后,点击<iburst插入>;
- item监控项:count_line_passwd_item //监控项
- Function功能:Last (most recent) T value is > N //最新数据>N
- N:21 //N为21
生成表达式:{count.line.passwd:count.line.passwd.last()}>21
**解释:**当系统的用户数量(监控项)的最新数据大于21,则触发条件;执行Action动作;
步骤2:设置邮件
1)创建Media报警媒介(设置发件人信息)
通过【Administration管理】--->【Media Type报警媒体类型】--->【选择Email邮件】
设置邮件服务器信息,设置邮件服务器及发件人邮件账户信息;
- SMTP服务器:localhost //Localhost指192.168.2.5
- SMTP电邮:root@localhost //以什么身份发送邮件
在Zabbis服务器检查postfix发邮件服务,保证postfix服务安装并开启(端口25)
bash
[root@zabbixserver ~]# yum -y install postfix
[root@zabbixserver ~]# systemctl enable postfix --now
[root@zabbixserver ~]# ss -nlptu | grep :25
tcp LISTEN 0 100 127.0.0.1:25 *:* users:(("master",pid=12643,fd=13))
2)为用户添加Media报警媒介(设置收件人信息)
在【Administration管理】--->【Users用户】中找到并选择【Admin】账户
在弹出的界面中选择【Media报警媒介】--->点击【Add添加】报警媒介
点击【Add添加】后,在【Meida Type类型】中填写报警媒介类型,收件人,时间等信息
- 类型:Email
- 收件人:root@localhost //实验中收件人为本机的root
- 当启时间:1-7,00:00-24:00 //周一至周日的0小时-24小时
- 如果存在严重性则使用:全部勾选 //针对哪些警告进行邮件通知
步骤3:创建Action动作
1)Action动作
Action(动作)是定义当触发器被触发时,执行的行为;
通过【Configuration配置】--->【Actions动作】--->【Actions Event source事件源:触发器】--->【Create action创建动作】
注意:事件源选择触发器
2)配置Action动作的触发条件
填写Action动作的名称(可任意);配置什么触发器被触发会执行本Action动作
-
- 动作名称:report_problem
-
- 新的触发条件:触发器 = passwd_line-gt-21 //系统账户数量大于21
<选择>并<添加>触发器 = passwd_line-gt-21;
3)配置Action动作的具体行为
配置动作的具体操作行为(发送信息或执行远程命令),当触发条件,无限次数发送邮件,60秒1次,发送给Admin用户;点击<新的>,在操作细节里填写步骤(发送信息多少次)、持续时间、操作类型、发送邮件到用户Admin、报警媒介类型,最后完成<添加>;
-
- 步骤:1 - 0 //1 - 1表示只发一封,0表示无穷大
-
- 操作类型:发送消息
-
- 步骤持续时间:60 //单位秒
-
- 发送到用户:Admin //发送信息的用户
-
- 仅送到:Email //报警媒介类型
最终效果:
4)测试效果
在被监控主机创建账户(让账户数量大于21),然后登录监控端Web页面,在仪表盘中查看问题报警(需要等待一段时间)
bash
[root@web1 ~]# useradd aa
[root@web1 ~]# cat /etc/passwd | wc -l
22
在监控服务器上使用mail命令查收报警邮件
bash
[root@zabbixserver ~]# yum -y install mailx //安装mail收邮件服务
[root@zabbixserver ~]# mail //查看报警邮件
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/root": 3 messages 3 new
>N 1 root@localhost.local Fri May 7 16:52 20/836 "Problem: passwd_line_g"
N 2 root@localhost.local Fri May 7 16:53 20/836 "Problem: passwd_line_g"
N 3 root@localhost.local Fri May 7 16:54 20/836 "Problem: passwd_line_g"
&
补充:如果没有mail命令,则需要安装mailx软件包
二、自动发现(Discovery)
当Zabbix需要监控的设备越来越多,手动添加监控设备麻烦,此时可考虑使用自动发现功能,自动添加被监控主机,实现自动批量添加一组监控主机。
自动发现实现功能:
- ① 自动发现主机、添加主机、自动添加主机到组;
- ② 自动链接模板到主机,自动创建监控项目与图形等。
自动发现流程:
- 1)创建自动发现规则;
- 2)创建Action动作,发现主机后自动执行的动作;
- 3)通过动作,执行添加主机,链接模板到主机等操作;
案例:Zabbix自动发现
案例要求:沿用案例,配置Zabbix的自动发现机制,实现以下目标:
- 1)创建自动发现的规则(发现192.168.4.1-254网段的主机)
- 2)创建自动发现的动作(添加主机、为主机链接模板)
步骤1:自动发现规则
1)创建自动发现规则
通过【Configuration配置】--->【Discovery自动发现】--->【Create discovery rule创建发现规则】,创建发现规则;
2)配置自动发现规则
填写自动发现的规则名称(可任意)、IP范围(使用逗号隔开,可写多个IP)、更新间隔为多久做一次自动发现(默认为1小时)、点击,配置检查的方式:Ping、HTTP、FTP、Agent的自定义key等检查;
- 规则名称:web_discovery_rule
- IP范围:192.168.2.150-254
- 更新间隔:1m //1分钟扫描IP范围(生产环境不建议设置间隔太短,浪费计算机资源)
- 检查:SSH(发现条件是ssh,端口22能连接上 1分钟做一次扫描)
步骤2:创建动作
1)创建Action动作
通过【Configuration配置】--->【Actions动作】--->【Actions Event source事件源:自动发现Discovery】--->【Create action创建动作】
注意:事件源选择自动发现
2)配置Action动作具体行为
配置动作,填写动作名称,添加触发动作的条件;
-
- 动作名称:add_web
-
- 新的触发条件:主机IP地址 = 192.168.2.150-254
触发条件后要执行的操作指令,点击【操作】,在操作细节中选择操作类型:添加主机到组,主机群组:Linux servers与模板链接(HTTP模板),完成后进行
步骤3:验证结果
登陆Zabbix服务器的Web页面,等待1分钟,查看主机列表,确认新添加的主机是否被自动加入监控主机列表;
补充:当Zabbix服务器配置了域名解析,则自动发现的主机以域名的形式显示在主机列表
三、主被动监控模式
主动和被动都是对被监控端主机而言(默认zabbix采用的是被动监控)
- ① 被动监控:Server向Agent发起连接,索取监控数据;
- ② 主动监控:Agent向Server发起连接,Agent周期性地收集数据发送给Server;
区别:Server不用每次需要数据都连接Agent,Agent会自己收集数据并处理数据,Server仅需要保存数据即可;
补充:由于监控数据为实时监控,相对的被动监控数据流量大("请求、回复")、主动监控数据流量小("回复"),当监控主机达到一定量级后,Zabbix服务器的资源占用也会逐步增大,导致效率变慢,所以可考虑主动监控来释放服务器的压力;(Zabbix也可支持分布式监控)
案例:Zabbix主动监控
案例要求:沿用前面案例,配置Zabbix主动监控,实现以下目标:
- 1)修改被监控主机agent为主动监控模式
- 2)克隆模板,修改模板为主动监控模板
- 3)添加监控主机,并链接主动监控模板
步骤1:部署被监控主机Zabbix Agent(web2)
1)设置防火墙与SELinux限制
bash
[root@web1 ~]# firewall-cmd --set-default-zone=trusted
[root@web1 ~]# setenforce 0
[root@web1 ~]# sed -i '/SELINUX/s/enforcing/permissive/' /etc/selinux/config
2)源码安装部署Zabbix agent
bash
[root@web1 ~]# useradd -s /sbin/nologin zabbix //创建zabbix用户
[root@web1 ~]# id zabbix
uid=1000(zabbix) gid=1000(zabbix) 组=1000(zabbix)
[root@web2 ~]# yum -y install gcc make pcre-devel autoconf //安装依赖包
[root@web2 ~]# tar -xf zabbix-3.4.4.tar.gz
[root@web2 ~]# cd zabbix-3.4.4/
[root@web2 zabbix-3.4.4]# ./configure --enable-agent //配置,加载agent模块
[root@web2 zabbix-3.4.4]# make && make install //编译安装
[root@web2 zabbix-3.4.4]# ls /usr/local/sbin/
3)修改Zabbix_agent配置文件,启动Zabbix_agent服务
将agent监控模式修改为:主动模式(注释被动监控模式、关闭10050端口)
补充:主动监控模式要求关闭10050端口(开启端口是为了提供Server连接并获取监控信息,属于被被动监控模式);且发送监控数据必须指定server监控服务器IP,不能有127.0.0.1
bash
[root@web2 ~]# vim /usr/local/etc/zabbix_agentd.conf
93 # Server=127.0.0.1 //注释(不注释,默认使用被动监控模式)
118 StartAgents=0 //禁止被动监控,不启动Zabbix_agent服务和10050端口
134 ServerActive=192.168.2.5 //监控服务器IP,注意:一定要取消127.0.0.1
145 Hostname=web2 //被监控服务器主机名
183 RefreshActiveChecks=120 //默认120秒检测一次
280 UnsafeUserParameters=1 //允许自定义监控传参
264 Include=/usr/local/etc/zabbix_agentd.conf.d/ //存放自定义key的目录
解释说明:
Server=监控服务器IP地址 //被动监控模式,允许哪些主机监控本机及获取监控信息
StartAgents=0 //被动监控时启动几个Agent进程监听10050端口;设置为0则禁止被动监控,不启动服务和端口;
ServerActive=监控服务器IP地址 //主动监控模式,允许哪些主机监控本机及获取监控信息
Hostname=被监控服务器主机名 //告诉监控服务器是谁发的数据信息(一定要与Zabbix服务器配置的监控主机名称一致)
RefreshActiveChecks=120 //监控数据默认120秒检测一次
UnsafeUserParameters=1 //允许自定义监控传参
Include=/usr/local/etc/zabbix_agentd.conf.d/ //存放自定义key的目录
编写zabbix_agentd的service文件,通过systemd管理服务
bash
[root@web2 ~]# vim /usr/lib/systemd/system/zabbix_agentd.service
[Unit]
Description=zabbix agent
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/tmp/zabbix_agentd.pid
ExecStart=/usr/local/sbin/zabbix_agentd
ExecStop=/bin/kill $MAINPID
[Install]
WantedBy=multi-user.target
[root@web2 ~]# systemctl enable zabbix_agentd.service --now //重启服务
[root@web2 ~]# ss -nlptu | grep zabbix_agentd //查看不到任何端口信息(已关闭10050端口)
**常见报错:**启动服务失败,没有zabbix用户
步骤2:创建主动监控的监控模板
1)克隆Zabbix的监控模板(全克隆)
Zabbxi自带模板都是被动模式,通过克隆系统自带模板(在此基础上修改为主动模式)
通过【Configuration配置】--->【Templates模板】--->选择<Template OS Linux>模板,点击<全克隆>,克隆该模板并进行配置修改;
新模板名称:Template OS Linux Server Active
2)修改克隆模板的监控模式
克隆的模板的所有监控项目默认是被动监控模式,需全部修改为主动监控模式
通过【Configuration配置】--->【Templates模板】--->选择新克隆的模板,点击【items监控项】--->勾选所有监控项目,点击<批量更新>,将类型修改为:Zabbix Agent(主动模式)
类型:Zabbix Agent(主动模式)
3)禁用部分监控项目
批量修改监控项的监控模式后,并非所有监控项都支持主动模式;需要将不支持主动模式的监控项目状态关闭(点击类型可排序)
步骤3:添加监控主机(web2)
1)手动添加监控主机(主动模式监控)
在Zabbix监控服务器,添加被监控的主机,设置主机名称为web2 (必须与被监控端的zabbix_agentd.conf配置文件中的Hostname一致),将主机添加到Linux servers组,IP地址修改为0.0.0.0,端口设置为0;
- 主机名称:web2 //必须与被监控端的zabbix_agentd.conf配置文件中的Hostname一致
- 主机组:Linux servers
- IP地址:0.0.0.0 //因Agent采用主动监控模式,主动上传监控数据给Server,所以Server不需要指定被监控服务器的IP和端口
- 端口:0
步骤4:为主机添加监控模板
选择克隆的模板(主动监控模式),添加链接的模板到web2主机
验证:
通过【Monitoring监控中】--->【Latest最新数据】菜单,选择需要查看的主机组、主机以及图形,查看监控效果(需要等待120秒主动监控数据监测)
四、拓扑图与聚合图形
熟悉zabbix拓扑图与聚合图形,实现以下目标:
- 1)创建修改拓扑图
- 2)创建聚合图形
步骤1:创建拓扑图
1)创建拓扑
绘制拓扑图可以快速了解服务器架构,通过【Monitoring监控中】--->【Maps拓扑图】,默认有【Local network拓扑图】,点击<创建拓扑图>,新建拓扑图
可设置拓扑图的名称、拓扑图的宽高(显示页大小)
2)编辑拓扑图
选择创建的拓扑图,点击,进入编辑界面;
拓扑图图表说明:
Icon(图标),添加设备图标(可以点击图标修改属性)
Shape(形状),方形、椭圆、线
Link(连线),使用Ctrl选择两个图标,进行连线
完成后,点击Update(更新)
创建完拓扑图,效果如图所示:
步骤2:创建聚合图形
1)创建聚合图形
聚合图形可以在一个页面显示多个数据图表,方便了解多组数据。
通过【Monitoring监控中】-->【Screens聚合图形】-->【Create screen创建聚合图形】,创建聚合图形;
创建聚合图形参数如下:
-
- Owner所有者:使用默认的Admin用户
-
- Name名称:JUHE
-
- Columns列:列数设置为2列
-
- Rows行:行数设置为2行
2)编辑聚合图形
选择创建的聚合图形,点击【编辑聚合图形】-->点击<更改>,添加监控图形;
添加的监控图形信息内容:图形(监控项)、宽高比例
完成聚合图形,效果如图所示:
五、自定义监控案例
案例要求:沿用前面的练习,使用自定义key监控常用监控项目,实现以下目标:
- 1)监控Nginx状态(实时并发量、总连接数、等待连接数)
- 2)监控TCP连接状态
案例1:监控Nginx服务状态
1)源码安装nginx
bash
[root@web1 ~]# yum -y install gcc make pcre-devel openssl-devel
[root@web1 ~]# tar -xf nginx-1.12.2.tar.gz
[root@web1 ~]# cd nginx-1.12.2/
[root@web1 nginx-1.12.2]# ./configure --with-http_stub_status_module
[root@web1 nginx-1.12.2]# make && make install
2)修改配置文件(开启status模块)
bash
[root@web1 ~]# vim /usr/local/nginx/conf/nginx.conf
...
location /status {
stub_status on;
}
...
[root@web1 ~]# /usr/local/nginx/sbin/nginx //启动服务
测试:
bash
[root@web1 ~]# curl http://192.168.2.100/status
Active connections: 2
server accepts handled requests
2 2 3
Reading: 0 Writing: 1 Waiting: 1
3)编写监控脚本(实时并发量、总连接数、等待连接数)
bash
[root@web1 ~]# vim /usr/local/bin/nginx_status.sh
#!/bin/bash
case $1 in
active)
curl -s http://192.168.2.100/status | awk '/Active/{print $NF}';; //实时并发量
accepts)
curl -s http://192.168.2.100/status | awk 'NR==3{print $2}';; //总连接数
waiting)
curl -s http://192.168.2.100/status | awk '/Waiting/{print $NF}';; //等待连接数
esac
[root@web1 ~]# chmod +x /usr/local/bin/nginx_status.sh //赋予执行权限
4)创建自定义key
- 格式:UserParameter=key,command
- 格式:UserParameter=key[*],command $1
[*]和$1为固定格式,将key的[所有参数],传递给后面命令作为位置变量
注意:配置文件需允许自定义监控传参:Include=/usr/local/etc/zabbix_agentd.conf.d/
bash
[root@web1 ~]# cd /usr/local/etc/zabbix_agentd.conf.d/
[root@web1 zabbix_agentd.conf.d]# vim nginx.status
UserParameter=nginx.status[*],/usr/local/bin/nginx_status.sh $1
[root@web1 ~]# systemctl restart zabbix_agentd.service //重启服务
验证:
bash
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'nginx.status[active]'
1
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'nginx.status[accepts]'
4
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'nginx.status[waiting]'
0
[root@web1 ~]# curl http://192.168.2.100/status
Active connections: 1
server accepts handled requests
2 4 3
Reading: 0 Writing: 1 Waiting: 0
[-s]指定被监控的服务器,[-k]调用自定义key(调用该案例key时,需添加参数)
**常见报错:**未有赋予监控脚本执行权限
bash
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'net.status[waiting]'
sh: /usr/local/bin/net_status.sh: Permission denied
5)创建监控项目item,监控自定义key(nginx.status)
通过【Configuration配置】--->【Hosts主机】,选择web1(使用被动监控模式),点击主机后面的【items监控项】,点击;
- 监控项名称:nginx_status_item
- 类型:Zabbix_客户端(被动监控模式)
- 键值:nginx.status[accpets]
- 信息类型:数字(无正负)
6)查看监控数据
查看监控数据,通过首页栏【Monitoring监控中】--->【Latest data最新数据】,在过滤器中填写过滤条件,根据监控【主机群组】和监控【主机】选择需要查看哪些监控数据;例如:nginx_status_item自定义key的监控项;
找到需要监控的数据后,可以点击后面的【Graph图形】查看监控图形;
案例2:监控TCP连接状态
参考:https://www.cnblogs.com/jessezeng/p/5617105.html
- TCP三次握手
- TCP连接的四次断开
ESTABLISHED:表示两台机器正在传输数据
CLOSE-WAIT:客户端发来的连接中断请求,服务端TCP接到FIN后,就发出ACK回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT;
TIME-WAIT:客户端接收到FIN后,TCP就发送ACK包,并进入TIME-WAIT状态,等待足够的时间以确保远程TCP接收到连接中断请求的确认。
1)通过ss命令查看网络连接状态
模拟多人并发连接(如果没有ab命令,则安装httpd-tools软件包)
bash
[root@web1 ~]# ab -c 100 -n 1000 http://192.168.2.100/
[root@web1 ~]# ss -antp
ESTAB 0 0 192.168.2.100:22 192.168.2.254:49946 users:(("sshd",pid=7969,fd=3))
TIME-WAIT 0 0 192.168.2.100:10050 192.168.2.5:53516
解释说明:
#-a显示所有
#-t显示TCP连接状态
#-u显示UDP连接状态
#-n以数字形式显示端口号和IP地址
#-p显示连接对应的进程名称
2)编写监控脚本
bash
[root@web1 ~]# vim /usr/local/bin/net_status.sh
#!/bin/bash
case $1 in
estab)
ss -antp | awk 'BEGIN{x=0} /^ESTAB/{x++} END{print x}';;
close_wait)
ss -antp | awk 'BEGIN{x=0} /^CLOSE-WAIT/{x++} END{print x}';;
time_wait)
ss -antp | awk 'BEGIN{x=0} /^TIME-WAIT/{x++} END{print x}';;
esac
[root@web1 ~]# chmod +x /usr/local/bin/net_status.sh //赋予执行权限
3)创建自定义key
- 注意:被监控端修改配置文件,需要允许自定义key并设置Include参数
bash
[root@web1 ~]# vim /usr/local/etc/zabbix_agentd.conf.d/net.status
UserParameter=net.status[*],/usr/local/bin/net_status.sh $1
[root@web1 ~]# systemctl restart zabbix_agentd.service //重启服务
测试:
bash
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'net.status[time_wait]'
40
**常见报错:**未有赋予监控脚本执行权限
bash
[root@web1 ~]# zabbix_get -s 127.0.0.1 -k 'net.status[time_wait]'
sh: /usr/local/bin/net_status.sh: Permission denied
4)创建监控项目item,监控自定义key(net_status)
通过【Configuration配置】--->【Hosts主机】,选择web1(使用被动监控模式),点击主机后面的【items监控项】,点击<Create item创建监控项>;
- 监控项名称:net_status
- 类型:Zabbix_客户端(被动监控模式)
- 键值:net.status[time_wait]
- 信息类型:数字(无正负)
5)查看监控数据
查看监控数据,通过首页栏【Monitoring监控中】--->【Latest data最新数据】,在过滤器中填写过滤条件,根据监控【主机群组】和监控【主机】选择需要查看哪些监控数据;例如:net_status_自定义key的监控项;
找到需要监控的数据后,可以点击后面的【Graph图形】查看监控图形;
思维导图:
小结:
本篇章节为 的学习**【第二阶段】SECURITY-DAY2** 笔记,这篇笔记可以初步了解到 Zabbix报警机制,Zabbix进阶操作、监控案例。除此之外推荐参考相关学习网址:
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解