nftables メモ

nftables は iptables と比べて色々変わっているのでメモ。

ドキュメントは manwiki を読んだ。

  • ruleset はカーネル内に存在する nftable のすべての情報を書き出す。iptables-save に相当するもの。
  • table はチェインやセットなどを保持するためのコンテナ。アドレスファミに理紐付いている。iptables と異なり事前定義されてはいない。
  • chain はルールを保持するコンテナ。iptablesと違って事前定義チェインは存在しない。base チェインと regular チェインという二種類ある。base はエントリーポイントで、regular は他のチェインからジャンプしてくるときに使う。 base チェインは type、hook、priority が必須パラメータになっている。
  • rule はパケット処理ルール。expression と statement から作られる。
  • expression は定数値やパケットから得られる値。各種演算子や他の expression と組み合わせて複雑な expression を作れる。 expressionではmetaを使うとパケットのメタデータを取得できる。 インタフェースとかはわかるけど、l4protoとかpalyloadでは?という気もする。
  • statement はアクションを示す。statement は評価を打ち切るか継続するかするものがある。acceptやdropは評価を打ち切る。continueは次のルールを実行する。statement を指定しないと continue 扱い。

構文が明に書いていなくて、イマイチわかりにくいところがある。 expression では、ip saddr 127.0.0.1 と書けるけど、比較演算子を使って ip saddr == 127.0.0.1 みたいにも書けるらしい。

https://wiki.nftables.org/wiki-nftables/index.php/Quick_reference-nftables_in_10_minutes#Rules https://wiki.nftables.org/wiki-nftables/index.php/Building_rules_through_expressions

パーサを見てみると、statementの一部として、match_stmtが定義されていて、match_stmt は relational_expr であるらしい。 この relational_expr を見てみると、OP_IMPLICIT というオペレータがあって、どうやらこいつが、OP_EQ と同じような役割を果たすらしい。

http://git.netfilter.org/nftables/tree/src/parser_bison.y#n2843 http://git.netfilter.org/nftables/tree/src/parser_bison.y#n4650

あと面白いのは、concatenations という機能で、set などとのマッチを行うときに、expression の値を連結したものをマッチすることができる。 ip saddr . ip daddr { 127.0.0.1 . 1.1.1.1} みたいな書き方で、python でいうと (ip saddr, ip daddr) in {(127.0.0.1, 1.1.1.1)} みたいな意味になるようだ。

https://wiki.nftables.org/wiki-nftables/index.php/Concatenations