ebtablsにトライ
Layer2レベルのデータ制御(Firewall)を試すため、ebtablesにトライした。マニュアルは下記となる。
最初から脱線
ebtablesはiptablesとともに、今は、nftablesに統合されているらしい。なので、「いまさらだけど」である。しかし、小生のレベルでは高度なことはしない、「Simple Is Best」ということで、基本的(かつ自分的には最も大事)な事項を実施。
ネットワーク構成
ebtablesを動作させる「Network Bridge」(Linux:Lubutu)が存在し、3つのNetwork I/Fが存在している。I/F:enp0s3には2つのホスト、I/F:enp0s9およびI/F:enp0s10にはそれぞれ1つのホストが接続されており、同一ネットワーク(192.168.10.xx/24)に属している。
Virtual Box
いずれも、Virtual Box上のVMを利用。「Network Bridge」には、プロミスキャスモードを適用する。
Network Bridge設定
こちら「ネットワークブリッジ」などをもとに設定。
$ 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
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応答をしている。
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応答はない。
VM:192.168.10.44では、ARPのみ。ICMP要求を受信せず(フィルタリングされている)。
EOF