Zabbix senderを使って事務所の無線を監視するようにした話

こちら [ZYYX Advent Calendar 2019](https://qiita.com/advent-calendar/2019/zyyx) 5日目の記事になります。

# はじめに
年々、オフィス内の機器が増えてきているためか、無線アクセスポイントが不調に陥ることがありました。
ということで、本腰を入れてオフィス内のネットワーク状況の監視をすることにしました！
（実は数年前くらいから社内ネットワーク監視やらねば…と思ってはいたんじゃ…）

# 構成図
以下のような流れでオフィス内のネットワーク機器を監視します。（部分的に省略しています）

![sender2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/ccf25418-69f4-8bc3-90b5-3c60603f943e.png)

ラズパイ（Raspberry Pi 3B+）をオフィス内に設置し、SNMPやpingを使って各機器の状態を収集。
収集したデータはZabbix senderを使って、クラウド上にあるZabbixに飛ばします。
どういう方法で機器の情報を収集するのが良いか結構な時間考えてたんですけど、この様な構成に落ち着きました。

# 取得する内容
使用している機器の機能を考慮して、以下のような項目をSNMPで取得することにしました。

**無線アクセスポイント**

- 無線側総受信パケット
- 無線側総送信パケット
- LAN側総受信パケット
- LAN側総送信パケット
- 無線側インタフェース状態(1:up 2:down)
- LAN側インタフェース状態(1:up 2:down)
- 起動からの経過時間

**ルータ**

- WAN側総受信パケット
- WAN側総送信パケット
- LAN側総受信パケット
- LAN側総送信パケット
- WAN側インタフェース状態(1:up 2:down)
- LAN側インタフェース状態(1:up 2:down)
- CPU使用率
- メモリ使用率
- 起動からの経過時間

**PoEハブ**
SNMP非対応機器だったので、ラズパイからpingを打った結果を定期的にZabbixに送ることにしました。

**ラズパイ**
こちらも自身が生きている証「1」という値を定期的にZabbixに送ることにしました。

# いざ構築
## ラズパイ側の設定
### SNMPでの確認
Zabbix senderで送る前にSNMPで値が取れるかを確認します。
例えば、無線アクセスポイント機器の起動からの経過時間を取りたい場合で、機器がSNMPv2cに対応している場合は以下のようになります。

```bash
$ snmpwalk -v 2c -Ovq -c public {機器のIP} .1.3.6.1.2.1.1.3.0
39:1:08:28.43
```
「1.3.6.1.2.1.1.3.0」は起動からの経過時間（sysUpTimeInstance）のOIDです。
起動からの経過時間、39日1時間08分28.43秒が取れました。


### Zabbix sender導入
Zabbix senderを入れます。（ちなみにzabbix_agent入れると一緒にsenderも入ります）

```bash
$ sudo apt install zabbix-sender
```

### Zabbix senderで値を一括送信
そこそこのアイテム数になるので、Zabbix senderで値を送る時に一括で送信することにします。
Zabbix senderで複数の値を一括送信する際は、`ホスト名 アイテム名 値`を`\n`でくっつけてzabbix_senderコマンドに渡してあげます。
PSK方式での通信暗号化もここでやってしまいます。

```bash
$ echo -n -e "AP1 sysUpTimeInstance `snmpwalk -v 2c -Ovq -c public {機器のIP} .1.3.6.1.2.1.1.3.0`\n・・・（中略）・・・AP1 snmpInPkts `snmpwalk -v 2c -Ovq -c public {機器のIP} .1.3.6.1.2.1.11.1.0`" | /usr/bin/zabbix_sender -z {zabbixホスト名} -p 10051 --tls-connect psk --tls-psk-identity {PSKアイデンティティ文字列} --tls-psk-file /etc/zabbix/zabbix_sender.psk -i -
```

PSKファイルは以下コマンドで予め生成しておきます。

```bash
$ openssl rand -hex 32 > /etc/zabbix/zabbix_sender.psk
```
生成後、権限調整と、パーミッションも600に変えておきます。


## Zabbix側の設定

### ホストとアイテムの準備
Zabbixでホストの作成（機器単位で作成）を行います。
無線アクセスポイント機器は監視項目が似た感じになるのでテンプレート使ってアイテムを準備しておくと便利です。
アイテムのタイプは、Zabbixトラッパーにしておきます。

![スクリーンショット 2019-12-03 22.13.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/41b74cab-5e59-2fe5-0b07-ddbf297b3f71.png)

### 暗号化対応
Zabbix側も暗号化に対応できるよう設定します。
ホスト設定の「暗号化タブ」でPSK方式での通信暗号化が行えるように設定しておきます。

![スクリーンショット 2019-12-03 22.17.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/90b1c898-76b1-d599-4a9c-b0d6f235155f.png)

### トリガー・アクションの設定
以下のような項目をトリガーで引っ掛けています。
アクションで関係者にメール通知されるようにしておきます。

**無線アクセスポイント、ルータ**

- インタフェース状態が2:downの時
- 起動からの経過時間がリセットされた時

**PoEハブ**

- `100%:packet:loss`という文字列が現れた時

**ラズパイ**

- 自身が生きている証「1」が送られてこなくなった時

### マップやスクリーンの作成
視覚的に状況が分かるように以下のようなマップを作っておきました。

![スクリーンショット 2019-12-03 22.39.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/939f7bc9-4868-9097-9dd7-0d1d0d8c636e.png)

ちなみに、
ラズパイにミニLCDを取り付けてるので、サーバラックの側面に貼り付けてZabbixのスクリーン表示をすることで、なんかあった時はどこで障害が起こっているか分かる様になっています！

![FE7120D8-9607-48CA-8F18-84D09F07C311m.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/128331/2b903c68-15bd-7888-9f84-6032e67d0114.jpeg)

# おわりに
結局、監視や調査をしていく中で、無線アクセスポイント不調の原因は、無線アクセスポイントを繋いでいるPoEスイッチのパワー不足であることがわかりました！
監視をしていることでこういった原因などつきとめやすくなるので助かりますね。