hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

hping3コマンドの使い方



1 hping3コマンドとは?

任意のTCP/IPパケットを作成して送信することができるコマンドです。

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のens33はNICの名前です。クライアントでhping3コマンドを実行し、サーバでhping3が送信するパケットを確認します。

                               192.168.2.0/24
client(ens33) ------------------------------------------(ens33) server
        .105                                           .100

2.2 版数

CentOS版数は、サーバ、クライアントともに下記版数です。

[root@server ~]# cat /etc/redhat-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname  -r
3.10.0-1160.el7.x86_64

3 事前準備

3.1 パッケージのインストール

hping3パッケージはクライアントにインストールします。hping3はepelリポジトリにあるので、まずepel-releaseパッケージをインストールします。

[root@client ~]# yum -y install epel-release

次に、hping3パッケージをインストールします。

[root@client ~]# yum -y install hping3

版数を確認します。

[root@client ~]# hping3 --version
hping version 3.0.0-alpha-1 ($Id: release.h,v 1.4 2004/04/09 23:38:56 antirez Exp $)
This binary is TCL scripting capable

3.2 firewalldサービスの停止

本記事では検証をやりやすくするため、firewalldサービスを停止します。

[root@server ~]# systemctl stop firewalld.service

状態を確認します。firewalldサービスが停止していることがわかります。

[root@server ~]# systemctl is-active firewalld.service
inactive

4 オプション一覧

オプション一覧を確認します。

[root@client ~]# hping3 -h
usage: hping host [options]
  -h  --help      show this help
  -v  --version   show version
  -c  --count     packet count
  -i  --interval  wait (uX for X microseconds, for example -i u1000)
      --fast      alias for -i u10000 (10 packets for second)
      --faster    alias for -i u1000 (100 packets for second)
      --flood      sent packets as fast as possible. Don't show replies.
  -n  --numeric   numeric output
  -q  --quiet     quiet
  -I  --interface interface name (otherwise default routing interface)
  -V  --verbose   verbose mode
  -D  --debug     debugging info
  -z  --bind      bind ctrl+z to ttl           (default to dst port)
  -Z  --unbind    unbind ctrl+z
      --beep      beep for every matching packet received
Mode
  default mode     TCP
  -0  --rawip      RAW IP mode
  -1  --icmp       ICMP mode
  -2  --udp        UDP mode
  -8  --scan       SCAN mode.
                   Example: hping --scan 1-30,70-90 -S www.target.host
  -9  --listen     listen mode
IP
  -a  --spoof      spoof source address
  --rand-dest      random destionation address mode. see the man.
  --rand-source    random source address mode. see the man.
  -t  --ttl        ttl (default 64)
  -N  --id         id (default random)
  -W  --winid      use win* id byte ordering
  -r  --rel        relativize id field          (to estimate host traffic)
  -f  --frag       split packets in more frag.  (may pass weak acl)
  -x  --morefrag   set more fragments flag
  -y  --dontfrag   set dont fragment flag
  -g  --fragoff    set the fragment offset
  -m  --mtu        set virtual mtu, implies --frag if packet size > mtu
  -o  --tos        type of service (default 0x00), try --tos help
  -G  --rroute     includes RECORD_ROUTE option and display the route buffer
  --lsrr           loose source routing and record route
  --ssrr           strict source routing and record route
  -H  --ipproto    set the IP protocol field, only in RAW IP mode
ICMP
  -C  --icmptype   icmp type (default echo request)
  -K  --icmpcode   icmp code (default 0)
      --force-icmp send all icmp types (default send only supported types)
      --icmp-gw    set gateway address for ICMP redirect (default 0.0.0.0)
      --icmp-ts    Alias for --icmp --icmptype 13 (ICMP timestamp)
      --icmp-addr  Alias for --icmp --icmptype 17 (ICMP address subnet mask)
      --icmp-help  display help for others icmp options
UDP/TCP
  -s  --baseport   base source port             (default random)
  -p  --destport   [+][+]<port> destination port(default 0) ctrl+z inc/dec
  -k  --keep       keep still source port
  -w  --win        winsize (default 64)
  -O  --tcpoff     set fake tcp data offset     (instead of tcphdrlen / 4)
  -Q  --seqnum     shows only tcp sequence number
  -b  --badcksum   (try to) send packets with a bad IP checksum
                   many systems will fix the IP checksum sending the packet
                   so you'll get bad UDP/TCP checksum instead.
  -M  --setseq     set TCP sequence number
  -L  --setack     set TCP ack
  -F  --fin        set FIN flag
  -S  --syn        set SYN flag
  -R  --rst        set RST flag
  -P  --push       set PUSH flag
  -A  --ack        set ACK flag
  -U  --urg        set URG flag
  -X  --xmas       set X unused flag (0x40)
  -Y  --ymas       set Y unused flag (0x80)
  --tcpexitcode    use last tcp->th_flags as exit code
  --tcp-timestamp  enable the TCP timestamp option to guess the HZ/uptime
Common
  -d  --data       data size                    (default is 0)
  -E  --file       data from file
  -e  --sign       add 'signature'
  -j  --dump       dump packets in hex
  -J  --print      dump printable characters
  -B  --safe       enable 'safe' protocol
  -u  --end        tell you when --file reached EOF and prevent rewind
  -T  --traceroute traceroute mode              (implies --bind and --ttl 1)
  --tr-stop        Exit when receive the first not ICMP in traceroute mode
  --tr-keep-ttl    Keep the source TTL fixed, useful to monitor just one hop
  --tr-no-rtt       Don't calculate/show RTT information in traceroute mode
ARS packet description (new, unstable)
  --apd-send       Send the packet described with APD (see docs/APD.txt)

5 TCPに関するオプションの使い方

5.1 宛先ポート番号の指定方法(-p)

サーバでtcpdumpを実行します。tcpdumpのインストール方法、使い方はtcpdumpの使い方(基本編) - hana_shinのLinux技術ブログを参照してください。宛先ポート番号が11111のパケットをキャプチャするので、以下のように実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-I : パケットの送信インタフェースを指定する
-c : 送信するパケットの個数を指定する
-p : 送信先ポート番号を指定する
-s : 送信元ポート番号を指定する

[root@client ~]# hping3 -I ens33 -c 1 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認すると、宛先ポート番号が11111であることがわかります。それから、サーバからクライアントにRSTパケットが送信されているのは、サーバで11111番ポートでListenしているプロセスがいないためです。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
13:59:31.048371 IP 192.168.2.105.2870 > 192.168.2.100.11111: Flags [none], win 512, length 0
13:59:31.048406 IP 192.168.2.100.11111 > 192.168.2.105.2870: Flags [R.], seq 0, ack 1238446976, win 0, length 0

5.2 送信元ポート番号の指定方法(-s)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行して、以下のパケットをサーバに送信します。
・送信元ポート番号:22222
送信先ポート番号:11111

[root@client ~]# hping3 -I ens33 -c 1 -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。送信元ポート番号が22222、送信先ポート番号が11111であることがわかります。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
14:08:57.336341 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags [none], win 512, length 0
14:08:57.336374 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 339106045, win 0, length 0

5.3 送信元IPアドレスを指定したIPアドレスにする方法(-a)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行して、以下のパケットをサーバに送信します。
・送信元IPアドレス:1.1.1.1
・送信元ポート番号:22222
送信先ポート番号:11111

[root@client ~]# hping3 -I ens33 -c 1 -a 1.1.1.1 -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。送信元IPアドレスが、1.1.1.1であることがわかります。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
14:14:05.123969 IP 1.1.1.1.22222 > 192.168.2.100.11111: Flags [none], win 512, length 0
14:14:05.124004 IP 192.168.2.100.11111 > 1.1.1.1.22222: Flags [R.], seq 0, ack 1159368654, win 0, length 0

5.4 タイムスタンプオプションを付加する方法(--tcp-timestamp)

TCPヘッダにはいくつかオプションがあります。オプションの中にタイムスタンプオプションがあります。通常タイムスタンプオプションはTCPヘッダに付加されていますが、hping3コマンドが送信するTCPパケットには、タイムスタンプオプションがついていません。ここでは、--tcp-timestampオプションを指定して、TCPパケットにタイムスタンプオプションを付加してみます。

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 --tcp-timestamp -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。tcpdumpの実行結果に”options [nop,nop,TS val 3168492678 ecr 0]と表示されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
14:24:03.047893 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags [none], win 512, ★options [nop,nop,TS val 3168492678 ecr 0], length 0
14:24:03.047929 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 753600104, win 0, length 0

5.5 送信データサイズを指定する方法(-d)

送信データサイズとは、TCPペイロードサイズのことです。ここでは、データサイズが512バイトのパケットを送信してみます。

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 -d 512 -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。tcpdumpの実行結果に”length 512”と表示されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
14:29:25.620045 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags [none], seq 1612055325:1612055837, win 512, ★length 512
14:29:25.620079 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 1612055837, win 0, length 0

5.6 シーケンス番号を指定する方法(-M)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。このとき、シーケンス番号1000から512バイト分のパケットを送信してみます。

[root@client ~]# hping3 -I ens33 -c 1 -M 1000 -d 512 -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。tcpdumpの実行結果に”seq 1000:1512”と表示されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
14:35:19.755144 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags [none], ★seq 1000:1512, win 512, length 512
14:35:19.755177 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 2682912972, win 0, length 0

5.7 ACK番号を指定する方法(-L)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-A : TCPヘッダのフラグフィールドにACKビットをセットする
-L: ACK番号を指定する

[root@client ~]# hping3 -I ens33 -c 1 -A -L 2000 -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。クライアントからサーバにACK番号が2000のTCPパケットが送信されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
14:54:39.020660 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags [.], ★ack 2000, win 512, length 0
14:54:39.020695 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R], seq 2000, win 0, length 0

5.8 TCPヘッダのチェックサム値を不正な値に変更する方法(-b)

サーバでncコマンドを実行します。ncコマンドのインストール方法、使い方は、[:title]を参照してください。

[root@server ~]# nc -kl 11111

TcpInCsumErrorsは、チェックサム値が不正なTCPパケットの受信数を表します。現時点でTcpInCsumErrorsは0であることがわかります。

[root@server ~]# nstat -z TcpInCsumErrors
#kernel
TcpInCsumErrors                 0                  0.0

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-S:TCPヘッダのフラグフィールドにSYNビットをセットする
-b:TCPヘッダのチェックサム値を不正なものに書き換える

[root@client ~]# hping3 -I ens33 -c 1 -b -S -s 22222 -p 11111 192.168.2.100

サーバでターミナルをもう1つオープンしてnstat コマンドを実行します。TcpInCsumErrorsの値が1になったことがわかります。

[root@server ~]# nstat -z TcpInCsumErrors
#kernel
TcpInCsumErrors                 1                  0.0

なお、firewalldサービスが有効になっていると、チェックサムが異常なパケットがOSのnetfilterで廃棄されます。OSのnetfilterは位置的にはIP層に実装されています。そのため、チェックサムが不正なパケットがTCP層に到達する前に廃棄されるので、TCP層で実装しているTcpInCsumErrorsの値はカウントアップされません。

5.9 フラグの設定方法

TCPヘッダのフラグフィールドに設定できるフラグは以下のとおりです。以下は、manからの抜粋です。

-F --fin : Set FIN tcp flag.
-S --syn : Set SYN tcp flag.
-R --rst : Set RST tcp flag.
-P --push : Set PUSH tcp flag.
-A --ack : Set ACK tcp flag.
-U --urg : Set URG tcp flag.
5.9.1 SYNパケットの送信方法(-S)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 -S -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。クライアントからサーバにSYNパケットが送信されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
15:23:11.831388 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags ★[S], seq 1900784056, win 512, length 0
15:23:11.831423 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 1900784057, win 0, length 0
5.9.2 FINパケットの送信方法(-F)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 -F -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。クライアントからサーバにFINパケットが送信されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
15:25:46.100902 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags ★[F], seq 2001762790, win 512, length 0
15:25:46.100965 IP 192.168.2.100.11111 > 192.168.2.105.22222: Flags [R.], seq 0, ack 100978735, win 0, length 0
5.9.3 RSTパケットの送信方法(-R)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 -R -s 22222 -p 11111 192.168.2.100

サーバでtcpdumpの実行結果を確認します。クライアントからサーバにRSTパケットが送信されていることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 tcp port 11111 -nn
15:27:02.181570 IP 192.168.2.105.22222 > 192.168.2.100.11111: Flags ★[R], seq 1446454394, win 512, length 0

6 IPに関するオプションの使い方

6.1 TTL初期値の変更方法

IPヘッダにTTLというフィールドがあります。実装によってことなりますが、CentOS7の初期値は64です。ルータを超えるごとに1減算されます。0になるとパケットが廃棄されます。ここでは、TTLの初期値を変更してみます。

6.1.1 TTLが初期値の場合

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 icmp -v

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-1:ICMPパケット送信

[root@client ~]# hping3 -c 1 -1 192.168.2.100

サーバでtcpdumpの実行結果を確認します。TTLが64であることがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 icmp -v
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
15:42:18.780094 IP (tos 0x0, ★ttl 64, id 41929, offset 0, flags [none], proto ICMP (1), length 28)
    192.168.2.105 > server: ICMP echo request, id 10507, seq 0, length 8
15:42:18.780132 IP (tos 0x0, ttl 64, id 24071, offset 0, flags [none], proto ICMP (1), length 28)
    server > 192.168.2.105: ICMP echo reply, id 10507, seq 0, length 8
6.1.2 TTLの初期値を変更する場合(-t)

次に、オプションを指定してTTLの初期値を1にしてみます。

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 icmp -v

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-1:ICMPパケット送信
-t :TTLの初期値

[root@client ~]# hping3 -c 1 -1 -t 1 192.168.2.100

サーバでtcpdumpの実行結果を確認します。TTLが1になったことがわかります(★の部分)。

[root@server ~]# tcpdump -i ens33 icmp -v
15:46:41.740295 IP (tos 0x0, ★ttl 1, id 25865, offset 0, flags [none], proto ICMP (1), length 28)
    192.168.2.105 > server: ICMP echo request, id 11019, seq 0, length 8
15:46:41.740361 IP (tos 0x0, ttl 64, id 40595, offset 0, flags [none], proto ICMP (1), length 28)
    server > 192.168.2.105: ICMP echo reply, id 11019, seq 0, length 8

7 ICMPに関するオプションの使い方

7.1 ICMP Echo requestの送信方法(ICMP Type=8)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 icmp -nn

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-1:ICMPパケット送信
-C :ICMP Typeを表す。8:ICMP Echo request

[root@client ~]# hping3 -I ens33 -c 1 -1 -C 8 192.168.2.100

7.2 ICMP Destination Unreachableの送信方法(ICMP Type=3)

ICMP Destination Unreachableには、Codeの種別にしたがって以下のものがあります。一部を記載します。

Code 種別 意味
0 net unreachable ネットワークに到達することができない
1 host unreachable ホストに到達することができない
3 port unreachable ポートに到達することができない
4 fragmentation needed and DF set フラグメンテーションが必要なのに禁止フラグがたっている
7.2.1 host unreachableの送信方法(ICMP Type=3, Code=1)

host unreachableが発生する状況を以下に説明します。
クライアントからサーバにデータを送信したとします。このとき、ルータがサーバにARP requestを送信してサーバのMACアドレスを取得するのですが、たとえば、サーバのインタフェースがダウンしている場合、ARP requestに対する応答がありません。ARP requestを3回送信しても応答がない場合、ルータはクライントにICMP host unreachableを送信します。以下の図では(A)の部分です。

           192.168.2.0/24                     192.168.3.0/24
 client                           router                     server
(ens33) .105            .20 (ens33) (ens34) .20           .10 (ens33)
   |                            |      |                        |
   |                            |      |                        | interface down
   |                            |      |                        |
   |------- ICMP/UDP/TCP ------>|      |                        |
   |                            |      |------ ARP request ---->|
   |                            |      |------ ARP request ---->|
   |                            |      |------ ARP request ---->|
   |<-- ICMP host unreachable --|(A)   |                        |
   |                            |      |                        |
   |                            |      |                        |

クライアントでtcpdumpを実行します。

[root@client ~]#  tcpdump -i ens33 icmp -nn

上記(A)で送信するICMP host unreachableを送信してみます。
ルータでhping3コマンドを実行します。ここではクライアントからサーバにUDPパケットを送信したけど、サーバがARP requestに応答しなかったとき、ルータからクライアントに送信するICMP host unreachableを送信してみます。オプションの意味は次のとおりです。

オプション 意味
-C ICMP Typeを指定する
-K Codeを指定する
--icmp-ipproto プロトコル種別を表す。UDPは17
--icmp-ipsrc host unreachableの原因となるオリジナルパケットの送信元IPアドレス
--icmp-ipdst host unreachableの原因となるオリジナルパケットの宛先IPアドレス
--icmp-srcport host unreachableの原因となるオリジナルパケットの送信元ポート番号
--icmp-dstport host unreachableの原因となるオリジナルパケットの宛先ポート番号
[root@router ~]# hping3 -I ens33 -1 -c 1 -C 3 -K 1 --icmp-ipproto 17 --icmp-ipsrc 192.168.2.105 --icmp-ipdst 192.168.3.10 --icmp-srcport 22222 --icmp-dstport 111111 192.168.2.105

ルータからクライアントに192.168.3.10に対するICMP host unreachableが送信されていることがわかります。

[root@client ~]#  tcpdump -i ens33 icmp -nn
19:41:09.060665 IP 192.168.2.100 > 192.168.2.105: ICMP host 192.168.3.10 unreachable, length 36
7.2.2 port unreachableの送信方法(ICMP Type=3, Code=3)

port unreachableが発生する状況を以下に説明します。
クライアントからサーバにUDPパケットを送信します。このとき、パケットの送信先ポート番号で待ち受けるプロセスが存在しないと、サーバからクライアントにICMP port unreachableが送信されます。

以下は、クライアントからサーバにUDPの宛先ポート番号が11111のパケットを送信しています。しかし、サーバでは、11111番ポートでパケットを待ち受けるプロセスが存在しません。このとき、サーバからクライアントに ICMP Port unreachableが送信されます。

   client                                     server
192.168.2.105                              192.168.2.100
      |                                          |
      |                                          |
      |--------- UDP (dst port=11111) ---------->|
      |<-------- ICMP Port unreachable ----------|
      |                                          |

クライアントでtcpdumpを実行します。

[root@client ~]#  tcpdump -i ens33 icmp -nn

サーバでhping3コマンドを実行します。

[root@server ~]# hping3 -I ens33 -1 -c 1 -C 3 -K 3 --icmp-ipproto 17 --icmp-ipsrc 192.168.2.105 --icmp-ipdst 192.168.2.100 --icmp-srcport 22222 --icmp-dstport 11111 192.168.2.105

サーバからクライアントにICMP port unreachableが送信されていることがわかります。

[root@client ~]#  tcpdump -i ens33 icmp -nn
20:46:11.298476 IP 192.168.2.100 > 192.168.2.105: ICMP 192.168.2.100 udp port 11111 unreachable, length 36

7.3 送信元IPアドレスをランダムに選択する方法(--rand-source)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 -p icmp -n -P in

クライアントでhping3コマンドを実行します。

[root@client ~]# hping3 -1 --rand-source 192.168.2.100

サーバでtcpdumpの実行結果を確認します。ICMPパケットの送信元IPアドレスがランダムに選択されていることがわかります。

[root@server ~]# tcpdump -i ens33 -p icmp -n -P in
18:24:05.192516 IP 127.241.73.35 > 192.168.2.100: ICMP echo request, id 58635, seq 0, length 8
18:24:06.193402 IP 195.129.74.247 > 192.168.2.100: ICMP echo request, id 58635, seq 256, length 8
18:24:07.193877 IP 43.100.183.49 > 192.168.2.100: ICMP echo request, id 58635, seq 512, length 8
-snip-

7.4 ICMPパケットのデータサイズを指定する方法(-d)

イーサネットヘッダを含めたICMPパケットの構造は以下のようになります。()内はbyte単位のサイズを表します。-dは、ICMP Headerに続くdata領域のサイズを指定するオプションです。

|<- Ethernet Header(14) ->|<- IP Header(20) ->|<- ICMP Header(8) ->|<- data(d) ->|
+-------------------------+-------------------+--------------------+-------------+
|                         |                   |                    |             |
|                         |                   |                    |             |
+-------------------------+-------------------+--------------------+-------------+

まず、オプションを指定しない場合における、ICMPパケットのサイズを確認してみます。

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-C:ICMPのタイプを表します。8はICMP Echo Requestを表す

[root@client ~]# hping3 -I eth0 -c 1 -C 8 192.168.2.100

サーバでtcpdumpの実行結果を確認します。ICMPのパケット長が8(byte)であることがわかります(★の部分)。つまり、ICMPヘッダのみのパケットです。

[root@server ~]# tcpdump -i ens33 icmp -v
16:04:34.689727 IP (tos 0x0, ttl 64, id 61513, offset 0, flags [none], proto ICMP (1), length 28)
    192.168.2.105 > server: ICMP echo request, id 16139, seq 0, ★length 8
16:04:34.689754 IP (tos 0x0, ttl 64, id 3963, offset 0, flags [none], proto ICMP (1), length 28)
    server > 192.168.2.105: ICMP echo reply, id 16139, seq 0, length 8

次に、ICMPのdata領域のサイズに100を指定してhping3コマンドを実行します。

[root@client ~]# hping3 -I ens33 -c 1 -C 8 -d 100 192.168.2.100

サーバでtcpdumpの実行結果を確認します。ICMPのパケット長が108(byte)になっています(★の部分)。つまり、ICMPヘッダにdata領域のサイズを加えたサイズになっていることがわかります。

[root@server ~]# tcpdump -i ens33 icmp -v
16:09:01.675203 IP (tos 0x0, ttl 64, id 27410, offset 0, flags [none], proto ICMP (1), length 128)
    192.168.2.105 > server: ICMP echo request, id 16907, seq 0, ★length 108
16:09:01.675241 IP (tos 0x0, ttl 64, id 51035, offset 0, flags [none], proto ICMP (1), length 128)
    server > 192.168.2.105: ICMP echo reply, id 16907, seq 0, length 108

8 送信負荷をかける方法

8.1 ICMP echo requestパケットをμ秒間隔で送信する方法(u)

サーバでtcpdumpを実行します。オプションの意味は次のとおりです。
-P:inは受信パケットのみ表示、outは送信パケットのみ表示
-ttt:直前にキャプチャした時刻からの経過時刻の表示

[root@server ~]# tcpdump -i ens33 icmp -P in -ttt -nn

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-1:ICMPパケットを表す
-i:送信間隔を表す。-iに続けてuを指定すると、マイクロ秒単位の送信間隔を表す。本記事では送信間隔に1マイクロ秒を指定する。

[root@client ~]# hping3 -1 -i u1 192.168.2.100

サーバでtcpdumpの実行結果を確認します。ICMP echo requestパケットの受信間隔が、マイクロ秒単位であることがわかります。精度がよくないと思う。

[root@server ~]# tcpdump -i ens33 icmp -P in -ttt -nn
 00:00:00.000000 IP 192.168.2.105 > 192.168.2.100: ICMP echo request, id 17931, seq 0, length 8
 00:00:00.000095 IP 192.168.2.105 > 192.168.2.100: ICMP echo request, id 17931, seq 256, length 8
 00:00:00.000058 IP 192.168.2.105 > 192.168.2.100: ICMP echo request, id 17931, seq 512, length 8
 00:00:00.000582 IP 192.168.2.105 > 192.168.2.100: ICMP echo request, id 17931, seq 768, length 8
 00:00:00.000081 IP 192.168.2.105 > 192.168.2.100: ICMP echo request, id 17931, seq 1024, length 8
-snip-

8.2 UDPパケットをμ秒間隔で送信する方法(u)

サーバでtcpdumpを実行します。

[root@server ~]# tcpdump -i ens33 udp port 11111 -P in -ttt -nn

クライアントでhping3コマンドを実行します。オプションの意味は次のとおりです。
-2:UDPパケットを表す
-i:送信間隔を表す。-iに続けてuを指定すると、マイクロ秒単位の送信間隔を表す。本記事では送信間隔に1マイクロ秒を指定する。

[root@client ~]# hping3 -2 -i ens33 -p 11111 -i u1 192.168.2.100

サーバでtcpdumpの実行結果を確認します。UDPパケットの受信間隔が、マイクロ秒単位であることがわかります。精度がよくないと思う。

[root@server ~]# tcpdump -i ens33 udp -P in -ttt -nn
 00:00:00.000000 IP 192.168.2.105.2789 > 192.168.2.100.11111: UDP, length 0
 00:00:00.000008 IP 192.168.2.105.2790 > 192.168.2.100.11111: UDP, length 0
 00:00:00.000077 IP 192.168.2.105.2791 > 192.168.2.100.11111: UDP, length 0
 00:00:00.000004 IP 192.168.2.105.2792 > 192.168.2.100.11111: UDP, length 0
-snip-

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ