Zabbix
Doc
公式 * 公式サイト:Get Zabbix
- Zabbixについて
- 【連載Zabbix】ゼロから始めるZabbix基礎【Zabbix Advent Calendar 2016】
- 大学生が自宅環境を作ってみた
- zabbixとGrafanaを連携させる
-
Zabbixの監視サーバ導入
- MVD:Growi:監視ツールZabbix
Zabbixサーバー
公式サイトのGet Zabbixからインストーラーをセッティングする
* Zabbix version
* 7.0 LTS (長期間安定的にサポート)を選択
* OS DISTRIBUTION
* Debian
* OS VERSION
* 12 (Bookworm)
* ZABBIX COMPONENT
* Server, Frontend, Agent
* DATABASE
* PostgreSQL
* WEB SERVER
* Nginx
Zabbixエージェント
監視ツールZabbix
導入
ダウンロード
開発元からダウンロード。今回の導入ではAppliance版 Platformは「Microsoft Hyper-V 2012」を使用した。 https://www.zabbix.com/download_appliance
解凍するとHyperV用の仮想ディスク(.vxd)が入っているので、これを使う。
インストール
HyperVの新規仮想OSとして導入。 新規仮想マシンの設定時にダウンロードした仮想ディスクを指定することで、Zabbix入りの仮想マシン(OSはCentOS8)が導入できる。
ログインID:root パスワード:zabbix
マシン名:zabbix IPアドレス割り当て:192.168.1.150
初期セットアップ
新規セットアップ時に必要(運用サーバーではすでに実施済)。
- 日本語対応パック追加
dnf install zabbix-web-japanese
- OSの日本語、日本時間対応
dnf install langpacks-ja
localectl set-locale LANG=ja_JP.utf8
localectl set-keymap jp106
cp /usr/share/zoneinfo/Asis/Tokyo /etc/localtime
source /etc/locale.conf
- ホスト名をzabbixに変更
hostnamectl set-hostname zabbix
- ipアドレスを固定(下記ファイル内を編集)
vi /etc/sysconfig/network-scripts/ifcfg-eth0
systemctl restart network
- ifcfg-eth0の中身(192.168.1.150として固定)
IPADDR=192.168.1.150
PREFIX=24
GATEWAY=192.168.1.1
DNS1=192.168.1.160
DNS2=192.168.3.160
DOMAIN=maviss.local
- snmpツールのインストール(任意) 使用例:snmpwalk -v 1 -c public 192.168.3.1
dnf install net-snmp-utils
- expectのインストール ルータに自動ログインしデータ収集するために使用する
dnf install expect
使い方
ログイン
http://zabbix.maviss.local/ からアクセス。 SNE室メンバーは追加済ですので、ドメインID,PWでログインできます。
ダッシュボード
デフォルトの「Grobal view」には、現RTX3500のLAN3(外部接続)トラフィックとCPU稼働率、VPNトンネル接続数を表示しています。画面上部右のメニューから表示したい期間を切り替えることができます。
「適用」を押すと設定が保存され、次回ログイン時も有効になります。
その他、以下のダッシュボードを用意しています。左上の「すべてのダッシュボード」を選び、切り替えてください。 順次追加していきます。 * WiFiルータ接続機器数 * VPN接続数
機器ごとの個別確認
Zabbixでは「ホスト」という呼び方になっています。
「監視データ」⇒「ホスト」をクリックし、並んでいる機器の行にある「グラフ」を押下すると、グラフ表示でデータ閲覧ができます。ダッシュボードと同様、期間を切り替えて確認することができます。
「最新データ」を押すと、その時点での生の値を見ることができます。グラフには出てきていないものもあります。
YAMAHAルータの例
「監視データ」⇒「ホスト」をクリックし、3拠点いずれかのRTX3500の行にある「グラフ」をクリックする。
例えば直近1か月のデータであれば、右上の「最新の30日間」をクリックし、期間を切り替えることで表示できます。
データトラフィックであれば、LAN3がWAN側のI/Fとなるので、このグラフを確認し、平均値や最大値などのデータを取得できます。
マップ
試行として、3拠点のルータとZabbixサーバーの関係、札幌のネットワーク構成図を図示しています。
「監視データ」⇒「マップ」からアクセスしてください。
ホスト登録と連携させると稼働状況も確認できています。
マップの編集
右上の「マップの更新」を押すことで編集画面になります。
-
機器の配置 「アイコン:追加」を押すとサーバーPCのようなものが(とりあえず)出現します。これをクリックし、希望の物に変更してください。 タイプはホスト登録しているものであれば「ホスト」、そうでない機器は「イメージ」としておきます。ラベルはアイコン下部に表示される文字になります。「ホスト」を選んだ場合は登録済のホストと紐づけてください。
-
機器間の接続(リンク) CTRLキーを押しながら、接続したい機器2つをそれぞれ左クリックすると2つ選択状態になります。この状態で画面上部にある、「リンク: 追加」を押すと接続されます。
編集終了後は、忘れずに「更新」を押し、サーバーに反映してください。
保守・運用
被監視マシン側の準備
YAMAHAルーター
SNMPを有効にすることで、いろいろな情報を得ることができます。 RTX3500の場合は、以下のページに記載してあります。
Windows Server
SNMPサービスを有効化することで、SNMPによる監視を行うことができます。
Windows PC
SNMPサービスは入っていないので、ZabbixエージェントのソフトをインストールすることでZabbix側から様々な情報を得ることができるようになります。 pingによる死活確認でよければ、何もする必要はありません。※pingに反応するための設定は必要
ホストの追加
監視対象を追加したい場合です。
ホスト情報の設定
「設定」⇒「ホスト」を選び、右上の「ホストの作成」を選択します。
- ※印の項目は設定必須です。ホスト名は英数字のみです。
- グループは何らかのグループに属していないといけないです。選択から選んでください。適切なものが無い場合は、「ホストグループ」から新規グループを作っておきます。
- インターフェースの設定も必須です。実績があるのはエージェントまたはSNMPです。
- 「エージェント」の場合は監視対象にもZabbixエージェントをインストールしておくと、詳細情報を得ることができます。無くてもping程度は可能です。
- 「SNMP」の場合は、監視対象側でSNMP機能を有効にしたうえで、192.168.1.150(本Zabbixサーバー)からのアクセスを許可しておく必要があります。
- 監視対象をIPアドレスで指定する場合は、IPアドレスの欄に記述し、接続方法を「IP」を選択。マシン名がDNSにある場合は、「DNS名」の欄にマシン名を記述し、接続方法で「DNS」を選んでください。
テンプレートとのリンク
監視対象と通信を行うには、取得する情報が記載されたテンプレートとのリンクが必須です。 「テンプレート」タブを開き、新規テンプレートをリンクすることで何を監視するかが決まります。 元々用意されていたもので大体は賄えますが、必要に応じて自前のテンプレートを作り独自の監視項目を作ることも可能です。
現状運用しているホストと、リンクしているテンプレートは以下です。 | ホスト種別 | テンプレート | 備考 | | --------------------- | --------------------------- | ---------------------------------------------------------------------------------------- | | RTX3500 | Template RTX3500 | コチラより入手したものをアレンジ | | RTX3500 | 有効VPNトンネル数取得 | SNMPからデータ抽出し、独自に作成 | | WiFiルータ | Network Generic Device SNMP | 標準テンプレートを使用 | | WiFiルータ | 接続ユーザー数取得 | SNMPからデータ抽出し、独自に作成 | | ファイルサーバー | Windows SNMP | Window Server側でSNMP機能を有効にし、標準テンプレートを使用 | | DELL EMCサーバー | Dell iDrac SNMP | iDracポートをネットワークに接続し、標準テンプレートを適用 | | Windowsツールサーバー | Windows by Zabbix agent | Zabbixエージェントをインストールし、標準テンプレートを使用1 | | 一般PC | ICMP Ping MVD | Pingを行う。標準テンプレートからPing間隔を長く変更 |
アップデート
現状課題があります。
OS
現状はCentOS8 Streamで運用しています。サポートは2024年で終了しているため、RockyLinuxへの乗り換えをしたいところですが、ルート領域の容量が足りず、更新バッチが実行できない状態です。 OSを別途新規インストールしたいところですが、Zabbix設定が移植できるかに課題があります。
Zabbix
バージョン5.4で実行していますが、これもサポートが終了しており、バージョン6.0(LTS)への乗り換えが理想です。 この辺のページを参考にすればできそうですが、まだ未実施の状態です。 https://bestmonitoringtools.com/upgrade-zabbix-to-the-latest-version/
Zabbixアップグレード→OS乗り換えの順に行うのがよいかなと構想はしています。
メール連携
メールサーバー設定(実施済)
~~M&Wメールにて zabbix@maviss-design.comを作成。~~ Office365メールからzabbix@maviss-design.comを送信元として使うように変更(2024/7/31) Zabbixには下記のように設定することで、Zabbixからメールを飛ばせるようになる。
「管理」⇒「メディアタイプ」⇒「Email」を選択し、下記のように設定。
ユーザー名は
net-admin@maviss-design.com
PWはMav1ssDesign1119_sne
送信先設定
Zabbixから警告メールなどを飛ばす先を設定しておく必要があります。 デフォルトでは設定されていないので、必要に応じて各自行なわないといけません。
「管理」⇒「ユーザー」⇒ユーザー名を選択し「メディア」タブ⇒「追加」を押すと下記の画面になりますので、送りたいメールアドレスを設定します。時間帯や条件も追加できます。
dc-adminアカウントには net-adminのメールアドレスを別途設定済です。
どうやらTeamsにも飛ばせるようです・・・
トリガー
被監視マシンが指定の条件を満たした場合に「アクション」を発動させることができます。これがトリガーです。 現在、各拠点のRTX3500の筐体温度が35度以上になったのが5分以上継続した場合をトリガーとして設定しています。
RTX3500のテンプレートに設定しているトリガーが下記となります。
アクション
トリガーの発動を検知した後、何を行うかを定義するのがアクションです。
現在、「RTX3500の筐体温度が35度以上が5分以上継続」のトリガーが発動した場合、net-adminにメールを出すというアクションを設定しています。2
ディスク増設(拡張)
長期間運用したところ、データーベース用のディスク領域が足りなくなる警告が頻発するようになりました。 下記のWebのやり方で拡張(10G→30G)し、解決。 https://note.com/nerone1024/n/n58d1c6b04acf
使うツール(Gparted)のバージョンはWeb記事のもの(1.3.1-1)に合わせてください。 公開されている最新版ではGUIツールが起動しませんでした。
パラメータ調整
警告発報条件が厳しく、抑制したい場合は以下の対処ができます。 * 無効化する * 条件を緩和する
無効化したい場合は対象ホストの「トリガー」から該当する条件を選択し「無効」にトグルすることで、警告メールが発報されなくなります。監視自体はされています。
条件を緩和したい場合は、「テンプレート」の「トリガー」から該当する条件を探し、条件を変更します。
下記はHigh ICMP ping response time の警告を条件緩和したい場合のスクショです。
該当すると思われる部分が変数(\$ICMP_RESPONS_TIME_WARN)になっていました。
この場合は、「マクロ」から変更します。デフォルト値は0.15でしたが、毎朝なぜか引っかかるので閾値を0.5にしました。
恒常的に出ているわけではないので、問題ないと考えています。ping自体が通らない場合は即時警告が出ます。
デフォルトから調整しているもの
- ICMP PingのRESPONSE TIME WARN閾値の緩和
- WiFi機器から High Error rate エラーが出るのを無効化。エラー数0でも発報するときがある(バグ?)。通知頻度の割に影響がない。
zabbix_agentとの疎通確認
コマンドラインから監視対象マシンのzabbix_agentと通信ができているか確認する方法です。 zabbixサーバー(192.168.1.150)にログインして行います。
コマンド例
zabbix_get -s 192.168.1.198 -p 10050 -k system.cpu.load[all,avg1]
IPアドレスの部分は、監視対象の名前またはIPアドレスになります。 コマンド例ではCPU負荷の値を取っていますが、ここは何でも良いです。疎通ができていれば、値が返ってきます。 何らかの原因で通信できない場合はエラーとなります。
VPN接続監視
実現のため色々仕込んでいるので、別セクションとしてまとめます。
接続数監視
まず、基本としてSNMPプロトコルを使い下記コマンドにて入手できる情報が元となります。
snmpwalk -v 1 -c public 192.168.1.1
IPアドレスはRTX3500のルータ等、snmpプロトコルに対応した機器になります。
実行すると、下記のようなデータがずらずらと流れてきます。
NMPv2-MIB::sysDescr.0 = STRING: RTX3500 Rev.14.00.26 (Mon Nov 26 18:36:38 2018)
SNMPv2-MIB::sysObjectID.0 = OID: SNMPv2-SMI::enterprises.1182.1.45
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (807541121) 93 days, 11:10:11.21
SNMPv2-MIB::sysContact.0 = STRING:
SNMPv2-MIB::sysName.0 = STRING:
SNMPv2-MIB::sysLocation.0 = STRING:
SNMPv2-MIB::sysServices.0 = INTEGER: 12
IF-MIB::ifNumber.0 = INTEGER: 1104705
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2
IF-MIB::ifIndex.3 = INTEGER: 3
IF-MIB::ifIndex.4 = INTEGER: 4
IF-MIB::ifIndex.2195 = INTEGER: 2195
・・・
どれが何のデータかは、内容でわかるものもありますが、大半はそのままではよくわかりません。 下記サイトやデータ数を参考に、当たりを付けます。 http://itdoc.hitachi.co.jp/manuals/3020/30203T0401/SNMP0076.HTM
VPN接続数は、実際の接続数と比較しながら、下記MIBと当たりを付けました。
IP-MIB::ip.21.1.8.0.0.0.0 = INTEGER: 4
IP-MIB::ip.21.1.8.114.160.52.0 = INTEGER: 3
IP-MIB::ip.21.1.8.192.168.0.0 = INTEGER: 3
IP-MIB::ip.21.1.8.192.168.1.6 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.1.9 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.1.58 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.1.60 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.1.64 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.2.0 = INTEGER: 4
IP-MIB::ip.21.1.8.192.168.3.0 = INTEGER: 4
MIBのIDは21.1.8でその後ろはIP、INTEGER 4が外部とのトンネルを表していると思われます。 よって、下記のコマンドで実効トンネル数が出ます。このうち2つは他拠点間の接続なので、残りはユーザー接続数と判断できます。
snmpwalk -v 1 -c public 192.168.1.1 IP-MIB::ip.21.1.8 | grep -v "0.0.0.0" | grep "INTEGER: 4" | wc -l
これを元に、IPアドレスなどを引数指定できるようにし、シェルスクリプト化したものを/usr/lib/zabbix/externalscripts/ に仕込みます。
```sh:/usr/lib/zabbix/externalscripts/count_tunnle_connection.sh
!/bin/bash
HOST=$1 COMMUNITY=$2 IFACE=4
Tunnel connection may stand for IFACE:4
snmpwalk -v 1 -c ${COMMUNITY} ${HOST} IP-MIB::ip.21.1.8 | grep -v "0.0.0.0" | grep "INTEGER: ${IFACE}" | wc -l
これをZabbix側で下記のように新規テンプレートとして作成し、RTX3500用のテンプレートとリンクさせてやることでVPN接続者数データが蓄積されるようになります。

### 接続ユーザー監視
具体的なVPN接続ユーザーはsnmpでは流れてこないため、別のやり方で入手します。
expectスクリプトを作成し、自動でRTX3500にtelnetログインし、VPNユーザーを含む情報を出力させます。
```expect:/usr/lib/zabbix/externalscripts/get_tunnel_users.expect
#!/usr/bin/expect
set timeout 10
set target [lindex $argv 0]
spawn telnet $target
expect "Username: "
send "okamoto\n"
expect "Password: "
send "*********\n"
expect "> "
send "console character ascii\n"
expect "> "
send "console lines infinity\n"
expect "> "
send "show status pp anonymous\n"
expect "> "
send "no console lines\n"
expect "> "
send "no console character\n"
expect "> "
send "quit\n"
※実際には私のパスワードがべた書きなのでご注意ください。・・・
実行すると、下記のような出力が流れてきます。
RTX3500 Rev.14.00.26 (Mon Nov 26 18:36:38 2018)
Copyright (c) 1994-2018 Yamaha Corporation. All Rights Reserved.
To display the software copyright statement, use 'show copyright' command.
00:a0:de:3a:c9:54, 00:a0:de:3a:c9:55, 00:a0:de:3a:c9:56, 00:a0:de:3a:c9:57
Memory 1024Mbytes, 4LAN
> console character ascii
> console lines infinity
> show status pp anonymous
ANONYMOUS[01]:
Current L2TP session status is Connected.
Peer Hostname: MVDPC149.maviss.local
3 hours 26 minutes 23 seconds connection.
Received: 455024 packets [67479530 octets]
Transmitted: 551866 packets [180509807 octets]
Time total: 79 days 28 minutes 21 seconds
PPP Configure Options
LCP Local: MSCHAP-V2 Magic-Number MRU, Remote: Magic-Number MRU
IPCP Local: IP-Address, Remote: IP-Address
PP IP Address Local: 192.168.1.1, Remote: 192.168.1.9
IPV6CP Local: Interface-ID, Remote: Interface-ID
PP Interface-ID Local: 02a0defffe3ac954, Remote: ac935451b20a9863
CCP: None
Received Userid: nakamura
ANONYMOUS[02]:
Current L2TP session status is Connected.
Peer Hostname: MVDPC116.maviss.local
ここから、ユーザーIDと、接続PC名、接続時間を抜き出します。 これはpythonスクリプトを作成しています。 内容は簡単ではありますが、ここに載せるには長いので、管理しているgitlabを参照願います。 http://gitlab.maviss.local/okamoto/router_l2tp_info/-/blob/master/router_l2tp_info.py
これらを組み合わせ、下記のようなシェルスクリプトとして仕込みます。 ```sh:get_vpn_user_hq.sh
!/bin/bash
HOST=$1
/usr/lib/zabbix/externalscripts/get_tunnel_users.expect ${HOST} | /usr/lib/zabbix/externalscripts/router_l2tp_info.py --noheader
実行すると、下記のような表示が返ってきます。
$ ./get_vpn_user_args.sh 192.168.1.1 nakamura , MVDPC149.maviss.local , 3 hours 37 minutes 31 seconds teramoto , MVDPC116.maviss.local , 1 day 9 hours 4 minutes 52 seconds thashiguchi , MVDPC124.maviss.local , 5 hours 45 minutes 50 seconds ・・・ ```
Zabbix側で下記のように新規テンプレートとして作成し、RTX3500用のテンプレートとリンクさせてやることでVPN接続者情報が蓄積されるようになります。
深夜接続ユーザー通知メール
これら2つを組み合わせ、午前3時にVPN接続しているユーザー名をメール通知する仕組みを作りました。
接続ユーザー監視テンプレートにトリガーとして下記のように設定しています。
条件式に、VPN接続ユーザー名取得スクリプトの結果が0ではない(必ず成立する)、かつVPN接続者数が3以上、かつ時間が午前3時から4時の間、と設定しています。
条件式に接続ユーザー名取得スクリプトを入れ込んでいるのは、アクションでメール通知する際のマクロ変数に入れておくためです。また、VPN接続者は原則として最低2(拠点間接続があるため)なので、3以上であればユーザーが居るという判定です。
復旧式はVPN接続有り、かつ午前4時以降で復旧フラグを立てています。これがないと警告が出っぱなしになるためです。
このトリガーが真になった場合に、メール通知するアクションを設定することで、通知メールが来るようになりました。
メールメッセージ内のEVENT.OPDATA 変数が条件式で呼び出した式の結果が入るマクロ変数になります。