nftables は iptables と比べて色々変わっているのでメモ。
- 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