トライしたかったnftablesの基本（その３）

# nftablesでブリッジ制御＋ログ
nftablesを用いて、ebtablesで実現する機能（例：「[いまさらだけどebtables（その１）](https://qiita.com/infinite1oop/items/8150adf8c1232236f2dc)」）であるブリッジ制御にトライ。さらに、ログも実施。

## ネットワーク構成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634816/3b3d6631-2000-ead3-342f-a04b1ee3fa59.png)
「[いまさらだけどebtables（その１）](https://qiita.com/infinite1oop/items/8150adf8c1232236f2dc)」と同じで、nftablesを動作させる「Network Bridge」（Linux:Lubuntu）が存在し、３つのNetwork I/Fが存在している。I/F:enp0s3には２つのホスト、I/F:enp0s9およびI/F:enp0s10にはそれぞれ１つのホストが接続されており、同一ネットワーク（192.168.10.xx/24）に属している。VirtualBox上のVMで実現。

## 設定
### ネットワークブリッジ
「[いまさらだけどebtables（その１）](https://qiita.com/infinite1oop/items/8150adf8c1232236f2dc)」と同じ。一部抜粋。
```shell
$ 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
```
上記コマンドにより、上図のネットワーク構築できる。

### enp0s9への出力をDrop（破棄）
```shell
$ sudo nft create table bridge br_filter
$ sudo nft create chain bridge br_filter br_drop {type filter hook forward priority 0 \;}
$ sudo nft add rule bridge br_filter br_drop oif enp0s9 drop
$ sudo nft -a list ruleset
table bridge br_filter { # handle 1
        chain br_drop { # handle 1
                type filter hook forward priority 0; policy accept;
                oif "enp0s9" drop # handle 3
        }
}
```
”bridge”を対象とし、テーブル名は「br_filter」、チェーン名は「br_drop」、”oif”が出力インターフェースを指し、"enp0s9"へ出るデータをDropするルールの作成。結果は自明なので、ネットワークキャプチャデータ（Wiresharkデータ）は省略。

### ルールの削除
```shell
$ sudo nft delete rule bridge br_filter br_drop handle 3
```
### 特定MacアドレスをDrop（破棄）
```shell
$ sudo nft add rule bridge br_filter br_drop ether saddr 08:00:27:ea:cf:18 drop
$ sudo nft -a list ruleset
table bridge br_filter { # handle 1
        chain br_drop { # handle 1
                type filter hook forward priority 0; policy accept;
                ether saddr 08:00:27:ea:cf:18 drop # handle 4
        }
}
```
”ether saddr 08:00:27: ea: cf:18 drop”により、送信元Macアドレス「08:00:27: ea: cf:18」（VM：Busterdog1）をもつデータをDropする。

### ログ
```shell
$ sudo nft delete rule bridge br_filter br_drop handle 4
$ sudo nft add rule bridge br_filter br_drop ether saddr 08:00:27:ea:cf:18 log prefix \"[nftables drop] \" drop
$ sudo nft -a list ruleset
table bridge br_filter { # handle 1
        chain br_drop { # handle 1
                type filter hook forward priority 0; policy accept;
                ether saddr 08:00:27:ea:cf:18 log prefix "[nftables drop] " drop # handle 8
        }
}
```
”ether saddr 08:00:27: ea: cf:18 log drop”により、送信元Macアドレス「08:00:27: ea: cf:18」（VM：Busterdog1）をもつデータをDropし、かつログ化する（ログprefixは”[nftables drop]”）。デフォルトでは、カーネルログに情報が記載される。

```log:/var/log/kern.log
$ tail /var/log/kern.log
...
Aug  1 20:00:10 vamos kernel: [ 4906.092636] [nftables drop] IN=enp0s3 OUT=enp0s10 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44
Aug  1 20:00:10 vamos kernel: [ 4906.092661] [nftables drop] IN=enp0s3 OUT=enp0s9 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44
Aug  1 20:00:11 vamos kernel: [ 4907.101079] [nftables drop] IN=enp0s3 OUT=enp0s10 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44
Aug  1 20:00:11 vamos kernel: [ 4907.101106] [nftables drop] IN=enp0s3 OUT=enp0s9 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44
Aug  1 20:00:12 vamos kernel: [ 4908.124895] [nftables drop] IN=enp0s3 OUT=enp0s10 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44
Aug  1 20:00:12 vamos kernel: [ 4908.124980] [nftables drop] IN=enp0s3 OUT=enp0s9 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=08:00:27:ea:cf:18 IPSRC=192.168.10.11 MACDST=00:00:00:00:00:00 IPDST=192.168.10.44

```
送信元Macアドレス”08:00:27: ea: cf:18”のARP（PTYPE=0x0800）のリクエスト（OPCODE=1）が見える。ARPブロードキャストなので、宛先Macアドレスは”ff:ff:ff:ff:ff:ff”となりそうだが、”00:00:00:00:00:00”となっている理由は不明。

## 最後に＋α
理解できれば、nftablesは、iptablesやebtablesより、扱いやすく感じる。こちらのサイト「[あなたがnftablesを好きになるわけ](https://yakst.com/ja/posts/187)」の記載にあるように、「パケットのログを取ってから破棄」する場合、iptablesでは、２回のコマンド（ルール）が必要だが、
```
$ sudo iptables -A FORWARD -p tcp --dport 22 -j LOG
$ sudo iptables -A FORWARD -p tcp --dport 22 -j DROP
```
nftablesでは、１つのルールで済む。
```
$ sudo nft add rule filter forward tcp dport 22 log drop
```

EOF