scapy の ARP キャッシュ

chestnut_eared_bunting02 linux

scapy は OS とは別に独自の ARP キャッシュを持ちます。scapy での送受信はこの ARP キャッシュの影響を受けます。

※ここでは実際に設定、動作したものを掲載していますが、内容について保証するものではありません。流用される場合は各自の責任でお願いします。

scapy の他の機能については「scapy について」からご参照ください。

arping(*1)と ICMP を各 1 回実行し、その時の ARP キャッシュと送受信されるパケットを確認します。

*1 scapy の arping は scapy の ARP キャッシュを更新しますが、OS の ARP キャッシュは更新しません。

OS の ARP キャッシュの状況を確認します。

[root@rocky8-client scapy]# ip neigh flush all
[root@rocky8-client scapy]# ip neigh show
10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:00 REACHABLE
[root@rocky8-client scapy]#

scapy の ARP キャッシュの状況を確認します。

>>> conf.netcache.arp_cache.flush()
>>> conf.netcache
arp_cache: 0 valid items. Timeout=120s
in6_neighbor: 0 valid items. Timeout=120s
dns_cache: 0 valid items. Timeout=300s
dclocator: 0 valid items. Timeout=600s
>>> conf.netcache.arp_cache

>>>

arping を実行します。

>>> arping("10.0.2.16/32", cache=True)
Begin emission

Finished sending 1 packets

Received 1 packets, got 1 answers, remaining 0 packets
src                manuf     psrc
08:00:27:fb:79:c9  PcsCompu  10.0.2.16
(<ARPing: TCP:0 UDP:0 ICMP:0 Other:1>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>>

OS の ARP キャッシュには影響がないことを確認します。

[root@rocky8-client scapy]# ip neigh show
10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:00 REACHABLE
[root@rocky8-client scapy]#

scapy の ARP キャッシュに 10.0.2.16 が登録されていることを確認します。

>>> conf.netcache
arp_cache: 1 valid items. Timeout=120s
in6_neighbor: 0 valid items. Timeout=120s
dns_cache: 0 valid items. Timeout=300s
dclocator: 0 valid items. Timeout=600s
>>> conf.netcache.arp_cache
10.0.2.16  08:00:27:fb:79:c9
>>>

scapy の ARP キャッシュが消える前(120s 以内)に ICMP(sr)を実行します。

>>> r, ur = sr(IP(dst="10.0.2.16/32")/ICMP(), timeout=1, verbose=False)
>>> r; r.nsummary()
<Results: TCP:0 UDP:0 ICMP:1 Other:0>
0000 IP / ICMP 10.0.2.44 > 10.0.2.16 echo-request 0 ==> IP / ICMP 10.0.2.16 > 10.0.2.44 echo-reply 0 / Padding
>>>

以下は arping と ICMP(sr)実行中のパケットキャプチャです。arping では arp(#1,#2)が実施されています。前述のとおり OS の ARP キャッシュには 10.0.2.16 の登録はありませんが、scapy の ARP キャッシュには登録されているため、ICMP(sr)の実行では、icmp(#3,#4)は実施されますが arp は行われません。

[root@rocky8-client scapy]# tshark -i 1 -f "host 10.0.2.16" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
6 ^C
[root@rocky8-client scapy]# tshark -t a -r /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
    1 16:49:25.915199648 PcsCompu_7e:aa:05 → Broadcast    ARP 42 Who has 10.0.2.16? Tell 10.0.2.44
    2 16:49:25.917009554 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 10.0.2.16 is at 08:00:27:fb:79:c9
    3 16:49:52.068415602    10.0.2.44 → 10.0.2.16    ICMP 42 Echo (ping) request  id=0x0000, seq=0/0, ttl=64
    4 16:49:52.069901783    10.0.2.16 → 10.0.2.44    ICMP 60 Echo (ping) reply    id=0x0000, seq=0/0, ttl=64 (request in 3)
    5 16:49:57.114767099 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 Who has 10.0.2.44? Tell 10.0.2.16
    6 16:49:57.114788114 PcsCompu_7e:aa:05 → PcsCompu_fb:79:c9 ARP 42 10.0.2.44 is at 08:00:27:7e:aa:05
[root@rocky8-client scapy]#

次に ICMP を 2 回実行しますが、その途中で scapy の ARP キャッシュのみクリアし、送受信されるパケットがどうなるかを確認します。

OS の ARP キャッシュの状況を確認します。

[root@rocky8-client scapy]# ip neigh flush all
[root@rocky8-client scapy]# ip neigh show
10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:00 REACHABLE
[root@rocky8-client scapy]#

scapy の ARP キャッシュの状況を確認します。

>>> conf.netcache.arp_cache.flush()
>>> conf.netcache
arp_cache: 0 valid items. Timeout=120s
in6_neighbor: 0 valid items. Timeout=120s
dns_cache: 0 valid items. Timeout=300s
dclocator: 0 valid items. Timeout=600s
>>> conf.netcache.arp_cache

>>>

1 回目の ICMP(sr)を実行します。

>>> r, ur = sr(IP(dst="10.0.2.16/32")/ICMP(), timeout=1, verbose=False)
>>> r; r.nsummary()
<Results: TCP:0 UDP:0 ICMP:1 Other:0>
0000 IP / ICMP 10.0.2.44 > 10.0.2.16 echo-request 0 ==> IP / ICMP 10.0.2.16 > 10.0.2.44 echo-reply 0 / Padding
>>>

OS の ARP キャッシュに 10.0.2.16 が登録されていることを確認します。

[root@rocky8-client scapy]# ip neigh show
10.0.2.2 dev enp0s3 lladdr 52:54:00:12:35:00 REACHABLE
10.0.2.16 dev enp0s3 lladdr 08:00:27:fb:79:c9 STALE
[root@rocky8-client scapy]#

scapy の ARP キャッシュに 10.0.2.16 が登録されていることを確認します。

>>> conf.netcache
arp_cache: 1 valid items. Timeout=120s
in6_neighbor: 0 valid items. Timeout=120s
dns_cache: 0 valid items. Timeout=300s
dclocator: 0 valid items. Timeout=600s
>>> conf.netcache.arp_cache
10.0.2.16  08:00:27:fb:79:c9
>>>

scapy の ARP キャッシュをクリアします。

>>> conf.netcache.arp_cache.flush()
>>> conf.netcache
arp_cache: 0 valid items. Timeout=120s
in6_neighbor: 0 valid items. Timeout=120s
dns_cache: 0 valid items. Timeout=300s
dclocator: 0 valid items. Timeout=600s
>>> conf.netcache.arp_cache

>>>

2 回目の ICMP(sr)を実行します。

>>> r, ur = sr(IP(dst="10.0.2.16/32")/ICMP(), timeout=1, verbose=False)
>>> r; r.nsummary()
<Results: TCP:0 UDP:0 ICMP:1 Other:0>
0000 IP / ICMP 10.0.2.44 > 10.0.2.16 echo-request 0 ==> IP / ICMP 10.0.2.16 > 10.0.2.44 echo-reply 0 / Padding
>>>

以下は 2 回の ICMP(sr)実行中のパケットキャプチャです。1 回目の ICMP(sr)では arp(#1,#2)と icmp(#3,#4)が実施されています。前述のとおり OS の ARP キャッシュには 10.0.2.16 が登録されていますが、scapy の ARP キャッシュはクリアしているため、2 回目の ICMP(sr)についても arp(#7,#8)と icmp(#9,#10)が実施されています。

[root@rocky8-client scapy]# tshark -i 1 -f "host 10.0.2.16" -w /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
Capturing on 'enp0s3'
12 ^C
[root@rocky8-client scapy]# tshark -t a -r /tmp/test.pcap
Running as user "root" and group "root". This could be dangerous.
    1 18:59:52.942414852 PcsCompu_7e:aa:05 → Broadcast    ARP 42 Who has 10.0.2.16? Tell 10.0.2.44
    2 18:59:52.943168723 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 10.0.2.16 is at 08:00:27:fb:79:c9
    3 18:59:52.944822471    10.0.2.44 → 10.0.2.16    ICMP 42 Echo (ping) request  id=0x0000, seq=0/0, ttl=64
    4 18:59:52.945733390    10.0.2.16 → 10.0.2.44    ICMP 60 Echo (ping) reply    id=0x0000, seq=0/0, ttl=64 (request in 3)
    5 18:59:58.448652345 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 Who has 10.0.2.44? Tell 10.0.2.16
    6 18:59:58.448694583 PcsCompu_7e:aa:05 → PcsCompu_fb:79:c9 ARP 42 10.0.2.44 is at 08:00:27:7e:aa:05
    7 19:00:52.084858583 PcsCompu_7e:aa:05 → Broadcast    ARP 42 Who has 10.0.2.16? Tell 10.0.2.44
    8 19:00:52.086026267 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 10.0.2.16 is at 08:00:27:fb:79:c9
    9 19:00:52.087127617    10.0.2.44 → 10.0.2.16    ICMP 42 Echo (ping) request  id=0x0000, seq=0/0, ttl=64
   10 19:00:52.088212653    10.0.2.16 → 10.0.2.44    ICMP 60 Echo (ping) reply    id=0x0000, seq=0/0, ttl=64 (request in 9)
   11 19:00:57.345920929 PcsCompu_fb:79:c9 → PcsCompu_7e:aa:05 ARP 60 Who has 10.0.2.44? Tell 10.0.2.16
   12 19:00:57.345956620 PcsCompu_7e:aa:05 → PcsCompu_fb:79:c9 ARP 42 10.0.2.44 is at 08:00:27:7e:aa:05
[root@rocky8-client scapy]#
タイトルとURLをコピーしました