ろうとるがPythonを扱う、、（その19：Scapy Bridgeで遅延やパケットDrop）

# Scapy Bridgeで遅延やパケットDrop
Scapyで実現できることとして、パケット遅延およびパケットDropが簡単であったので、記録しておく。小ネタレベル。大昔の記事「[tcコマンドによるパケットロスおよび遅延](https://qiita.com/infinite1oop/items/3c479b775cc138c7bb46)」と内容的には同様である。

## 環境
「[こちら](https://qiita.com/infinite1oop/items/0498c7b89001c634f473)」の稿のブリッジと同じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/19e7f2ae-a78c-2ad0-9781-701dfcaf50a7.png)
VirtualBoxの３つのVMを利用。中央のVM(Lubuntu)がネットワークブリッジ、両端は同一ネットワークセグメントに属する。

## ソースコード
```python
from scapy.all import *
import time

def delay_packet(p):
    time.sleep(0.03)
    return True

def drop_packet(p):
    global count
    count += 1
    #if count%4 == 0:	# 25%
    if count%2 == 0:	# 50%
        return False
    else:
        return True

count = 0
# No Filter
#bridge_and_sniff('enp0s3', 'enp0s8')
# Delay Filter
#bridge_and_sniff('enp0s3', 'enp0s8', xfrm12=delay_packet)
# Drop Filter
bridge_and_sniff('enp0s3', 'enp0s8', xfrm12=drop_packet)
```
bridge_and_sniff()およびその中で指定できるコールバック関数を利用する。コード自体はほぼ自明。
- bridge_and_sniff('enp0s3', 'enp0s8')：コールバック関数なし
- bridge_and_sniff('enp0s3', 'enp0s8', xfrm12=delay_packet)：パケット遅延
    - 30msの遅延
- bridge_and_sniff('enp0s3', 'enp0s8', xfrm12=drop_packet)：パケットDrop
    - 25%および50%のパケットDrop

## 検証
両端のVM間のping実施。
### コールバック関数なし
```
$ ping -c 10 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=2.21 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=1.87 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=2.75 ms
(略)
64 bytes from 10.1.1.2: icmp_seq=10 ttl=64 time=2.85 ms

--- 10.1.1.2 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 25ms
rtt min/avg/max/mdev = 1.874/2.278/2.848/0.336 ms
```
平均2.278msの応答時間。

### delay_packet（30msの遅延）
```
$ ping -c 10 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=33.6 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=33.3 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=33.4 ms
（略）
64 bytes from 10.1.1.2: icmp_seq=10 ttl=64 time=33.1 ms

--- 10.1.1.2 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 25ms
rtt min/avg/max/mdev = 32.561/33.135/33.690/0.448 ms
```
平均33.135msの遅延。およそ、コールバック関数なし時の値（2.278ms）+コールバック関数delay_packet（30ms）分の値となっている。

### drop_packet（25%、50%のパケットDrop）
pingを100回実施。
#### 25%
```
$ ping -c 100 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=2.16 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=3.33 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=2.02 ms
64 bytes from 10.1.1.2: icmp_seq=5 ttl=64 time=1.78 ms
64 bytes from 10.1.1.2: icmp_seq=6 ttl=64 time=1.74 ms
64 bytes from 10.1.1.2: icmp_seq=7 ttl=64 time=1.94 ms
64 bytes from 10.1.1.2: icmp_seq=8 ttl=64 time=1.93 ms
64 bytes from 10.1.1.2: icmp_seq=10 ttl=64 time=2.39 ms
（略）
64 bytes from 10.1.1.2: icmp_seq=94 ttl=64 time=6.36 ms
64 bytes from 10.1.1.2: icmp_seq=96 ttl=64 time=1.95 ms
64 bytes from 10.1.1.2: icmp_seq=97 ttl=64 time=2.52 ms
64 bytes from 10.1.1.2: icmp_seq=98 ttl=64 time=3.53 ms
64 bytes from 10.1.1.2: icmp_seq=100 ttl=64 time=2.35 ms

--- 10.1.1.2 ping statistics ---
100 packets transmitted, 76 received, 24% packet loss, time 568ms
rtt min/avg/max/mdev = 1.735/2.406/6.362/0.816 ms
```
24%ロスト。まずまず。

#### 50%
```
$ ping -c 100 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=2.07 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=1.88 ms
64 bytes from 10.1.1.2: icmp_seq=5 ttl=64 time=3.19 ms
64 bytes from 10.1.1.2: icmp_seq=7 ttl=64 time=2.02 ms
（略）
64 bytes from 10.1.1.2: icmp_seq=94 ttl=64 time=1.89 ms
64 bytes from 10.1.1.2: icmp_seq=95 ttl=64 time=1.83 ms
64 bytes from 10.1.1.2: icmp_seq=98 ttl=64 time=1.76 ms
64 bytes from 10.1.1.2: icmp_seq=100 ttl=64 time=1.92 ms

--- 10.1.1.2 ping statistics ---
100 packets transmitted, 52 received, 48% packet loss, time 824ms
rtt min/avg/max/mdev = 1.714/21.638/1014.593/139.042 ms
```
48%ロスト、こちらもまずまず。

## 結論
それなりに使えると判断。

EOF