0x01 前言

先来假设一种情况:你管理着一个或多个私有云,其中的服务器需要用zabbix进行监控,可是云中的服务器都无法直接连接公网,那怎样才能将数据汇总到一个zabbix server中呢?

这就需要用到zabbix的代理服务器–>zabbix proxy。

0x02 架构

先放一张图片:

从图中可以看到,只需要在私有云中配置一台zabbix proxy服务器,即可代替zabbix server从该云中监控服务器,zabbix proxy再主动往zabbix server发送是收集到的数据。proxy和server的中间还可以增加一层防火墙增强安全性,两者的链路还可以使用TLS进行加密。

在此文章中不涉及TLS的内容,TLS的相关内容将在下一篇文章中进行说明。

如果有多个私有云,只需要增加proxy即可。甚至有多个位于不同地域的数据中心也可以采用这种方式汇总数据。

虽然zabbix proxy是代替zabbix server从客户机中获取数据的服务器,但proxy并没有GUI界面,所以zabbix proxy有两种代理模式:

  1. Active:主动模式,代理服务器会主动与server联系并索取配置文件以用于轮询客户机
  2. Passive:被动模式,代理服务器等待server的主动联系并下发配置文件

0x03 准备

0x03.1 zabbix server

首先需要准备zabbix server,编译安装过程请参考以下文章:

变以前请安装以下软件:

[root@web-t1 ~]# yum install mysql-devel libssh2-devel OpenIPMI-devel

为了方便,可以使用以下编译参数:

[root@web-t1 zabbix-3.2.5]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-ssh2 --with-openipmi --with-openssl --with-libcurl

如果一切正常,那么你将会看到以下界面:

如果是使用被动模式,推荐修改以下参数:

#启动拉取proxy数据的线程数
StartProxyPollers=10

#往proxy推送配置文件的间隔时间
ProxyConfigFrequency=60

#往proxy拉取数据的间隔时间
ProxyDataFrequency=1

0x03.2 zabbix proxy

注意!请为proxy和zabbix独立配置数据库,切勿共用同一个数据库!

因为zabbix proxy和zabbix server的数据库是相冲突的,为了安全起见,请不要共用数据库。不过既然用上了proxy,那么两者应该不在同一个服务器上,数据库一般也不会在一起。

依旧使用上面的编译参数进行编译:

[root@zabbix-proxy-t1 zabbix-3.2.5]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-ssh2 --with-openipmi --with-openssl --with-libcurl

然后将启动器复制到指定位置:

[root@zabbix-proxy-t1 zabbix-3.2.5]# ln /usr/local/zabbix/sbin/zabbix_proxy /usr/local/sbin/

先修改zabbix proxy的配置文件:

#打开文件
[root@zabbix-proxy-t1 zabbix-3.2.5]# vim /usr/local/zabbix/etc/zabbix_proxy.conf

#将该字段修改为zabbix server的IP或域名
Server=web-t1.t.com

#指定zabbix proxy的hostname,与其他proxy的hostname不可重复
Hostname=Zabbix proxy t1

#指定日志路径
LogFile=/tmp/zabbix_proxy.log

#指定数据库IP地址或域名
DBHost=zabbix-proxy-t1.t.com

#指定数据库名
DBName=zabbix

#指定数据库用户名
DBUser=zabbix

#指定数据库密码
DBPassword=zabbix

完成后使用以下命令启动:

[root@zabbix-proxy-t1 zabbix-3.2.5]# zabbix_proxy

将启动命令添加到开机启动文件中:

#打开文件
[root@zabbix-proxy-t1 zabbix-3.2.5]# vim /etc/rc.local 

#在文件末尾填入以下内容后保存退出
zabbix_proxy

#赋予可执行权限
[root@zabbix-proxy-t1 zabbix-3.2.5]# chmod +x /etc/rc.d/rc.local

至此,zabbix proxy的配置已完成,下面来检查相关服务有没有成功启动。先查看相关进程:

[root@zabbix-proxy-t1 zabbix-3.2.5]# ps -aux | grep zabbix
zabbix   12873  0.0  0.3 141160  3528 ?        S    01:03   0:00 zabbix_proxy
zabbix   12877  0.0  0.4 141288  4124 ?        S    01:03   0:01 zabbix_proxy: configuration syncer [synced config 9238 bytes in 0.016047 sec, idle 3600 sec]
zabbix   12878  0.0  0.3 141160  3268 ?        S    01:03   0:02 zabbix_proxy: heartbeat sender [sending heartbeat message success in 0.001863 sec, idle 60 sec]
zabbix   12879  0.0  0.3 141236  3696 ?        S    01:03   0:39 zabbix_proxy: data sender [sent 1 values in 0.003502 sec, idle 1 sec]
zabbix   12880  0.0  0.5 248140  5140 ?        S    01:03   0:05 zabbix_proxy: poller #1 [got 0 values in 0.000003 sec, idle 5 sec]
zabbix   12881  0.0  0.5 248140  5140 ?        S    01:03   0:05 zabbix_proxy: poller #2 [got 0 values in 0.000005 sec, idle 5 sec]
zabbix   12882  0.0  0.5 248140  5120 ?        S    01:03   0:05 zabbix_proxy: poller #3 [got 0 values in 0.000003 sec, idle 5 sec]
zabbix   12883  0.0  0.5 248188  5184 ?        S    01:03   0:05 zabbix_proxy: poller #4 [got 1 values in 0.002559 sec, idle 5 sec]
zabbix   12884  0.0  0.5 248140  5120 ?        S    01:03   0:05 zabbix_proxy: poller #5 [got 0 values in 0.000017 sec, idle 5 sec]
zabbix   12885  0.0  0.5 248188  5176 ?        S    01:03   0:01 zabbix_proxy: unreachable poller #1 [got 0 values in 0.000004 sec, idle 5 sec]
zabbix   12886  0.0  0.3 141236  3116 ?        S    01:03   0:00 zabbix_proxy: trapper #1 [processed data in 0.000000 sec, waiting for connection]
zabbix   12887  0.0  0.3 141236  3116 ?        S    01:03   0:00 zabbix_proxy: trapper #2 [processed data in 0.000000 sec, waiting for connection]
zabbix   12888  0.0  0.3 141236  3116 ?        S    01:03   0:00 zabbix_proxy: trapper #3 [processed data in 0.000000 sec, waiting for connection]
zabbix   12889  0.0  0.3 141236  3116 ?        S    01:03   0:00 zabbix_proxy: trapper #4 [processed data in 0.000000 sec, waiting for connection]
zabbix   12890  0.0  0.3 141236  3116 ?        S    01:03   0:00 zabbix_proxy: trapper #5 [processed data in 0.000000 sec, waiting for connection]
zabbix   12891  0.0  0.1 143668  1872 ?        S    01:03   0:01 zabbix_proxy: icmp pinger #1 [got 0 values in 0.000003 sec, idle 5 sec]
zabbix   12892  0.0  0.2 141152  2516 ?        S    01:03   0:01 zabbix_proxy: housekeeper [deleted 1885 records in 0.031896 sec, idle for 1 hour(s)]
zabbix   12893  0.0  0.2 141152  2428 ?        S    01:03   0:04 zabbix_proxy: http poller #1 [got 0 values in 0.000508 sec, idle 5 sec]
zabbix   12894  0.0  0.4 245604  4512 ?        S    01:03   0:02 zabbix_proxy: discoverer #1 [processed 0 rules in 0.000590 sec, idle 60 sec]
zabbix   12895  0.0  0.2 141152  2704 ?        S    01:03   0:04 zabbix_proxy: history syncer #1 [synced 1 items in 0.000755 sec, idle 1 sec]
zabbix   12896  0.0  0.2 141152  2704 ?        S    01:03   0:04 zabbix_proxy: history syncer #2 [synced 0 items in 0.000001 sec, idle 1 sec]
zabbix   12897  0.0  0.2 141152  2704 ?        S    01:03   0:04 zabbix_proxy: history syncer #3 [synced 0 items in 0.000001 sec, idle 1 sec]
zabbix   12898  0.0  0.2 141152  2704 ?        S    01:03   0:04 zabbix_proxy: history syncer #4 [synced 0 items in 0.000001 sec, idle 1 sec]
zabbix   12899  0.0  0.1 141160  1868 ?        S    01:03   0:04 zabbix_proxy: self-monitoring [processed data in 0.000003 sec, idle 1 sec]
root     16155  0.0  0.0 112648   964 pts/0    R+   22:44   0:00 grep --color=auto zabbix

检查端口:

[root@zabbix-proxy-t1 zabbix-3.2.5]# netstat -anp | grep zabbix
tcp        0      0 0.0.0.0:10051           0.0.0.0:*               LISTEN      12873/zabbix_proxy  
tcp        0      0 10.1.1.123:40878        10.1.1.123:3306         ESTABLISHED 12877/zabbix_proxy: 
tcp        0      0 10.1.1.123:40858        10.1.1.123:3306         ESTABLISHED 12897/zabbix_proxy: 
tcp        0      0 10.1.1.123:40862        10.1.1.123:3306         ESTABLISHED 12895/zabbix_proxy: 
tcp        0      0 10.1.1.123:45516        10.1.1.123:3306         ESTABLISHED 12883/zabbix_proxy: 
tcp        0      0 10.1.1.123:40866        10.1.1.123:3306         ESTABLISHED 12893/zabbix_proxy: 
tcp        0      0 10.1.1.123:45526        10.1.1.123:3306         ESTABLISHED 12885/zabbix_proxy: 
tcp        0      0 10.1.1.123:40876        10.1.1.123:3306         ESTABLISHED 12879/zabbix_proxy: 
tcp        0      0 10.1.1.123:40860        10.1.1.123:3306         ESTABLISHED 12896/zabbix_proxy: 
tcp        0      0 10.1.1.123:40864        10.1.1.123:3306         ESTABLISHED 12898/zabbix_proxy: 
tcp        0      0 10.1.1.123:40898        10.1.1.123:3306         ESTABLISHED 12894/zabbix_proxy:

这里还有一些proxy的配置信息可供配置:

#往server发送心跳包的间隔时间
HeartbeatFrequency=10

#主动模式下,向server索取配置文件的间隔时间
ConfigFrequency=300

#往服务器发送数据的间隔时间
DataSenderFrequency=1

如果你的zabbix系统处于新配置的阶段,需要经常修改调试,请将上方的参数按需要调小点。例如ConfigFrequency这一项的默认值为3600,也就是说每隔一个小时,proxy才向server索取一次配置文件,这很明显很浪费时间。

0x03.3 zabbix agent

如果使用agent的方式从客户机中获取数据,那么agent的配置文件要做一些调整。

首先需要安装agent,你可以在以下页面中下载rpm或exe安装包:

或者依旧使用上方的编译参数进行编译:

[root@zabbix-client-t1 zabbix-3.2.5]# ./configure --prefix=/usr/local/zabbix --enable-server --enable-agent --enable-proxy --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --with-ssh2 --with-openipmi --with-openssl --with-libcurl

然后将agent的启动文件链接到指定位置:

[root@zabbix-client-t1 zabbix-3.2.5]# ln /usr/local/zabbix/sbin/zabbix_agentd /usr/local/sbin/

再修改配置文件:

#定义日志路径
LogFile=/tmp/zabbix_agentd.log

#指定服务器地址,在代理模式下,请填入proxy服务器的IP或域名
Server=zabbix-proxy-t1.t.com

#如果需要使用ServerActive,请分别填写server和proxy服务器的IP或域名
ServerActive=web-t1.t.com,zabbix-proxy-t1.t.com

#定义客户机的hostname,必须独一无二
Hostname=zabbix-client-t1

最后启动zabbix agent:

[root@zabbix-client-t1 zabbix-3.2.5]# zabbix_agentd

添加到开机启动文件中:

#打开文件
[root@zabbix-client-t1 zabbix-3.2.5]# vim /etc/rc.local 

#在文件最后添加以下内容,然后保存退出
zabbix_agentd

#赋予开机启动文件可执行权限
[root@zabbix-client-t1 zabbix-3.2.5]# chmod +x /etc/rc.d/rc.local

最后检查启动情况:

[root@zabbix-client-t1 zabbix-3.2.5]# ps -aux | grep zabbix
zabbix   12799  0.0  0.1  79992  1380 ?        S    00:47   0:00 zabbix_agentd
zabbix   12800  0.0  0.1  79992  1412 ?        S    00:47   0:12 zabbix_agentd: collector [idle 1 sec]
zabbix   12801  0.0  0.2  82188  2808 ?        S    00:47   0:09 zabbix_agentd: listener #1 [waiting for connection]
zabbix   12802  0.0  0.2  82188  2808 ?        S    00:47   0:09 zabbix_agentd: listener #2 [waiting for connection]
zabbix   12803  0.0  0.2  82188  2808 ?        S    00:47   0:09 zabbix_agentd: listener #3 [waiting for connection]
root     29837  0.0  0.0 112648   964 pts/0    R+   23:07   0:00 grep --color=auto zabbix

检查端口监听情况:

[root@zabbix-client-t1 zabbix-3.2.5]# netstat -anp | grep zabbix
tcp        0      0 0.0.0.0:10050           0.0.0.0:*               LISTEN      12799/zabbix_agentd

0x04 配置

完成zabbix server、zabbix proxy和zabbix agent的配置安装后,还需要到zabbix server中添加zabbix proxy和agent的相关信息。

0x04.1 zabbix proxy

进入Administration –> Proxies添加proxy节点:

如果使用主动模式,那么只需要在Proxy name一栏中填入proxy的hostname即可:

如果采用被动模式,则还需要填入proxy的IP地址或域名:

如果是使用主动模式,那么在超过proxy中HeartbeatFrequency所设定的时间后,proxy将会往服务器发送心跳包,显示如下:

如果使用被动模式,那么显示如下:

0x04.2 host

和往常一样配置host即可,不过在Monitored by proxy一栏中需要选择对应的proxy:

0x05 查看

如果一切顺利,那么稍等片刻即可从监控界面中看到被监控host的数据。因为proxy同步配置信息和server接收数据需要一段时间,请耐心等待:

0x06 结语

如果有多个数据中心、多个私有云网段或者网络环境是内外网相隔离的情况,zabbix proxy是非常有用的。

但使用proxy请注意安全,推荐使用TLS进行加密,以防止数据被窃听或篡改甚至是入侵,同时需要在server和proxy之间配置防火墙和IDS,以增强安全性。