送信元/宛先ポートを指定した通信テストの必要性
一例として、ネットワーク設計・構築案件において NAPT 機能を使用するルータを扱う場合、NAPT の動作試験を実施する必要があります。
NAPT の動作試験では、実際に対象の TCP/UDP 通信を発生させて想定通りにルータで NAPT されていることを確認する必要があります。
よって、端末間で任意に送信元ポート及び宛先ポートを指定した TCP/UDP 通信を発生させる手段が必要になります。
送信元ポートを指定できるツールが少ない
宛先ポートを指定する手段としては Telnet で宛先ポートを指定したり、Nana を使用したりなど、いくつかの手段が容易に見つかります。
しかし、送信元ポートを指定して TCP/UDP 通信を発生させるツールを見つけるのは簡単ではありません。大体のツールでは送信元ポートは空きポートの中からランダムで選定され、送信元ポートを指定することはできません。
iPerf3 では送信元ポートを指定可能
今回紹介するツールは iPerf3 というツールです。
iPerf3 は本来スループットテストを行うためのツールですが、送信元/宛先ポートを指定することができるため、送信元/宛先ポートを指定した通信テストのために使用することができます。
iPerf3 には Windows 版及び Linux 版があり、Linux 版(特に Ubuntu 版)に関してはより新しいバージョンがリリースされていますが、Windows 版のバージョン 3.1.x 以降でも送信元ポートを指定することが可能です。よって Windows 版の最新バージョンを使用することが最も手軽です。
Windows 版 iPerf3 利用イメージ
Windows 版の iPerf3 はインストールせずにコマンドプロンプトから実行できる実行ファイル形式になっています。
クライアント役及びサーバ役の端末それぞれに iPerf3 のファイルを格納し、コマンドを実行することで通信テストを実施します。

iPerf3 使用方法
iPerf3 のダウンロード
こちらのページから iPerf3 をダウンロードします。
現時点の Windows 版の最新バージョンは 3.1.3 です。iPerf 3.1.3 のリンクをクリックするとダウンロードできます。
※下画像は Windows 64 ビット版向けの iPerf 3.1.3 をダウンロードする場合

ダウンロードした .zip を解凍すると中身は以下のようになっています。

これらをフォルダごと任意の場所に格納します。
iPerf3 の実行方法
コマンドプロンプトを開き、カレントディレクトリを iperf3.exe が保存されているフォルダに変更します。その後、iPerf3 のコマンドを実行します。
以下では、クライアント端末では指定した送信元ポートで指定した宛先ポートに通信を行い、サーバ端末では指定したポートで通信を受け付けるためのコマンド実行方法について記載します。
サーバ側のコマンド
サーバでのコマンド構文は以下です。
iperf3 -s -p <待ち受けポート番号>
-s
: サーバモードで実行することを意味します-p
: 待ち受けポート番号を指定するオプション。指定しない場合は 5201 が使用される
クライアント側のコマンド
クライアントでのコマンド構文は以下です。
iperf3 -c <宛先IPアドレス> -p <宛先ポート番号> -B <送信元IPアドレス> --cport <送信元ポート番号> [-u]
-c
: クライアントモードで実行することを意味し、同時に宛先サーバの IP アドレスを指定する-p
: 宛先のポート番号を指定するオプション。指定しない場合は 5201 が使用される-B(--bind)
: 自身の送信元 IP アドレスを指定するオプション。--cport
オプションを使用するためには-B
の指定は必須--cport
: 送信元ポート番号を指定するオプション-u
: 指定すると UDP 通信を行う。これを指定しない場合は TCP 通信を行う
iPerf3 実行例
以下の構成で iPerf3 を実行してみます。

まずサーバ側でコマンドを実行します。
>iperf3 -s -p 4321
-----------------------------------------------------------
Server listening on 4321
-----------------------------------------------------------
上のように指定したポート 4321 で待受ける状態になります。
次にクライアントでコマンドを実行します。
>iperf3 -c 192.168.75.1 -p 4321 -B 192.168.75.160 --cport 12345
Connecting to host 192.168.75.1, port 4321
[ 4] local 192.168.75.160 port 12345 connected to 192.168.75.1 port 4321
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 142 MBytes 1.19 Gbits/sec
[ 4] 1.00-2.00 sec 148 MBytes 1.25 Gbits/sec
[ 4] 2.00-3.00 sec 180 MBytes 1.51 Gbits/sec
[ 4] 3.00-4.00 sec 191 MBytes 1.60 Gbits/sec
[ 4] 4.00-5.00 sec 194 MBytes 1.62 Gbits/sec
[ 4] 5.00-6.00 sec 170 MBytes 1.42 Gbits/sec
[ 4] 6.00-7.00 sec 199 MBytes 1.67 Gbits/sec
[ 4] 7.00-8.01 sec 148 MBytes 1.23 Gbits/sec
[ 4] 8.01-9.00 sec 202 MBytes 1.70 Gbits/sec
[ 4] 9.00-10.00 sec 222 MBytes 1.87 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 1.75 GBytes 1.51 Gbits/sec sender
[ 4] 0.00-10.00 sec 1.75 GBytes 1.51 Gbits/sec receiver
iperf Done.
上のようにスループットテストの結果が表示されます。
このときサーバ側では以下のように表示されます。
-----------------------------------------------------------
Server listening on 4321
-----------------------------------------------------------
Accepted connection from 192.168.75.160, port 65446
[ 5] local 192.168.75.1 port 4321 connected to 192.168.75.160 port 12345
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 141 MBytes 1.18 Gbits/sec
[ 5] 1.00-2.00 sec 143 MBytes 1.20 Gbits/sec
[ 5] 2.00-3.00 sec 179 MBytes 1.50 Gbits/sec
[ 5] 3.00-4.00 sec 191 MBytes 1.60 Gbits/sec
[ 5] 4.00-5.00 sec 194 MBytes 1.63 Gbits/sec
[ 5] 5.00-6.00 sec 169 MBytes 1.42 Gbits/sec
[ 5] 6.00-7.00 sec 200 MBytes 1.68 Gbits/sec
[ 5] 7.00-8.01 sec 152 MBytes 1.26 Gbits/sec
[ 5] 8.01-9.00 sec 196 MBytes 1.67 Gbits/sec
[ 5] 9.00-10.00 sec 222 MBytes 1.86 Gbits/sec
[ 5] 10.00-10.04 sec 8.36 MBytes 1.66 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-10.04 sec 0.00 Bytes 0.00 bits/sec sender
[ 5] 0.00-10.04 sec 1.75 GBytes 1.50 Gbits/sec receiver
サーバ側ログの以下の表示から、サーバ側及びクライアント側のポートが指定した番号になっていることが分かります。
[ 5] local 192.168.75.1 port 4321 connected to 192.168.75.160 port 12345
iPerf3 クライアントの送信パケット数を指定する【-k オプション】
iPerf3 はスループットテストをするためのツールであり、デフォルトでは 10 秒間通信を発生させます。ログとしては 1 秒ごとのスループットが表示されます。
ただ、単に指定した送信元/宛先ポートの通信を発生させることが目的の場合はここまで長く通信させる必要が無い場合もあります。
iPerf3 クライアントのコマンドのオプションである -k
オプションを使用すると、指定した数のパケットを送信したら通信を終了させることができます。
例えば、5パケットだけ送信したら通信を終了させたい場合は -k 5
と指定します。
>iperf3 -c 192.168.75.1 -p 4321 -B 192.168.75.160 --cport 12345 -k 5
Connecting to host 192.168.75.1, port 4321
[ 4] local 192.168.75.160 port 12345 connected to 192.168.75.1 port 4321
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.00 sec 256 KBytes 3.93 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.00 sec 256 KBytes 3.93 Gbits/sec sender
[ 4] 0.00-0.00 sec 18.5 KBytes 285 Mbits/sec receiver
iperf Done.
iPerf3 クライアントの送信秒数を指定する【-t オプション】
iPerf3 ではデフォルトで 10 秒間通信を発生させますが、-t オプションを使用することでこの送信秒数を変更することができます。例えば 5 秒間に変更したい場合は -t 5
と指定します。
>iperf3 -c 192.168.75.1 -p 4321 -B 192.168.75.160 --cport 12345 -t 5
Connecting to host 192.168.75.1, port 4321
[ 4] local 192.168.75.160 port 12345 connected to 192.168.75.1 port 4321
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 152 MBytes 1.27 Gbits/sec
[ 4] 1.00-2.00 sec 145 MBytes 1.22 Gbits/sec
[ 4] 2.00-3.00 sec 225 MBytes 1.89 Gbits/sec
[ 4] 3.00-4.00 sec 224 MBytes 1.88 Gbits/sec
[ 4] 4.00-5.00 sec 201 MBytes 1.69 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-5.00 sec 948 MBytes 1.59 Gbits/sec sender
[ 4] 0.00-5.00 sec 948 MBytes 1.59 Gbits/sec receiver
iperf Done.
留意点
- クライアントの送信元ポートを指定する
--cport
オプションは iPerf3 バージョン 3.1 から追加されたオプションです。--cport
オプションを使用するためには同時に-B
(--bind
) オプションを使用する必要があります --cport
オプション使用した場合でも、最初はランダムな送信元ポートを使用してクライアントとサーバ間で通信がされます。その通信が確立できた後で、クライアントから--cport
オプションで指定した送信元ポートを使用した通信が実施されます。ランダムな送信元ポートを使用した通信が確立できない場合は--cport
オプションで指定した送信元ポートを使用した通信は発生しないため注意してください