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]#