- 1 hping3コマンドとは?
- 2 検証環境
- 3 事前準備
- 4 オプション一覧
- 5 TCPに関するオプションの使い方
- 6 IPに関するオプションの使い方
- 7 ICMPに関するオプションの使い方
- 8 送信負荷をかける方法
- Z 参考情報
1 hping3コマンドとは?
任意のTCP/IPパケットを作成して送信することができるコマンドです。
2 検証環境
2.1 ネットワーク構成
サーバとクライアントの2台構成です。図中のens33はNICの名前です。クライアントでhping3コマンドを実行し、サーバでhping3が送信するパケットを確認します。
192.168.2.0/24 client(ens33) ------------------------------------------(ens33) server .105 .100
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技術ブログ