Prometheus: blackbox_exporterでWindows端末に対しICMP死活監視を行ってみた

###### 実施環境：

```Linux:Linux
[testuser@testhost ~]$ uname -a
Linux testhost 4.18.0-448.el8.x86_64 #1 SMP Wed Jan 18 15:02:46 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
[testuser@testhost ~]$ cat /etc/redhat-release
CentOS Stream release 8
```

prometheus：2.46.0.linux-amd64
blackbox_exporter：0.24.0.linux-amd64

Windows 11 Home 21H2

### 0. 概要

 Prometheus の exporter には、収集したい情報に合わせて様々なものが存在します。
そのうちの1つである blackbox_exporter は外形監視、すなわち対象のサーバ外から HTTP や ICMP などで接続して反応を見る形式の監視を行うことができます。
今回はこの blackbox_exporter を使って、 ICMP での死活監視を行ってみました。
なお、手っ取り早く試すために、監視先にはサーバではなく Windows 端末を使用しています。

### 1. ダウンロード

まずは以下のサイトから blackbox_exporter をダウンロードします。
バージョンは 0.24.0 です。

[Download](https://prometheus.io/download/)

![WS000867.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/ea6d397a-0216-b9fe-9888-b70e7033f627.jpeg "download")

### 2. 起動

次に blackbox_exporter をサーバ上に転送し、解凍します。

```Linux:Linux
[testuser@testhost ~]$ pwd
/home/testuser
[testuser@testhost ~]$ ls -l blackbox_exporter-*.tar.gz
-rw-rw-r--. 1 testuser testuser 10956196 12月 18 22:57 blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$ tar xzf blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$ ls -ld blackbox_exporter-*
drwxr-xr-x. 2 testuser testuser       80  5月 16  2023 blackbox_exporter-0.24.0.linux-amd64
-rw-rw-r--. 1 testuser testuser 10956196 12月 18 22:57 blackbox_exporter-0.24.0.linux-amd64.tar.gz
[testuser@testhost ~]$
```

解凍した中身は以下の通りです。

```Linux:Linux
[testuser@testhost ~]$ cd blackbox_exporter-0.24.0.linux-amd64/
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ pwd
/home/testuser/blackbox_exporter-0.24.0.linux-amd64
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ ls -l
合計 20700
-rw-r--r--. 1 testuser testuser    11357  5月 16  2023 LICENSE
-rw-r--r--. 1 testuser testuser       94  5月 16  2023 NOTICE
-rw-r--r--. 1 testuser testuser      956  5月 16  2023 blackbox.yml
-rwxr-xr-x. 1 testuser testuser 21174366  5月 16  2023 blackbox_exporter
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$
```

以下のようなコマンドを入力することで blackbox_exporter が起動できます。
このコマンドは Ctrl + C などでプロセスを KILL するまで実行され続けます。

```Linux:Linux
[testuser@testhost blackbox_exporter-0.24.0.linux-amd64]$ ./blackbox_exporter --config.file=./blackbox.yml
ts=2023-12-18T14:19:09.927Z caller=main.go:78 level=info msg="Starting blackbox_exporter" version="(version=0.24.0, branch=HEAD, revision=0b0467473916fd9e8526e2635c2a0b1c56011dff)"
```

なお、再起動する Windows 端末から Prometheus のあるサーバをリモートで操作している場合などでは、 `$ nohup ./blackbox_exporter --config.file=./blackbox.yml &` のように nohup (起動元のセッション終了後もプロセスを動作させ続ける)と & (バックグラウンドでプロセスを実行する)を使用してプロセスを起動すれば、リモート接続が切れてもプロセスを続行できます。

### 3. Prometheus 側の設定編集

ここで、 blackbox_exporter の設定ファイル blackbox.yml の中身を見てみましょう。

```yml:blackbox.yml
modules:
  http_2xx:
    prober: http
    http:
      preferred_ip_protocol: "ip4"
  http_post_2xx:
    prober: http
    http:
      method: POST
  tcp_connect:
    prober: tcp
  pop3s_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^+OK"
      tls: true
      tls_config:
        insecure_skip_verify: false
  grpc:
    prober: grpc
    grpc:
      tls: true
      preferred_ip_protocol: "ip4"
  grpc_plain:
    prober: grpc
    grpc:
      tls: false
      service: "service1"
  ssh_banner:
    prober: tcp
    tcp:
      query_response:
      - expect: "^SSH-2.0-"
      - send: "SSH-2.0-blackbox-ssh-check"
  irc_banner:
    prober: tcp
    tcp:
      query_response:
      - send: "NICK prober"
      - send: "USER prober prober prober :prober"
      - expect: "PING :([^ ]+)"
        send: "PONG ${1}"
      - expect: "^:[^ ]+ 001"
  icmp:
    prober: icmp
  icmp_ttl5:
    prober: icmp
    timeout: 5s
    icmp:
      ttl: 5
```

見ての通り、監視のプロトコルやタイムアウトに関する記載ばかりで、監視先を指定する部分が見当たりません。
実は blackbox_exporter の場合、どのサーバを監視するのかといった情報は prometheus 本体のファイル prometheus.yml に記載する必要があります。
以下は prometheus.yml のサンプルです。
監視対象が2つの場合を想定しています。

```yml:prometheus.yml
# my global config
global:
  scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
  evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
  # scrape_timeout is set to the global default (10s).

# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
          # - alertmanager:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  # - "first_rules.yml"
  # - "second_rules.yml"

# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["localhost:9100"]

  - job_name: "blackbox"
    metrics_path: /probe
    params:
      module: [icmp]
    static_configs:
      - targets:
        - 監視対象 1 の IP アドレス
        - 監視対象 2 の IP アドレス
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox_exporter の IP アドレス:9115
```

上記の設定のうち、今回大事な部分を抜粋して説明します。
共通的な設定部分については以下の過去記事を参照してください。

[Linux: システム監視ソフト「Prometheus」を無料インストールしてみた](https://qiita.com/frozencatpisces/items/01b575e34f28651f1496)

まず、設定は scrape_configs 配下にジョブを単位として記載します。
ジョブ名は job_name で指定します。
ジョブ名は取得した情報にラベルとして付与され、検索の際に使用できます。
今回は `blackbox` という名前ですが、他の名前にしても問題なく動作します。

```yml:prometheus.yml
scrape_configs:
(省略)
  - job_name: "blackbox"
```

 metrics_path では HTTP のリソースのパスを指定します。
 URL でいうと `http://***.***.***.***:***/probe?module=icmp&target=***.***.***.***` の `/probe` の部分です。
ここで指定するべき値は監視する情報によって異なります。
デフォルトは `/metrics` ですが、今回の ICMP 死活監視では `/probe` を指定する必要があります。

```yml:prometheus.yml
    metrics_path: /probe
```

 params の下の module で blackbox.yml の modules 配下のモジュール名を指定します。
 blackbox_exporter に 接続する URL `http://***.***.***.***:***/probe?module=icmp&target=***.***.***.***` の `module=icmp` の部分はここの設定で指定されます。
今回は ICMP で死活監視を行いたいので、 `[icmp]` を指定します。

```yml:prometheus.yml
    params:
      module: [icmp]
```

最後の部分ですが、ここは blackbox_exporter に 接続する URL 中の文字列の置き換え規則を指定している箇所です。
説明は後にして、とりあえず監視対象の URL や IP アドレスなど(今回は Windows 端末の IP アドレス)を static_configs の下の targets に、 blackbox_exporter 自体の prometheus 本体からの接続先(今回は同一サーバ上なのでホスト名は `localhost` 、 blackbox_exporter のポート番号は 9115 )を replacement に指定すれば動作します。
監視対象が複数ある場合は、 targets 配下に複数行記載します。

```yml:prometheus.yml
    static_configs:
      - targets:
        - 監視対象 1 の IP アドレス
        - 監視対象 2 の IP アドレス
    relabel_configs:
      - source_labels: [__address__]
        target_label: __param_target
      - source_labels: [__param_target]
        target_label: instance
      - target_label: __address__
        replacement: blackbox_exporter の IP アドレス:9115
```

置き換えの詳細を図で表すと、以下のような形になります。
 relabel_configs 内の置き換えは上から順番に処理される関係上、設定の記載順を変えると想定通り動かないことがあるので注意してください。

![WS000884.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/126fc8eb-eabe-8a47-f7a7-f6862b2312dd.jpeg "config")

ちなみに、 instance は情報に付与する単なるラベルなので、その分の記載は無くとも一応動作はします。
その場合、 instance はデフォルトの値として、置き換え後の \_\_address\_\_ の値(上の図だと `ccc.ccc.ccc.ccc:9115` )をとります。

きちんと設定できれば、以下のように Prometheus の Targets 画面に blackbox_exporter が表示されるはずです。

![WS000868.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b8bac796-4e10-21a0-e606-fa5f6e73133c.jpeg "targets")

なお、上記で指定している Windows 端末の IP アドレスは、コマンドプロンプトで ipconfig コマンドを実行すればすぐにわかります。

```dos:コマンドプロンプト
C:\>ipconfig

Windows IP 構成


イーサネット アダプター イーサネット:

   接続固有の DNS サフィックス . . . . .: *****
   リンクローカル IPv6 アドレス. . . . .: *****
   IPv4 アドレス . . . . . . . . . . . .: Windows 端末の IP アドレス
   サブネット マスク . . . . . . . . . .: *****
   デフォルト ゲートウェイ . . . . . . .: *****

```

### 4. Windows 端末側の設定編集

さて、ここまででとりあえず Prometheus 側の設定は整いましたが、実は監視先が Windows の場合はこれだけではまだ blackbox_exporter は正しく動きません。
というのも、 Windows はデフォルトでは ping に返答しない設定となっているためです。

```Linux:Linux
[testuser@testhost ~]$ ping -c 4 Windows 端末の IP アドレス
PING ***.***.***.*** (***.***.***.***) 56(84) bytes of data.

--- ***.***.***.*** ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3104ms

[testuser@testhost ~]$
```

そこで、 Windows 側の設定を以下のように編集して、 ping に反応するようにします。

まずは、スタートの「すべてのアプリ」から「 Windows セキュリティ」を起動します。

![WS000871.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/b5be1180-74e1-cbd2-1803-2b15319431c7.jpeg "スタート")

「ファイアウォールとネットワーク保護」を選択します。

![WS000872.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/3dcd4cda-7066-6c4e-0b3c-07584180c9fd.jpeg "セキュリティ")

アクティブになっている設定を確認後、「詳細設定」を選択します。
今回は「パブリック ネットワーク」がアクティブになっています。

![WS000882.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/e8f92cf0-e93c-ee55-1644-d16c79a52612.jpeg "ファイアウォール")

ファイアウォールの設定画面が出るので、「受信の規則」を選択します。

![WS000883.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/6bc576c3-4b1d-a2ab-6a13-573ff6d2c7b3.jpeg "ファイアウォール設定")

規則の一覧をずっと下に行くと、「ファイルとプリンターの共有 (エコー要求・ICMPv* 受信) という行があります。
これが、 ping への応答の有無を定義している行です。

![WS000875.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/8fd5eeb6-6063-82b5-c47d-7b92bfdc9c5b.jpeg "受信の規則")

今回は IPv4 を使用するので、「 v4 」とある方を有効にします。
また、先ほど確認したアクティブな設定は「パブリック ネットワーク」なので、有効にするのはプロファイルが「プライベート、パブリック」となっている行だけでよいです。

右クリックで「規則の有効化」を選択すると、規則が有効にできます。

![WS000876.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/7a883b8d-0b8f-960d-6950-3d232fce021b.jpeg "右クリック")

有効になっていれば、行の左にチェックマークが付きます。

![WS000878.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/d61b2f6a-a954-9af1-08f7-ec567153dd75.jpeg "規則の有効化")

これで無事、 Windows 端末に ping が通るようになりました。

```Linux:Linux
[testuser@testhost ~]$ ping -c 4 Windows 端末の IP アドレス
PING ***.***.***.*** (***.***.***.***) 56(84) bytes of data.
64 bytes from ***.***.***.***: icmp_seq=1 ttl=128 time=0.798 ms
64 bytes from ***.***.***.***: icmp_seq=2 ttl=128 time=0.861 ms
64 bytes from ***.***.***.***: icmp_seq=3 ttl=128 time=0.560 ms
64 bytes from ***.***.***.***: icmp_seq=4 ttl=128 time=0.748 ms

--- ***.***.***.*** ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3111ms
rtt min/avg/max/mdev = 0.560/0.741/0.861/0.117 ms
```

### 5. 動作確認

以上で、 blackbox_exporter の動作環境が構築できました。
 blackbox_exporter で取得した ICMP での死活監視情報は、 `probe_success` で確認することができます。

以下は、 blackbox_exporter が動作している状態で Windows 端末に再起動をかけてみた際の画面です。

![WS000881.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465018/62f850dc-81c8-f7e0-06ab-ed447981582d.jpeg "graph")

 `probe_success` では、稼働状態は 1 、停止状態は 0 として表現されます。
再起動のタイミングでグラフが 1 から 0 になり、また 1 に戻っているのが確認できます。