初老のボケ防止日記

おっさんのひとりごとだから気にしないようにな。

スポンサーリンク

NATの内側にいるクライアントのダウンリンクの測定がしたい



やりたいことは単純で、NATの内側にいるクライアントのTCPのダウンリンクの速度を計測したい。ただそれだけの記事。

環境

機材 OS ネットワーク 備考
PC1 Ubuntu 14.04 グローバル サーバ
PC2 Ubuntu 14.04 プライベート クライアント

PC2はNATを介してPC1とTCP通信はできる状態。この環境で、PC2をクライアント、PC1をサーバとした場合のスループットの計測をしたい。ということで、ネットワーク関係の人は御用達のiperfを使ってみた。この時使ったiperfはapt-getでとってきた公式リポジトリのもの。バージョンは「2.0.5」。
クライアントからサーバへのTCP通信、つまりプライベートからグローバルへのアップリンクはNATを越えて測定できるのだけど、サーバからクライアントへのTCP通信、グローバルからプライベートへのダウンリンクはNATを越えて測定できなかった*1

ということで、以下の記事を参考に色々と試した。

sourceforge.jp

nepim

nepim - network pipemeter

インストール

aptにバイナリがないのでしょうがないソースからビルド。ビルド環境「build-essential」はインストール済みの前提。

$ sudo apt-get install liboop-dev
$ wget http://download.savannah.gnu.org/releases/nepim/nepim-0.53.tar.gz
$ tar xvf nepim-0.53.tar.gz
$ cd nepim-0.53/src/
nepim-0.53/src$ vi Makefile

READMEに従ってMakefileを変更してもリンクで失敗するのでこんな感じで修正。

--- Makefile.org 2015-04-16 21:57:21.001643492 +0900
+++ Makefile     2015-04-16 21:57:53.493625135 +0900
@@ -105,4 +105,4 @@
 build: clean default

 $(TARGET): $(OBJ)
-       $(CC) $(LDFLAGS) -o $@ $^
+       $(CC) -o $@ $^ -ldl -loop
nepim-0.53/src$ make
nepim-0.53/src$ sudo cp nepim /usr/local/bin/.

使い方

manはないのでこれがすべて。

$ nepim -h
サーバの起動
$ nepim
クライアントの起動

測定対象がダウンリンクかアップリンクかで引数が異なる。

  • ダウンリンク測定
$ nepim -c <サーバのIPアドレス>
  • アップリンク測定
$ nepim -c <サーバのIPアドレス> -s

使ってみる

ダウンリンク測定
$ nepim -c xxx.xxx.xxx.xxx
nepim - network pipemeter - version 0.53
client: tcp_read=32768 tcp_write=32768 write_floor=32768 write_ceil=32768 step=1
not a UNIX domain path: xxx.xxx.xxx.xxx: errno=2: No such file or directory
TCP socket solving xxx.xxx.xxx.xxx,1234
TCP socket trying xxx.xxx.xxx.xxx,1234
3: TCP socket connected to xxx.xxx.xxx.xxx,1234
3: sending: hello server_send=1 bit_rate=-1 pkt_rate=-1 stat_interval=2 test_duration=10 write_delay=250000 server_ka_send=0 server_ka_req=0 server_ka_tmout=20000000 server_ka_delay=10000000 seed=0x9974a21f verify_data=0 random_fill=1 fill_byte=0x00 pause_duration=0 sock_ka=1 nagle=-1 overhead=0 sweep_random=0 sweep_step=1 write_floor=-1 write_ceil=-1 partial_minmax=0 mss=-1 password=
3: greetings sent to xxx.xxx.xxx.xxx,1234
3: pmtud_mode=1 path_mtu=1500 mss=524 tos=0 ttl=64 mcast_ttl=1 win_recv=369280 win_send=46080 sock_ka=1 nodelay=0
                 kbps_in   kbps_out    rcv/s    snd/s
  3 cur     8   96785.97       0.00  1103.00     0.00
  3 cur     6   87049.41       0.00  1186.00     0.00
  3 cur     4   86712.21       0.00  1219.00     0.00
  3 cur     2   86507.67       0.00   718.00     0.00
  3 avg     0   88908.27       0.00  1071.50     0.00
  3 min     0   86507.67       0.00   718.00     0.00
  3 max     0   96785.97       0.00  1219.00     0.00
3: pmtud_mode=1 path_mtu=1500 mss=524 tos=0 ttl=64 mcast_ttl=1 win_recv=6291456 win_send=92160 sock_ka=1 nodelay=0
nepim: no event sink registered
nepim: done
アップリンク測定
$ nepim -c xxx.xxx.xxx.xxx -s
nepim - network pipemeter - version 0.53
client: tcp_read=32768 tcp_write=32768 write_floor=32768 write_ceil=32768 step=1
not a UNIX domain path: xxx.xxx.xxx.xxx: errno=2: No such file or directory
TCP socket solving xxx.xxx.xxx.xxx,1234
TCP socket trying xxx.xxx.xxx.xxx,1234
3: TCP socket connected to xxx.xxx.xxx.xxx,1234
3: sending: hello server_send=0 bit_rate=-1 pkt_rate=-1 stat_interval=2 test_duration=10 write_delay=250000 server_ka_send=0 server_ka_req=0 server_ka_tmout=20000000 server_ka_delay=10000000 seed=0x4ab6f202 verify_data=0 random_fill=1 fill_byte=0x00 pause_duration=0 sock_ka=1 nagle=-1 overhead=0 sweep_random=0 sweep_step=1 write_floor=-1 write_ceil=-1 partial_minmax=0 mss=-1 password=
3: greetings sent to xxx.xxx.xxx.xxx,1234
3: pmtud_mode=1 path_mtu=1500 mss=524 tos=0 ttl=64 mcast_ttl=1 win_recv=369280 win_send=46080 sock_ka=1 nodelay=0
                 kbps_in   kbps_out    rcv/s    snd/s
  3 cur     8       0.00  106143.88     0.00   405.50
  3 cur     6       0.00   84410.37     0.00   322.00
  3 cur     4       0.00   89915.39     0.00   343.00
  3 cur     2       0.00   87818.24     0.00   335.00
  3 avg     0       0.00   91116.37     0.00   347.70
  3 min     0       0.00   84410.37     0.00   322.00
  3 max     0       0.00  106143.88     0.00   405.50
3: pmtud_mode=1 path_mtu=1500 mss=524 tos=0 ttl=64 mcast_ttl=1 win_recv=738560 win_send=4194304 sock_ka=1 nodelay=0
nepim: no event sink registered
nepim: done

configureが用意されてないのでソースビルドで難儀したけど、ちゃんとNAT越えのダウンリンクは測定できている。でもマイナーな感じなのでこれで測定しても"そのツールが正しいのか"という目で見られる可能性は否定できない。
なお、他の測定の時もそうだけど、ダウンリンクとアップリンクの結果が似通っているので以下のツールでトラフィックがちゃんとダウンリンクになってるかの確認は行っている。

iftop: display bandwidth usage on an interface

nuttcp

http://nuttcp.net/

インストール

こちらはaptでインストールできた。でも少しバージョンが古いので最新版が欲しければソースビルドしよう。

$ sudo apt-get install nuttcp

使い方

manもあるので親切。

$ nuttcp -h
$ man nuttcp
サーバの起動

デフォルトだとforkしてしまうのでkillが面倒くさい。なので、ここではforkしないオプションを指定している。

$ nuttcp -S --nofork
クライアントの起動

測定対象ダウンリンクかアップリンクかで引数が異なる。

  • ダウンリンク測定
$ nuttcp -r -F -i1 <サーバのIPアドレス>

NAT越えするには「-F」をつける。

  • アップリンク測定
$ nuttcp -t -i1 <サーバのIPアドレス>

使ってみる

  • ダウンリンク測定
$ nuttcp -r -F -i1 xxx.xxx.xxx.xxx
   13.4375 MB /   1.00 sec =  112.7159 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0342 Mbps     0 retrans
   10.4375 MB /   1.00 sec =   87.5560 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0309 Mbps     0 retrans
   10.4375 MB /   1.00 sec =   87.5556 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0305 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0261 Mbps     0 retrans
   10.4375 MB /   1.00 sec =   87.5649 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0319 Mbps     0 retrans
   10.3125 MB /   1.00 sec =   86.5054 Mbps     0 retrans

  107.9568 MB /  10.09 sec =   89.7431 Mbps 1 %TX 13 %RX 0 retrans 5.15 msRTT
  • アップリンク測定
$ nuttcp -t -i1 xxx.xxx.xxx.xxx
   13.5000 MB /   1.00 sec =  113.2420 Mbps     0 retrans
   10.4375 MB /   1.00 sec =   87.5575 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0284 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0276 Mbps     0 retrans
   10.3125 MB /   1.00 sec =   86.5077 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0308 Mbps     0 retrans
   10.4375 MB /   1.00 sec =   87.5645 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0241 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0322 Mbps     0 retrans
   10.3750 MB /   1.00 sec =   87.0345 Mbps     0 retrans

  108.1875 MB /  10.13 sec =   89.6219 Mbps 3 %TX 10 %RX 0 retrans 5.35 msRTT

aptで入れられるのでお気軽。iperf2よりも色々とできそう。

iperf3

iperf3 — iperf3 3.0.11 documentation

インストール

iperf3なんてあったなんて知らなかったぜ…。という存在感なので当然ながらソースからビルド。

$ git clone https://github.com/esnet/iperf
$ cd iperf/
$ ./configure
$ make
$ sudo make install
$ sudo ldconfig

使い方

基本はiperf2を踏襲してる感じ。

$ iperf3 -h
$ man iperf3
サーバの起動

iperf2と同じ。

$ iperf3 -s
クライアントの起動

測定対象がダウンリンクかアップリンクかで引数が異なる。

  • ダウンリンク測定
$ iperf3 -c <サーバのIPアドレス> -R

ダウンリンクは「-R」をつける。

  • アップリンク測定
$ iperf3 -c <サーバのIPアドレス>

使ってみる

  • ダウンリンク測定
$ iperf3 -c xxx.xxx.xxx.xxx -R
Connecting to host xxx.xxx.xxx.xxx, port 5201
Reverse mode, remote host xxx.xxx.xxx.xxx is sending
[  4] local xxx.xxx.xxx.xxx port 58021 connected to xxx.xxx.xxx.xxx port 5201
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  13.8 MBytes   116 Mbits/sec
[  4]   1.00-2.00   sec  10.4 MBytes  87.2 Mbits/sec
[  4]   2.00-3.00   sec  10.3 MBytes  86.1 Mbits/sec
[  4]   3.00-4.00   sec  10.4 MBytes  87.6 Mbits/sec
[  4]   4.00-5.00   sec  10.4 MBytes  87.1 Mbits/sec
[  4]   5.00-6.00   sec  10.3 MBytes  86.8 Mbits/sec
[  4]   6.00-7.00   sec  10.3 MBytes  86.7 Mbits/sec
[  4]   7.00-8.00   sec  10.4 MBytes  87.4 Mbits/sec
[  4]   8.00-9.00   sec  10.3 MBytes  86.5 Mbits/sec
[  4]   9.00-10.00  sec  10.4 MBytes  87.5 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   108 MBytes  90.7 Mbits/sec    0   sender
[  4]   0.00-10.00  sec   107 MBytes  90.0 Mbits/sec        receiver

iperf Done.
  • アップリンク測定
$ iperf3 -c xxx.xxx.xxx.xxx
Connecting to host xxx.xxx.xxx.xxx, port 5201
[  4] local xxx.xxx.xxx.xxx port 58026 connected to xxx.xxx.xxx.xxx port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  14.9 MBytes   125 Mbits/sec    0   5.12 KBytes
[  4]   1.00-2.00   sec  10.7 MBytes  89.6 Mbits/sec    0   5.12 KBytes
[  4]   2.00-3.00   sec  10.3 MBytes  86.0 Mbits/sec    0   5.12 KBytes
[  4]   3.00-4.00   sec  10.3 MBytes  86.4 Mbits/sec    0   5.12 KBytes
[  4]   4.00-5.00   sec  10.4 MBytes  87.1 Mbits/sec    0   5.12 KBytes
[  4]   5.00-6.00   sec  10.4 MBytes  87.5 Mbits/sec    0   5.12 KBytes
[  4]   6.00-7.00   sec  10.2 MBytes  85.8 Mbits/sec    0   5.12 KBytes
[  4]   7.00-8.00   sec  10.8 MBytes  90.8 Mbits/sec    0   5.12 KBytes
[  4]   8.00-9.00   sec  10.1 MBytes  84.3 Mbits/sec    0   5.12 KBytes
[  4]   9.00-10.00  sec  10.6 MBytes  89.2 Mbits/sec    0   5.12 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   109 MBytes  91.2 Mbits/sec    0   sender
[  4]   0.00-10.00  sec   107 MBytes  90.0 Mbits/sec        receiver

iperf Done.

iperf2よりもかなり高機能になっている模様。なんだかんだiperfはメジャーなのでiperf3を使っておくのが安心かもしれない*2。ネットワーク測定ツールってそんなに数がないし開発が活発ではないので、こういうのがあるというのを覚えておくとなにか特殊な測定をしたいときに便利かもしれない。

インフラエンジニア教本 ~ネットワーク構築技術解説 (Software Design 別冊)

インフラエンジニア教本 ~ネットワーク構築技術解説 (Software Design 別冊)

恋のダウンロード

恋のダウンロード

天城越え/裏町夫婦草

天城越え/裏町夫婦草

*1:実は最新版のiperf3を使えば解決するんだけど、この時はまだ気付いてなかったの

*2:あとでデータとり直しとか言われても嫌だし

スポンサーリンク