nftablesでブリッジ制御+ログ
nftablesを用いて、ebtablesで実現する機能(例:「いまさらだけどebtables(その1)」)であるブリッジ制御にトライ。さらに、ログも実施。
ネットワーク構成
「いまさらだけどebtables(その1)」と同じで、nftablesを動作させる「Network Bridge」(Linux:Lubuntu)が存在し、3つのNetwork I/Fが存在している。I/F:enp0s3には2つのホスト、I/F:enp0s9およびI/F:enp0s10にはそれぞれ1つのホストが接続されており、同一ネットワーク(192.168.10.xx/24)に属している。VirtualBox上のVMで実現。
設定
ネットワークブリッジ
「いまさらだけどebtables(その1)」と同じ。一部抜粋。
$ 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(破棄)
$ 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データ)は省略。
ルールの削除
$ sudo nft delete rule bridge br_filter br_drop handle 3
特定MacアドレスをDrop(破棄)
$ 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する。
ログ
$ 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]”)。デフォルトでは、カーネルログに情報が記載される。
$ 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を好きになるわけ」の記載にあるように、「パケットのログを取ってから破棄」する場合、iptablesでは、2回のコマンド(ルール)が必要だが、
$ sudo iptables -A FORWARD -p tcp --dport 22 -j LOG
$ sudo iptables -A FORWARD -p tcp --dport 22 -j DROP
nftablesでは、1つのルールで済む。
$ sudo nft add rule filter forward tcp dport 22 log drop
EOF