linux における arp の挙動に関するメモ

ちょっといろいろ謎かったので調べました。

ARP Request はいつ送信されるか

確認できたのは以下

  • arp テーブルにエントリがない ip アドレスに接続を試みたとき
  • エントリが「古い」とみなされた状態で再度接続を試みたとき(=無効とみなされたとき?)

ARP エントリの寿命が延びるとき

  • C の API sendmsg で、ソケットに MSG_CONFIRM が送信されたとき
    • linux arp モジュールに対して正のフィードバックを送る。ARP テーブルに入っている cache entry の寿命を伸ばすようだ。
    • TCP で ACK が帰ったときなんかに実行されるらしい

ARP エントリの寿命が短くなるとき

arp -d する以外には見つからなかった。少なくとも ping コマンドや telnet コマンドのレベルでは、何度か接続できなかったからといって ARP request が送信されるような挙動はみられなかった。

ARP に関する設定値

sysctl などで設定する。詳しくは man 7 arp にある。{if}はeth0とかをさす。

net.ipv4.neigh.{if}.base_reachable_time

ARP cache エントリの有効寿命を計算する基本の秒数。厳密にはにはいくらか複雑な計算があり、その基本となる値。

net.ipv4.neigh.{if}.locktime

ARP chace の寿命最小値。

net.ipv4.neigh.{if}.arp_ignore

デフォルト0。これが有効だと、ARP リクエストを受信した際に、受信ホストが持つIP Addressへの問い合わせならば、どの Interfaceで受信したかにかかわらず、受信した Interface の Mac Address を応答する。

詳しくは kernel-doc の networking/arp-sysctl.txt に記載がある。

てか翻訳しとくか。

IPアドレスの解決要求は単に”解決要求”、解決要求にたいする応答は単に”応答”と記載します。

あと文脈から推測するに以下の用語がある。

arp_ignore - INTEGER

  • ローカルターゲット IP アドレスの解決要求にたいする応答の挙動を定義する。
    • 0
      • デフォルト。ローカルIPアドレスに対する解決要求であれば、そのIPアドレスがどのインターフェースに設定されているかに関わらず応答する。
    • 1
      • ローカルIPアドレスに対する解決要求であって、解決要求が入ってきたインターフェースとそのインターフェースに設定されたIPアドレスが一致する場合にのみ応答する。
    • 2
      • 設定値1の条件かつ解決要求の送信元 IPアドレスが、要求を受け付けたインターフェースと同一のサブネットの場合のみ応答する。
    • 3
      • うまく訳せないっていうかよくわからない(ぇー
    • 4-7
      • 予約
    • 8

(感想:デフォルト2でいいじゃん。)