Edited at

iftopコマンドの使い方


1 iftopコマンドとは?

帯域を測定するツールです。

使用している帯域をTCPコネクション単位で確認することができます。

iftopの動作確認をするため、ネットワーク負荷ツール(iperf3)を使います。

iperf3の使い方は、ここを参照ください。


2 環境

VMware Workstation 12 Player上の仮想マシンを使っています。

仮想マシンはサーバとクライアントの2台構成です。

サーバ、クライアントともに下記設定です。


構成

              192.168.0.0/24

client ------------------------ server
.10 .20

[root@server ~]# cat /etc/hosts
192.168.0.10 client
192.168.0.20 server



OS版数

[root@server ~]# cat /etc/redhat-release

CentOS Linux release 7.3.1611 (Core)

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



3 事前準備

iftopパッケージをクライアントにインストールします。

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

[root@client ~]# yum -y install epel-release
[root@client ~]# yum -y install iftop
[root@client ~]# iftop -h
iftop, version 1.0pre4


4 コマンドオプション

[root@client ~]# iftop -h

iftop: display bandwidth usage on an interface by host

Synopsis: iftop -h | [-npblNBP] [-i interface] [-f filter code]
[-F net/mask] [-G net6/mask6]

-h display this message
-n don't do hostname lookups
-N don't convert port numbers to services
-p run in promiscuous mode (show traffic between other
hosts on the same network segment)
-b don't display a bar graph of traffic
-B Display bandwidth in bytes
-i interface listen on named interface
-f filter code use filter code to select packets to count
(default: none, but only IP packets are counted)
-F net/mask show traffic flows in/out of IPv4 network
-G net6/mask6 show traffic flows in/out of IPv6 network
-l display and count link-local IPv6 traffic (default: off)
-P show ports as well as hosts
-m limit sets the upper limit for the bandwidth scale
-c config file specifies an alternative configuration file
-t use text interface without ncurses

Sorting orders:
-o 2s Sort by first column (2s traffic average)
-o 10s Sort by second column (10s traffic average) [default]
-o 40s Sort by third column (40s traffic average)
-o source Sort by source address
-o destination Sort by destination address

The following options are only available in combination with -t
-s num print one single text output afer num seconds, then quit
-L num number of lines to print

iftop, version 1.0pre4
copyright (c) 2002 Paul Warren <pdw@ex-parrot.com> and contributors


5 基本的な使い方

ここでは、textインタフェースを使った例を示します(ncursesは使わない)。

つまり、-tオプションを必ず指定します。

理由は、ncursesを使うと画像のコピペが必要となり、qiita記事の編集が面倒になるからです。


5.1 10Mのデータ送信をした場合

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は10(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 10M

ターミナルをもう1つ開く。以下は、1分経過したときのiftopコマンドの実行結果です。
クライアントからサーバへの帯域が約10(Mbit/s)になっていることがわかります。
[root@client ~]# iftop -i eth0 -t
Listening on eth0
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client => ★9.52Mb ★9.52Mb ★9.54Mb 88.1MB
server <= 16.5Kb 18.9Kb 17.6Kb 169KB
2 client => 7.62Kb 7.25Kb 8.58Kb 81.0KB
192.168.0.3 <= 480b 480b 526b 4.66KB


5.2 40Mのデータ送信をした場合

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は40(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 40M

ターミナルをもう1つ開く。以下は、1分経過したときのiftopコマンドの実行結果です。
クライアントからサーバへの帯域が約38(Mbit/s)になっていることがわかります。
[root@client ~]# iftop -i eth0 -t
Listening on eth0
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client => ★38.9Mb ★38.1Mb ★38.2Mb 829MB
server <= 49.6Kb 38.9Kb 34.7Kb 718KB
2 client => 7.84Kb 7.99Kb 8.45Kb 282KB
192.168.0.3 <= 480b 480b 507b 17.8KB


6 ホスト名をIPアドレスで表示する方法(-n)

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は40(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 40M

ターミナルをもう1つ開く。ホスト名がIPアドレスで表示されていることがわかる。
[root@client ~]# iftop -i eth0 -t -n
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 192.168.0.10 => 39.5Mb 37.3Mb 37.3Mb 37.3MB
192.168.0.20 <= 30.1Kb 25.1Kb 25.1Kb 25.1KB
2 192.168.0.10 => 7.84Kb 6.28Kb 6.28Kb 6.28KB
192.168.0.3 <= 480b 480b 480b 480B
3 192.168.0.10 => 0b 76b 76b 76B
203.112.17.81 <= 0b 76b 76b 76B


7 ポート番号を数値で表示する方法(-P)

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は40(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 20M

ターミナルをもう1つ開く。ポート番号が数値で表示されていることがわかる。
[root@client ~]# iftop -i eth0 -t -NP
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client:35534 => 38.0Mb 38.1Mb 38.2Mb 397MB
server:5201 <= 28.8Kb 39.7Kb 33.9Kb 395KB
2 client:22 => 7.81Kb 7.69Kb 7.20Kb 87.8KB
192.168.0.3:50236 <= 704b 269b 187b 1.91KB


8 filter codeの使い方(-f)

filter codeを使うと、特定のコネクションの帯域を表示することができます。


8.1 宛先ポート番号で絞り込む方法

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は20(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 20M

ターミナルをもう1つ開く。宛先ポート番号が5201(★)の情報だけが表示されていることがわかる。
[root@client ~]# iftop -i eth0 -t -NP -f "dst port 5201"
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client:35542 => 19.0Mb 19.1Mb 18.1Mb 40.8MB
server:5201★ <= 0b 0b 0b 0B


8.2 宛先IPアドレスで絞り込む方法

サーバでiperf3を起動する。

[root@server ~]# iperf3 -s

クライアントでiperf3を起動する。テスト時間は600秒、帯域は20(Mbit/s)を指定する。
[root@client ~]# iperf3 -c server -t 600 -b 20M

ターミナルをもう1つ開く。宛先IPアドレスが"192.168.0.20"(★)の情報だけが表示されていることがわかる。
[root@client ~]# iftop -i eth0 -t -n -NP -f "dst host 192.168.0.20"
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 192.168.0.10:35542 => 19.0Mb 19.1Mb 18.2Mb 31.8MB
★192.168.0.20:5201 <= 0b 0b 0b 0B


9 実行回数を指定する方法(-s)

指定した回数実行をしたら、そこで結果を表示して終了します。

実行回数を5回に指定する。

[root@client ~]# iftop -i eth0 -t -s 5
interface: eth0
IP address is: 192.168.0.10
MAC address is: 00:0c:29:cb:56:83
Listening on eth0
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client => 19.0Mb 16.9Mb 16.9Mb 12.6MB
server <= 62.0Kb 35.2Kb 35.2Kb 26.4KB
2 255.255.255.255 => 0b 0b 0b 0B
gateway <= 2.25Kb 2.25Kb 2.25Kb 1.69KB
3 client => 1.69Kb 1.60Kb 1.60Kb 1.20KB
192.168.0.3 <= 320b 373b 373b 280B
4 client => 0b 467b 467b 350B
local.gateway <= 0b 896b 896b 672B
5 255.255.255.255 => 0b 0b 0b 0B
0.0.0.0 <= 1.28Kb 1.28Kb 1.28Kb 984B
--------------------------------------------------------------------------------------------
Total send rate: 19.0Mb 16.9Mb 16.9Mb
Total receive rate: 65.8Kb 40.0Kb 40.0Kb
Total send and receive rate: 19.1Mb 16.9Mb 16.9Mb
--------------------------------------------------------------------------------------------
Peak rate (sent/received/total): 19.5Mb 65.8Kb 19.6Mb
Cumulative (sent/received/total): 12.6MB 30.0KB 12.7MB
============================================================================================


10 表示する行数を指定する方法(-l)

[root@client ~]# iftop -i eth0 -t -L 1

# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client => 19.0Mb 14.8Mb 14.8Mb 7.38MB
server <= 16.9Kb 12.4Kb 12.4Kb 6.20KB


11 複数TCPコネクションの帯域確認

ここでは、iperf3でTCPコネクション2つを作成します。

そして、各コネクションで20(Mbit/s),40(Mbit/s)の帯域を使います。

このときの状態をiftopコマンドを使って確認してみます。


11.1 iperf3起動(サーバ側)

iperf3をデーモンモードで起動する。Listenするポート番号は11111,11112の2つ生成する。

[root@server ~]# iperf3 -s -D -p 11111
[root@server ~]# iperf3 -s -D -p 11112

11111,11112番ポートへのアクセスを許可する。
[root@server ~]# firewall-cmd --add-port=11111/tcp
success
[root@server ~]# firewall-cmd --add-port=11112/tcp
success

プロセスの状態を確認する。
[root@server ~]# ps -C iperf3 -o comm,pid
COMMAND PID
iperf3 1203
iperf3 1205


11.2 iperf3起動(クライアント側)

サーバの11111番ポートにデータを送信する。帯域は20(Mbit/s)、テスト時間は600秒を指定する。

[root@client ~]# iperf3 -c server -p 11111 -t 600 -b 20M

サーバの11112番ポートにデータを送信する。帯域は40(Mbit/s)、テスト時間は600秒を指定する。
[root@client ~]# iperf3 -c server -p 11112 -t 600 -b 40M


11.3 使用帯域の確認

11111番ポート向きの帯域は約19(Mbit/s)、11112番ポート向きの帯域は約38(Mbit/s)使用していることがわかる。

[root@client ~]# iftop -i eth0 -t -NP -o 2s -L 2
# Host name (port/service if enabled) last 2s last 10s last 40s cumulative
--------------------------------------------------------------------------------------------
1 client:51998 => 38.0Mb 38.1Mb 36.7Mb 110MB
server:11112 <= 17.3Kb 21.9Kb 26.3Kb 78.9KB
2 client:51662 => 19.0Mb 19.0Mb 18.4Mb 55.3MB
server:11111 <= 38.6Kb 27.9Kb 28.8Kb 86.3KB