hana_shinのLinux技術ブログ

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

arpingコマンドの使い方



1 arpingコマンドとは?

ARPパケットの送信したり、IPアドレスの重複検出に使います。

2 検証環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。上がIPアドレス、下がMACアドレスを表しています。

                          192.168.122.0/24
            .181                                        .216
client(eth0) --------------------------------------------(eth0) server
    52:54:00:d0:e3:a7                           52:54:00:6f:b0:ca

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

arpingコマンドの版数は以下のとおりです。

[root@client ~]# arping -V
arping utility, iputils-s20160308

3 オプション一覧

オプションは以下のとおりです。

[root@client ~]# arping -h
Usage: arping [-fqbDUAV] [-c count] [-w timeout] [-I device] [-s source] destination
  -f : quit on first reply
  -q : be quiet
  -b : keep broadcasting, don't go unicast
  -D : duplicate address detection mode
  -U : Unsolicited ARP mode, update your neighbours
  -A : ARP answer mode, update your neighbours
  -V : print version and exit
  -c count : how many packets to send
  -w timeout : how long to wait for a reply
  -I device : which ethernet device to use
  -s source : source ip address
  destination : ask for what ip address

-D,-U,-AのOpcode、用途を以下に示します。()内はOpcodeの値です。

オプション Opcode 用途 備考
-D ARP要求(1) IPアドレスの重複検出をおこなう 送信者IPアドレスが0.0.0.0のARP probeパケットを送信する
-U ARP要求(1) 他ホストのARPテーブル更新をおこなう
-A ARP応答(2) 他ホストのARPテーブル更新をおこなう。冗長構成のシステムでmaster/backupサーバの切替時に使う

4 書式

arpingコマンドの書式は以下になります。

arping [オプション] 問い合わせ対象のIPアドレス

5 送信インタフェースを指定する方法(-I)

-Iは、ARPパケットの送信インタフェースを指定するオプションです。

クライアントのeth0からARPパケットをサーバに送信してみます。そして、サーバのeth0のIPアドレス(192.168.122.216)に対するMACアドレスを確認してみます。192.168.122.216に対するMACアドレスは、52:54:00:6F:B0:CAであることがわかります。

[root@client ~]# arping -I eth0 192.168.122.216
ARPING 192.168.122.216 from 192.168.122.181 eth0
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.905ms
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.494ms
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.365ms
^CSent 3 probes (1 broadcast(s))
Received 3 response(s)

6 ARPパケットの送信回数を指定する方法(-c)

-cは、ARPパケットの送信回数を指定するオプションです。ここでは、ARPパケットを1つ送信してみます。

[root@client ~]# arping -c 1 -I eth0 192.168.122.216
ARPING 192.168.122.216 from 192.168.122.181 eth0
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.595ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s)

arpingコマンドを実行すると、クライアントからサーバにARP requestパケットが送信されます。そして、その応答として、サーバからクライアントにARP replyパケットが送信されます。このときのWiresharkの実行結果を以下に示します。
ARP requestパケット送信時

ARP replyパケット送信時

7 重複検出(-D)

7.1 同じIPアドレスを持ったホストが同一LAN上に存在する場合

192.168.122.216が同一LAN上に存在するかどうかを確認します。応答があることから(★印)、同一LAN上に192.168.122.216が存在することがわかります。

[root@client ~]# arping -D -c 1 -I eth0 192.168.122.216
ARPING 192.168.122.216 from 0.0.0.0 eth0
Unicast reply from 192.168.122.216 [52:54:00:6F:B0:CA]  1.310ms
Sent 1 probes (1 broadcast(s))
Received 1 response(s) ★

7.2 同じIPアドレスを持ったホストが同一LAN上に存在しない場合

192.168.122.100が同一LAN上に存在するかどうかを確認します。応答がないことから(★印)、同一LAN上に192.168.122.100が存在しないことがわかります。

[root@client ~]# arping -D -c 1 -I eth0 192.168.122.100
ARPING 192.168.122.100 from 0.0.0.0 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s) ★

8 隣接ホストのARPテーブルを更新する方法(-U)

-Uは、Opcodeにrequest(1)を設定して、GARP(Gratuitous ARP)パケットを送信するオプションです。

8.1 ARPテーブル更新のタイミング

通常は以下のように、ARP requestに対してARP replyを受信することでARPテーブルを更新します。

client                                       server
   | IP=x.x.x.x                                 |
   | MAC=yy:yy:yy:yy:yy:yy                      |
   |                                            | ARPテーブル
   |                                            | +-----------------------------+
   |                                            | |    IP   |        MAC        |
   |                                            | +---------+-------------------+
   |                                            | |         |                   |
   |                                            | +-----------------------------+
   |<------------- ARP request -----------------|
   |-------------- ARP reply ------------------>| ARPテーブル更新
   |                                            |
   |                                            | ARPテーブル
   |                                            | +-----------------------------+
   |                                            | |    IP   |        MAC        |
   |                                            | +---------+-------------------+
   |                                            | | x.x.x.x | yy:yy:yy:yy:yy:yy |
   |                                            | +-----------------------------+
   |                                            |

arpingコマンドを使うと、以下のようにしてARPテーブルを更新することができます。

               client                    server
                  | IP=x.x.x.x              |
                  | MAC=yy:yy:yy:yy:yy:yy   | ARPテーブル
                  |                         | +-----------------------------+
                  |                         | |    IP   |        MAC        |
                  |                         | +---------+-------------------+
                  |                         | |         |                   |
                  |                         | +-----------------------------+
                  |                         |
arping -U x.x.x.x |---------- GARP -------->| ARPテーブル更新
                  |       (ARP request)     |
                  |                         | ARPテーブル
                  |                         | +-----------------------------+
                  |                         | |    IP   |        MAC        |
                  |                         | +---------+-------------------+
                  |                         | | x.x.x.x | yy:yy:yy:yy:yy:yy |
                  |                         | +-----------------------------+
                  |                         |

8.2 ARPテーブル更新のための設定

GARPパケット受信時にARPテーブルを更新するためには、arp_acceptを1にする必要があります。arp_acceptについて、ip-sysctl.txtより抜粋したものを以下に示します。

arp_accept - BOOLEAN
    Define behavior for gratuitous ARP frames who's IP is not
    already present in the ARP table:
    0 - don't create new entries in the ARP table
    1 - create new entries in the ARP table

    Both replies and requests type gratuitous arp will trigger the
    ARP table to be updated, if this setting is on.

    If the ARP table already contains the IP address of the
    gratuitous arp frame, the arp table will be updated regardless
    if this setting is on or off.

デフォルトは、以下のように0です。

[root@server ~]# sysctl -n net.ipv4.conf.eth0.arp_accept
0

8.3 動作確認

arp_acceptに1を設定します。

[root@server ~]# sysctl -w net.ipv4.conf.eth0.arp_accept=1
net.ipv4.conf.eth0.arp_accept = 1

ARPテーブルを確認します。

[root@server ~]# ip n
192.168.122.1 dev eth0 lladdr 52:54:00:80:1d:d6 REACHABLE

arpingコマンドを実行します。

[root@client ~]# arping -U -c 1 -I eth0 192.168.122.181
ARPING 192.168.122.181 from 192.168.122.181 eth0
Sent 1 probes (1 broadcast(s))
Received 0 response(s)

ARPテーブルを確認します。クライアントのARPエントリ(IPアドレスMACアドレスの組)が追加されたことがわかります。

[root@server ~]# ip n
192.168.122.1 dev eth0 lladdr 52:54:00:80:1d:d6 REACHABLE
192.168.122.181 dev eth0 lladdr 52:54:00:d0:e3:a7 STALE

arpingコマンド実行時のWiresharkの実行結果を以下に示します。

9 隣接ホストのARPテーブルを更新する方法(-A)

-Aは、Opcodeにreply(2)を設定して、GARPパケットを送信するオプションです。

9.1 ARPテーブル更新のタイミング

arpingコマンドを実行すると、以下のように能動的にARPテーブルを更新することができます。

               client                       server
                  | IP=x.x.x.x                 |
                  | MAC=yy:yy:yy:yy:yy:yy      | ARPテーブル
                  |                            | +-----------------------------+
                  |                            | |    IP   |        MAC        |
                  |                            | +---------+-------------------+
                  |                            | |         |                   |
                  |                            | +-----------------------------+
                  |                            |
arping -A x.x.x.x |------------ GARP --------->| ARPテーブル更新
                  |         (ARP reply)        |
                  |                            | ARPテーブル
                  |                            | +-----------------------------+
                  |                            | |    IP   |        MAC        |
                  |                            | +---------+-------------------+
                  |                            | | x.x.x.x | yy:yy:yy:yy:yy:yy |
                  |                            | +-----------------------------+
                  |                            |

9.2 動作確認

arp_acceptに1を設定します。

[root@server ~]# sysctl -w net.ipv4.conf.eth0.arp_accept=1
net.ipv4.conf.eth0.arp_accept = 1

ARPテーブルを確認します。

[root@server ~]# ip n show
192.168.122.1 dev eth0 lladdr 52:54:00:80:1d:d6 REACHABLE

arpingコマンドを実行します。

[root@client ~]# arping -A -c 1 -I eth0 192.168.122.181

ARPテーブルを確認します。クライアントのARPエントリ(IPアドレスMACアドレスの組)が追加されたことがわかります。

[root@server ~]# ip n show
192.168.122.1 dev eth0 lladdr 52:54:00:80:1d:d6 REACHABLE
192.168.122.181 dev eth0 lladdr 52:54:00:d0:e3:a7 STALE

arpingコマンド実行時のWiresharkの実行結果を以下に示します。

Z 参考情報

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

Gratuitous ARP – Definition and Use Cases – Practical Networking .net