いまさらだけどebtables（その１）

# ebtablsにトライ
Layer2レベルのデータ制御（Firewall）を試すため、ebtablesにトライした。マニュアルは下記となる。
- [EBTABLES](http://linuxjm.osdn.jp/html/ebtables/man8/ebtables-legacy.8.html)

## 最初から脱線
ebtablesはiptablesとともに、今は、nftablesに統合されているらしい。なので、「いまさらだけど」である。しかし、小生のレベルでは高度なことはしない、「Simple Is Best」ということで、基本的（かつ自分的には最も大事）な事項を実施。

## ネットワーク構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/255714e8-6a55-e321-e4a4-afca805bef4b.png)
ebtablesを動作させる「Network Bridge」（Linux:Lubutu）が存在し、３つのNetwork I/Fが存在している。I/F:enp0s3には２つのホスト、I/F:enp0s9およびI/F:enp0s10にはそれぞれ１つのホストが接続されており、同一ネットワーク（192.168.10.xx/24）に属している。

### Virtual Box
いずれも、Virtual Box上のVMを利用。「Network Bridge」には、プロミスキャスモードを適用する。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/66abb2b5-77df-4792-7a14-e654f71f30d0.png", width=70%>

## Network Bridge設定
こちら[「ネットワークブリッジ」](https://wiki.archlinux.jp/index.php/%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF%E3%83%96%E3%83%AA%E3%83%83%E3%82%B8)などをもとに設定。
```
$ sudo brctl addbr br0
$ sudo brctl addif br0 enp0s3
$ sudo brctl addif br0 enp0s9
$ sudo brctl addif br0 enp0s10
$ sudo ip link set up dev br0
$ sudo brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.08002703353c       no              enp0s10
                                                        enp0s3
                                                        enp0s9
$ ip link
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:03:35:3c brd ff:ff:ff:ff:ff:ff
3: enp0s9: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:7f:54:7d brd ff:ff:ff:ff:ff:ff
4: enp0s10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:29:53:04 brd ff:ff:ff:ff:ff:ff
5: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 08:00:27:03:35:3c brd ff:ff:ff:ff:ff:ff
```

## 検証
### I/F:enp0s9のOut方向をDeny（不許可）
#### ebtables設定
「Forward」（転送）Chainを用いる（以下、同様）。「-o」によりOut方向のI/Fを指定、「-j DROP」によりデータを捨てる。
```
$ sudo ebtables -A FORWARD -o enp0s9 -j DROP
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-o enp0s9 -j DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
```
#### 結果
VM:192.168.10.11でのpingの結果である。Denyのため、疎通なし。
```
$ ping 192.168.10.33 -c 1
PING 192.168.10.33 (192.168.10.33) 56(84) bytes of data.

--- 192.168.10.33 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
```
VM:192.168.10.33にて、何も受信しておらず。
![Case1-b3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/98f3077b-404a-adad-0011-4a84a61391a8.png)

### I/F:enp0s10のIn方向をDeny
#### 設定
「-D」により一つ前の設定削除、「-i」によりIn方向のI/Fを指定。
```
$ sudo ebtables -D FORWARD 1
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
$ sudo ebtables -A FORWARD -i enp0s10 -j DROP
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-i enp0s10 -j DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
```

#### 結果
VM:192.168.10.11でのpingの結果である。Denyのため、疎通なし。
```
$ ping 192.168.10.44 -c 1
PING 192.168.10.44 (192.168.10.44) 56(84) bytes of data.

--- 192.168.10.44 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
```
ただし、In方向のフィルターのため、VM:192.168.10.44では、ICMP応答をしている。
![Case2-b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/d1f5ce52-9007-30f6-e87f-1e2ca2cbe0cf.png)
Network Bridgeでデータが破棄されている。

### Sourceとして特定のMacアドレス（ここではVM:192.168.10.22）をDeny
#### 設定
「-s」により、送信元Macアドレス指定。「08:00:27:c2:b3:07」はVM:192.168.10.22のMacアドレス。
```
$ sudo ebtables -D FORWARD 1
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
$ sudo ebtables -A FORWARD -s 08:00:27:c2:b3:07 -j DROP
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-s 08:00:27:c2:b3:07 -j DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
```

#### 結果
VM:192.168.10.11でのpingの結果である。Network Bridgeに入らない宛先（VM:192.168.10.22）に対しては疎通がある。
```
$ ping 192.168.10.22 -c 1
PING 192.168.10.22 (192.168.10.22) 56(84) bytes of data.
64 bytes from 192.168.10.22: icmp_seq=1 ttl=64 time=0.401 ms

--- 192.168.10.22 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.401/0.401/0.401/0.000 ms
```
VM:192.168.10.22（フィルター対象）でのpingの結果である。Network Bridgeを通る宛先（VM:192.168.10.33）に対しては疎通がない。
```
$ ping 192.168.10.33 -c 1
PING 192.168.10.33 (192.168.10.33) 56(84) bytes of data.
From 192.168.10.22 icmp_seq=1 Destination Host Unreachable

--- 192.168.10.33 ping statistics ---
1 packets transmitted, 0 received, +1 errors, 100% packet loss, time 0ms
```

### Destinationとして特定のMacアドレス（ここでは192.168.10.44のホスト）をDeny
#### 設定
「-d」により、宛先Macアドレス指定。「08:00:27:b2:76:7e」はVM:192.168.10.44のMacアドレス。
```
$ sudo ebtables -D FORWARD 1
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
$ sudo ebtables -A FORWARD -d 08:00:27:b2:76:7e -j DROP
$ sudo ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 1, policy: ACCEPT
-d 08:00:27:b2:76:7e -j DROP

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT
```

#### 結果
ping実行前、フィルター対象となる宛先（VM:192.168.10.44）のMacアドレスは登録されていない状態。
```
$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.10.33            ether   08:00:27:d0:a0:46   C                     eth0
192.168.10.44                    (incomplete)                              eth0
192.168.10.22            ether   08:00:27:c2:b3:07   C                     eth0
```
ping実行はNGとなるが、フィルター対象となる宛先（VM:192.168.10.44）のMacアドレスは登録されている。ARPブロードキャストはフィルタリングされない。
```
$ ping 192.168.10.44 -c 1
PING 192.168.10.44 (192.168.10.44) 56(84) bytes of data.

--- 192.168.10.44 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

$ arp
Address                  HWtype  HWaddress           Flags Mask            Iface
192.168.10.33            ether   08:00:27:d0:a0:46   C                     eth0
192.168.10.44            ether   08:00:27:b2:76:7e   C                     eth0
192.168.10.22            ether   08:00:27:c2:b3:07   C                     eth0
```
VM:192.168.10.11では、ARP応答を受けているが、ICMP応答はない。
![Case4-b1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/99af1c26-e234-b0c2-08fb-0b7be9f2060f.png)

VM:192.168.10.44では、ARPのみ。ICMP要求を受信せず（フィルタリングされている）。
![Case4-b4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/b2ec60bd-a564-85d8-a1c0-740a6fc113ec.png)

EOF