RTX810のNAPTテーブル、ARPテーブル、DHCPの使用状況をZabbixに記録する

# 概要

時折、社員から無線LANで接続が切れる、という情報が寄せられている。
最近の社員増加に伴って端末が増え、ルータ(RTX810)のNAPTテーブルが溢れているのではないか？

残念ながらSNMPを用いてRTX810のNAPTテーブルの使用量を調べることはできなかったので、外部チェックスクリプトを仕込んで調べてみた。
その他、ARPテーブルとDHCPのリース状況も調べた。

# 環境

* ルータ: YAMAHA RTX810
* NAPT、DHCPサーバ、Web管理画面をON

# 外部チェックのスクリプト

## NAPTテーブル

~~~bash:nat_table_usage.sh
#!/bin/bash

HOST=$1
PASS=(RTXのウェブ管理画面のパスワード)
COMMAND="show nat descriptor address"

SESSION=`wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command.html -O - 2>/dev/null \
 | grep HTTPD_SESSION_ID | awk -F'"' '{print $6}'`

wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command_set.html \
 --post-data="HTTPD_SESSION_ID=${SESSION}&COMMAND=${COMMAND}&x=10&y=10" -O - 2>/dev/null \
 | iconv -f Shift-JIS -t UTF-8 | grep "個使用中" |  awk -F' |個' '{print $10}'
~~~

やっていることは、以下の通り。

1. Web管理画面の「コマンドの実行」ページを表示し、`<input type="hidden" name="HTTPD_SESSION_ID" value="********">`を取得
2. コマンドに`show nat descriptor address`を指定して実行
3. 帰ってきた結果をShift-JISからUTF-8に変換して、テーブルの使用量を`awk`で抜き出す

このスクリプトをZabbixサーバの`/usr/lib/zabbix/externalscripts/`に配置し、
`chmod +x nat_table_usage.sh`で実行可能にしておく。
正確にはNATではなくNAPTなのだが、RTX側のコマンド名に合わせた。

dockerでZabbixサーバを起動する場合は、alpineに入っているwgetのバージョンが古いため、alpineベースのものではなくUbuntuベースのものがおすすめ。

## ARPテーブル

~~~bash:arp_table_usage.sh
#!/bin/bash

HOST=$1
PASS=(RTXのウェブ管理画面のパスワード)
COMMAND="show arp"

SESSION=`wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command.html -O - 2>/dev/null \
 | grep HTTPD_SESSION_ID | awk -F'"' '{print $6}'`

wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command_set.html \
 --post-data="HTTPD_SESSION_ID=${SESSION}&COMMAND=${COMMAND}&x=10&y=10" -O - 2>/dev/null \
 | iconv -f Shift-JIS -t UTF-8  | grep "カウント数" |  awk -F':' '{print $2}'
~~~

## DHCP

~~~bash:dhcp_status.sh 
#!/bin/bash

HOST=$1
PASS=(RTXのウェブ管理画面のパスワード)
COMMAND="show status dhcp"

SESSION=`wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command.html -O - 2>/dev/null \
 | grep HTTPD_SESSION_ID | awk -F'"' '{print $6}'`

wget --http-user="" --http-password="${PASS}" http://${HOST}/detail/command_set.html \
 --post-data="HTTPD_SESSION_ID=${SESSION}&COMMAND=${COMMAND}&x=10&y=10" -O - 2>/dev/null \
 | iconv -f Shift-JIS -t UTF-8  | grep "割り当て中アドレス数" |  awk -F':' '{print $2}'
~~~

# Zabbixの設定

## Item

Zabbixサーバにアクセスして、「Configuration」「Hosts」または「Templates」からRTX810の「Item」を選択。

「Create Item」をクリックして、アイテムを作成し、各項目を設定。

* Name: 「NAT Table Usage」
* Type: 「External check」
* Key: 「`nat_table_usage.sh["{HOST.CONN}"]`」
* Host interface: RTX810のIPアドレス
* Update interval: 1m ⇒ 1分

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/c9d47644-82d0-6a22-3372-da3d9e836970.png)

同様に`arp_table_usage.sh["{HOST.CONN}"]`と`dhcp_status.sh["{HOST.CONN}"]`のItemも作成する。

`"{HOST.CONN}"`の部分には、`Host interface`に指定されたIPアドレスが入る。

## Graph

次に「Graph」から「Create Graph」を使ってグラフを作成する。

* Items: 「Add」から上で作成したItem(NAT Table Usage)をSelect

見た目はお好みで。

# 結果

しばらくデータを貯めたら、グラフを見てみる。
最大で3000行ぐらい使っているようだが、RTX810は最大10000まで行けるので、
まだまだ溢れてはいないようだ。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/197772/83f04dda-b7b1-6a6f-a36d-665dee20c88a.png)

次に怪しいのはAPの同時接続数なので、次はそちらを調査する。