1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

トライしたかったnftablesの基本(その3)

Posted at

nftablesでブリッジ制御+ログ

nftablesを用いて、ebtablesで実現する機能(例:「いまさらだけどebtables(その1)」)であるブリッジ制御にトライ。さらに、ログも実施。

ネットワーク構成

image.png
いまさらだけど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]”)。デフォルトでは、カーネルログに情報が記載される。

/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を好きになるわけ」の記載にあるように、「パケットのログを取ってから破棄」する場合、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

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?