Icinga2でVPNのセッション数を監視してみる

# まえがき
以前に[Icinga2の導入](https://qiita.com/papillon/items/abbb210fa927911f7e33)について記載した。昨今のリモートワークによる利用者数の増加もあり、VPNがどれだけ利用されているか確認するため、Icinga2で監視することにした。

# 設定方法
Cisco ASAシリーズのVPN装置で、SSL-VPN、Web-VPN、IPsec-VPNの3種類の同時接続数をそれぞれ監視することにする。
また、同時にping監視も実施している。

## CLIから疎通確認

```
# /usr/lib64/nagios/plugins/check_snmp -H 192.168.0.201 -C public -P 2c -o 1.3.6.1.4.1.9.9.392.1.3.35.0 
```

## icinga2の設定
VPN装置に対してSNMPで状態を取得できるようにして、下記設定をIcinga2に追加する。OIDは適当に確認しておく。

```conf:/etc/icinga2/conf.d/template-vpn.conf
template Host "vpn-device" {
  check_command = "ping4"
  vars.agent_type = "snmp"
  vars.snmp_community = "public"
  vars.snmp_version = "2c"
}

apply Service "cisco-ipsec-sessions" {
  import "generic-service"

  check_command = "snmp"
  vars.snmp_oid = "1.3.6.1.4.1.9.9.392.1.3.26.0"
  vars.snmp_label = "ipsec-sessions"
  vars.check_command = "ipsec-sessions"
  assign where host.vars.category == "Cisco VPN"

  name = "ipsec-sessions"
}

apply Service "cisco-sslvpn-sessions" {
  import "generic-service"

  check_command = "snmp"
  vars.snmp_oid = "1.3.6.1.4.1.9.9.392.1.3.35.0"
  vars.snmp_label = "sslvpn-sessions"
  vars.check_command = "sslvpn-sessions"

  assign where host.vars.category == "Cisco VPN"

  name = "sslvpn-sessions"
}

apply Service "cisco-webvpn-sessions" {
  import "generic-service"

  check_command = "snmp"
  vars.snmp_oid = "1.3.6.1.4.1.9.9.392.1.3.38.0"
  vars.snmp_label = "webvpn-sessions"
  vars.check_command = "webvpn-sessions"

  assign where host.vars.category == "Cisco VPN"

  name = "webvpn-sessions"
}
```

VPN装置に**VPN**で始まるホスト名を付け、グループ化。

```conf:/etc/icinga2/conf.d/group-vpn.conf
object HostGroup "vpn-group" {
  display_name = "VPNグループ"
  assign where regex("^[VPN].*", host.name)
}

object Host "VPN001" {
  import "vpn-device"

  address = "192.168.0.201"
  vars.model = "ASA5500-X Series"
  vars.category = "Cisco VPN"
  notes = "hogehoge用VPN (VPN001)"
}
```

## Icinga Web 2の設定
取得した時系列データをIcinga Web 2上でグラフ表示するための設定を行う。

```conf:/usr/share/icingaweb2/modules/graphite/templates/ipsec-sessions.ini
[ipsec-sessions.graph]
check_command = "ipsec-sessions"

[ipsec-sessions.metrics_filters]
value = "$service_name_template$.perfdata.ipsec-sessions.value"

[ipsec-sessions.urlparams]
areaAlpha = "0.5"
areaMode = "all"
lineWidth = "2"
min = "0"
yUnitSystem = "none"

[ipsec-sessions.functions]
value = "alias(color($metric$, '#1a7dd7'), 'IPSec-VPN sessions')"
```

```conf:/usr/share/icingaweb2/modules/graphite/templates/sslvpn-sessions.ini
[sslvpn-sessions.graph]
check_command = "sslvpn-sessions"

[sslvpn-sessions.metrics_filters]
value = "$service_name_template$.perfdata.sslvpn-sessions.value"

[sslvpn-sessions.urlparams]
areaAlpha = "0.5"
areaMode = "all"
lineWidth = "2"
min = "0"
yUnitSystem = "none"

[sslvpn-sessions.functions]
value = "alias(color($metric$, '#1a7dd7'), 'SSL-VPN sessions')"
```

```conf:/usr/share/icingaweb2/modules/graphite/templates/webvpn.sessions.ini
[webvpn-sessions.graph]
check_command = "webvpn-sessions"

[webvpn-sessions.metrics_filters]
value = "$service_name_template$.perfdata.webvpn-sessions.value"

[webvpn-sessions.urlparams]
areaAlpha = "0.5"
areaMode = "all"
lineWidth = "2"
min = "0"
yUnitSystem = "none"

[webvpn-sessions.functions]
value = "alias(color($metric$, '#1a7dd7'), 'Web-VPN sessions')"
```

# 監視結果
3ヵ月ほど監視してみた結果、このようなグラフとなった。実際には上記設定に加えてCPU使用率やuptimeも見るようにしているため、表示が異なっている。

![Screenshot_2020-07-03 sslvpn-sessions DDTCFW003 サービス Icinga Web2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63695/ede2526f-f853-e329-2acf-a9d14addf8cf.png)

# おまけ
## snmpでうまく値が取れない場合
snmpでうまく値が取れない場合は、debuglogを有効にしてみる。

```
# icinga2 feature enable debuglog
# systemctl restart icinga2
# less /var/log/icinga2/debug.log
# icinga2 feature disable debuglog
# systemctl restart icinga2
```