Linuxでarpingコマンドを使用する方法

Linuxのarpingコマンドはpingに似ていますが、ローカルネットワークでのみ使用できます。その利点は、ネットワークレベルが低いため、pingが応答しない場合でも応答が得られることです。使用方法を説明します。

ARPプロトコル

IPアドレスは、ネットワークデバイスの数字のラベルです。適切なネットワークトラフィックが正しいデバイスに到着するように、アドレスとして使用されます。しかし、ローカルエリアネットワーク上のほとんどのデバイスは動的IPアドレスを持っています。つまり、次回起動したときにIPアドレスが変わる可能性があります。

ネットワークトラフィックを適切なデバイスに正しくルーティングできるようにするには、IPアドレスをメディアアクセス制御(MAC)アドレスにマッピングするスキームを使用する必要があります。MACアドレスは、デバイスの製造時に確立された一意のIDです。IPアドレスは論理アドレスです。MACアドレスは物理アドレスです。

アドレス解決プロトコルは、IPアドレスをMACアドレスにマッピングする仲介役です。ネットワーク内でネットワークパケットをマーシャリングしてルーティングするデバイス(通常はルーター)は、IPアドレスとMACアドレスを結びつけるARPテーブルを構築して維持します。

ルーターが知らないデバイスにデータをルーティングする必要がある場合、ルーターはARP要求を行って、新しいデバイスのMACアドレスを取得します。

新しいデバイスがネットワークに接続されると、IPアドレスが割り当てられますが、それだけでは実際にトラフィックをルーティングするには十分ではありません。ルーターは、ジグソーパズルの欠けているピースであるMACアドレスを取得する必要があります。しかし、IPアドレスだけではデバイスにパケットをルーティングする情報が十分ではないため、キャッチ22はIPアドレスを使用してハードウェアにクエリを実行してMACアドレスを取得できないことです。

オープンシステム間接続モデルは、機能するネットワークを構成するテクノロジーを、一連のレイヤーとしてグループ化します。下位レイヤーなしでは、上位レイヤーは動作しません。OSIモデルには7つのレイヤーがあります。

  • レイヤー7は最上位のレイヤーであるアプリケーションレイヤーです。コンピューターユーザーに情報を提供し、ユーザーから情報を取得します。
  • レイヤー6はプレゼンテーションレイヤーです。これにより、データがネットワーク形式との間を移動するときに、適切な形式または状態になります。このレイヤーで暗号化と復号化が行われます。
  • レイヤー5はセッションレイヤーです。セッションは、2つ以上のデバイス間のネットワーク接続です。このレイヤーは、接続の開始、ハンドシェイク、タイムアウト、不要になった接続の切断などの事柄に関係します。
  • レイヤー4はトランスポートレイヤーです。これは、ネットワーク上でデータを調整された方法で移動させるレイヤーです。このレイヤーは、転送速度やデータ量などの事柄を扱います。トランスミッション制御プロトコル(TCP/IPのTCP)はこのレイヤーで動作します。
  • レイヤー3はネットワークレイヤーです。ここでは、ルーティングとパケット転送が行われます。インターネットプロトコル(TCP/IPのIP)が動作するレイヤーです。
  • レイヤー2はデータリンクレイヤーです。ブロードキャストを使用してすべてのデバイスに送信するか、ユニキャストを使用して特定のMACアドレスに送信することによって、直接アドレス指定可能なデバイス間でパケットを送信するために使用されます。
  • レイヤー1は物理レイヤーです。これには、ケーブル、ルーター、ネットワークスイッチなどの物理インフラストラクチャが関係します。Wi-Fiで使用される電波もこのカテゴリに分類されます。

ルーターがテーブルにないIPアドレスのパケットを受信すると、ネットワーク全体にブロードキャストパケットを送信します。効果的には、「このIPアドレスを持っているのは誰ですか?」と尋ねます。これはレイヤー2メッセージなので、IPルーティングに依存しません。

一致するアドレスを持つデバイスは、MACアドレスを返信することで応答します。そのデバイスのIPアドレスとMACアドレスをマッピングテーブルに追加できます。通常のIPトラフィックは、IPアドレスとMACアドレスの関係が確立され、記録されているため、デバイスにルーティングできるようになりました。

arpingコマンド

すべての巧妙なARP処理は、バックグラウンドで自動的に行われ、ARPテーブルを構築および維持します。arpingコマンドは、ARPクエリの一部をターミナルウィンドウにもたらします。これはOSIレイヤー2で動作し、pingが応答しない場合でも、デバイスからの応答を要求できます。

Fedora 36では、arpingはすでにインストールされていましたが、Manjaro 21とUbuntu 22.04にインストールする必要がありました。

Ubuntuでのコマンドは次のとおりです。

sudo apt install arping

Manjaroでは、次のように入力する必要があります。

sudo pacman -Sy arping

arpingを使用する最も簡単な方法は、IPアドレスを使用することです。これは、ローカルネットワークに接続された、直接アドレス指定可能なデバイスのアドレスである必要があります。arpingはレイヤー2で動作するため、ルーティングはできません。arpingsudoを使用する必要があります。

sudo arping 192.168.1.17

Ctrl+Cを押して停止します。返される情報は、応答デバイスのMACアドレス、arpingリクエストのインデックス番号、およびarpingリクエストが完了するまでの往復時間です。

以下のpingコマンドの出力と比較します。pingコマンドは、ネットワークパケットの往復のタイミングに関する詳細情報を返します。arpingコマンドはタイミングの統計情報をあまり提供しませんが、デバイスのMACアドレスが含まれます。

ping 192.168.1.17

arpingでデバイスのネットワーク名を使用することもできます。

sudo arping fedora-36.local

-c(カウント)オプションを使用すると、設定した数のリクエスト後にarpingを停止するように指示できます。このコマンドはarpingに2回試行してから停止するように指示します。

sudo arping -c 2 192.168.1.18

コンピューターに複数のネットワークインターフェイスがある場合は、-I(インターフェイス)オプションを使用して、arpingに使用するインターフェイスを指示できます。

ip linkコマンドを使用して、ネットワークインターフェイスを一覧表示できます。

ip link

このコンピューターには3つのインターフェイスがあります。lo仮想インターフェイスは、同じコンピューター上のソフトウェア間の内部接続のループバックとして使用されます。ここでは使用しません。イーサネット接続enp3s0またはワイヤレスインターフェイスwlan0のいずれかを使用できます。

このコマンドはarpingに、自分で選択せずに、選択したインターフェイスを使用するように指示します。

sudo arping -c 2 -I enp3s0 manjaro-21.local

スクリプトでarpingを使用する

スクリプトのループでarpingをラップすることで、IPアドレスの範囲全体で機能させることができます。このスクリプトからテキストをコピーして、「scan-range.sh」というファイルに保存します。

スクリプトを編集して、192.168.1のすべての出現を、ネットワークのIPアドレスに置き換える必要があります。

<code>#!/bin/bash

for ((device=$1; device<=$2; device++))
do

arping -c 1 192.168.1.$device | grep -E "1 response|1 packets received" > /dev/null

if [ $? == 0 ]; then
echo "192.168.1.$device responded."
else
echo "192.168.1.$device didn't respond."
fi

done</code>

スクリプトは2つのコマンドラインパラメーターを受け入れます。これらは、arpingを使用するIPアドレスの範囲の最後のオクテットとして使用されます。したがって、スクリプトに20と30を渡すと、ループは192.168.1.20から始まり、IPアドレス192.168.1.30を使用した後に終了します。

パラメーターには、スクリプト内で$1$2としてアクセスします。これらは、Cスタイルのforループで使用されます。forループの各スピンで、$deviceは範囲内の次のIPアドレスに設定されます。

スクリプトは、すでに見たのと同じarping -c形式を使用しますが、今回は範囲内の各デバイスに送信されるARPリクエストを1つだけ要求しています。

arpingコマンドからの出力をgrepにパイプします。

grep構文はスクリプトで簡素化できます。grepは、「1 response」と「1 packets received」の2つの文字列のいずれかを検索しています。これは、テストコンピューターにarpingの異なるバージョンがあり、異なる用語を使用しているためです。grepがこれらのフレーズのいずれかを見つけた場合、その終了値は0になります。

arpingのバージョンで使用されているフレーズがわかれば、別のフレーズを削除してgrep構文を簡素化できます。

ifステートメントは$?(終了した最後のプロセスの終了コードを保持する変数)をテストして、それが0かどうかを確認します。0の場合は、echoを使用してターミナルウィンドウに成功メッセージを印刷します。テストが失敗した場合、grepはどちらの文字列も見つからなかったため、ARPリクエストが失敗したことを意味します。

chmodコマンドと+xオプションを使用してスクリプトを実行可能にします。

chmod +x scan-range.sh

15から20までのIP範囲をスキャンして実行します。これらのアドレスの一部にはデバイスが接続されていないため、一部が失敗することがあります。sudoを使用することを忘れないでください。また、192.168.1.15のデバイスにpingを試みます。

sudo ./scan-range.sh 15 20

ping 192.168.1.15

どのネットワークでもそうであるように、成功と失敗が混在します。しかし、192.168.1.15のデバイスはレイヤー2のARPリクエストには応答しますが、レイヤー3のpingリクエストには応答しないことに注意してください。

デバイスにpingを実行して失敗に気づいた場合、デバイスが接続されているか、オンラインになっているか、デバイス192.168.1.15からpingを実行できるかどうかを確認する必要があるでしょう。

しかし、arpingを使用すると、デバイスが接続されていて、オンラインであり、ネットワークからアクセスできることを確認できます。これにより、トラブルシューティングがルーティングとARPテーブルの問題を調査することから始められます。

より深い洞察

ネットワークには多くのレイヤーがあります。pingでどこにも到達できない場合は、レイヤーを1つ下げて、arpingが何を教えてくれるかを確認してください。