ICMP(ping)が許可されていない環境でICMP以外のプロトコルを利用して外形監視を行うには

pingコマンドによる外形監視は古典的なやり方ではありますが、Qiitaで「ping」と検索すると多くの記事が該当するように、現在（2024年9月15日時点）もなお利用されている手法なのでしょう。
そんなpingですが、サーバーの設定によってはICMPを許可していない環境もあるため、pingコマンドによる外形監視が行えなこともしばしばあります。

HTTP、HTTPSであれば、curlコマンドを使うことで外形監視を行うこともできますが、pingコマンドのように、1回のコマンド実行で複数回のリクエストを行ったり、応答時間やパケットロス率を見たい場合もあるでしょう。
そういった場合に、ICMP以外のプロトコルに対して外形監視を行うことが可能なコマンドの存在を知りました。

今回は、それらのコマンドを紹介してみようと思います。

---

### ping

まずは、基本となる通常のpingの実行例を見てみましょう。

#### 実行例

監視先ホストに対して3回リクエストを送信。

```
$ ping -c 3 監視先ホスト
PING 監視先ホスト (XXX.XXX.XXX.XXX) 56(84) bytes of data.
64 bytes from xxx.xxx.com (XXX.XXX.XXX.XXX): icmp_seq=1 ttl=242 time=23.2 ms
64 bytes from xxx.xxx.com (XXX.XXX.XXX.XXX): icmp_seq=2 ttl=242 time=25.6 ms
64 bytes from xxx.xxx.com (XXX.XXX.XXX.XXX): icmp_seq=3 ttl=242 time=18.5 ms

--- 監視先ホスト ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 18.526/22.419/25.572/2.923 ms
```

---

### [nping](https://nmap.org/nping/)

npingのページによると、「パケットの生成、応答時間の測定や分析を行うことができるOSS」と説明されています。
ICMP以外にも、TCP、UDP、ARPのパケットを生成することができます。

様々なOS環境で利用可能ですが、Debian/Ubuntuの場合は「 `Sometimes Debian's Nmap releases are a year or more behind the current Nmap version.` 」という[気になる説明](https://nmap.org/book/inst-linux.html#inst-debian)があるので、最新版を利用したい場合はソースからコンパイルすることをオススメします。
alianコマンドを利用して、「.rpm」形式のファイルから「.deb」に変換することについても言及されていますので、興味がある方はこちらの方法を試してみるのも良いかしれません。

#### 実行例

監視先ホストの80番ポートに対して3回リクエストを送信。

```
$ nping -c 3 -p 80 監視先ホスト

Starting Nping 0.7.80 ( https://nmap.org/nping ) at 2024-09-15 19:09 JST
SENT (0.0184s) Starting TCP Handshake > 監視先ホスト:80 (XXX.XXX.XXX.XXX:80)
RCVD (0.0442s) Handshake with 監視先ホスト:80 (XXX.XXX.XXX.XXX:80) completed
SENT (1.0215s) Starting TCP Handshake > 監視先ホスト:80 (XXX.XXX.XXX.XXX:80)
RCVD (1.0484s) Handshake with 監視先ホスト:80 (XXX.XXX.XXX.XXX:80) completed
SENT (2.0248s) Starting TCP Handshake > 監視先ホスト:80 (XXX.XXX.XXX.XXX:80)
RCVD (2.0533s) Handshake with 監視先ホスト:80 (XXX.XXX.XXX.XXX:80) completed
 
Max rtt: 28.566ms | Min rtt: 25.779ms | Avg rtt: 27.074ms
TCP connection attempts: 3 | Successful connections: 3 | Failed: 0 (0.00%)
Nping done: 1 IP address pinged in 2.05 seconds
```

npingのようなコマンドは、オプションの選択次第では攻撃ツールとなりえますので、利用する際はくれぐれもご注意ください。
そういった利用方法は[映画のようなフィクションの世界](https://nmap.org/movies/)だけで楽しみましょう。

---

### [hping3](https://www.kali.org/tools/hping3/)

hping3はnpingと同様に、ICMP、TCP、UDPでパケットを送信することが可能です。
[Kali Linux](https://ja.wikipedia.org/wiki/Kali_Linux)にバンドルされていることからもわかりますが、ご利用に際しては（以下略

#### 実行例

監視先ホストの443番ポートに対してSynパケットを3回送信。
「Synパケット」を送信する毎に「flags=SA（Syn-Ackパケット）」を受信していることがわかります。
実行結果の「監視先ホスト hping statistic」の部分がpingコマンドとほぼ同じ形式で出力されていますので、pingコマンドの実行結果を正規表現などで抽出している処理がある場合は、hping3への置き換えは容易かと思います。

```
$ sudo hping3 -c 3 -p 443 -S 監視先ホスト
[sudo] XXXXXXXX のパスワード: 
HPING 監視先ホスト (XXXXXXXXXXXXXXX XXX.XXX.XXX.XXX): S set, 40 headers + 0 data bytes
len=46 ip=XXX.XXX.XXX.XXX ttl=241 DF id=0 sport=443 flags=SA seq=0 win=65535 rtt=18.8 ms
len=46 ip=XXX.XXX.XXX.XXX ttl=241 DF id=0 sport=443 flags=SA seq=1 win=65535 rtt=24.7 ms
len=46 ip=XXX.XXX.XXX.XXX ttl=241 DF id=0 sport=443 flags=SA seq=2 win=65535 rtt=20.4 ms

--- 監視先ホスト hping statistic ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 18.8/21.3/24.7 ms
```

実行に際しては、sudoを付与しないと以下のように失敗します。（「Ubuntu 22.04.4 LTS」の環境にて）

```
$ hping3 -c 3 -p 443 -S 監視先ホスト
[open_sockraw] socket(): Operation not permitted
[main] can't open raw socket
```

---

### おまけ

#### [gping](https://github.com/orf/gping)

実行結果をグラフィカルに表示してくれるRust製のpingツール。

- [gping (pingの結果をグラフで表示してくれる, rust)](https://devlights.hatenablog.com/entry/2023/08/29/073000)

#### [fping](https://fping.org/)

fpingはICMPを利用した監視ツールですが、一度に複数のホストに対してリクエストを送信することが可能という点がpingと異なります。使い方を誤ると（以下略

- [高性能pingツール「fping」の使い方](https://news.mynavi.jp/techplus/article/20180805-673577/)

#### [Blitzping](https://github.com/Thraetaona/Blitzping)

「A very high-speed, configurable, and portable packet-crafting utility optimized for embedded devices」と説明されているんですが、それって。。。（以下略

#### [Bing](http://fgouget.free.fr/bing/bing_src-readme.shtml)

まず、名称のせいでググラビリティが低すぎる。。。
[こちらのページ](https://medium.com/@girish1729/ping-fping-bing-arping-and-hping3-6810ed88612b)の説明によると、2つのホスト間の帯域幅を計測するためのものらしいのですが、「うまく動作しない」とのこと。

---

##### 参考URL
- [Ping, fping, bing, arping and hping3](https://medium.com/@girish1729/ping-fping-bing-arping-and-hping3-6810ed88612b)
- [How to use nping]()
- [nping - portを指定してping](https://zenn.dev/nitaking/articles/e0e051e17169a8)
- [hpingでポートを指定しての疎通確認](https://fiore.hatenadiary.org/entry/20080225/1203937362)
- [hping3によるフィルタリングルールの検証](https://www.valinux.co.jp/technologylibrary/document/linux/hping0001/)
- さくらのクラウド
    - [シンプル監視](https://cloud.sakura.ad.jp/products/simple-monitor/)
- Mackerel
    - [ネットワーク機器等の監視はできますか？](https://support.mackerel.io/hc/ja/articles/360039701652-%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E6%A9%9F%E5%99%A8%E7%AD%89%E3%81%AE%E7%9B%A3%E8%A6%96%E3%81%AF%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%81%8B)
- Datadog
    - [Ping](https://docs.datadoghq.com/ja/integrations/ping/)
- New Relic 
    - [pingモニターの結果を見る](https://docs.newrelic.com/jp/docs/synthetics/synthetic-monitoring/using-monitors/view-ping-monitor-results/)