nftablesに変わったらiptablesが動かなくなった。
nftablesに変わってもiptablesはそのまま動作する。と思ってたのですが。iptablesだけで書くとそのまま動作するが、nftablesとiptablesが混ざるとACCEPTが動かない。混ぜるな!と思うかもしれませんが、ディストリビューションがnftablesで書いてくると、私達がiptablesで書いたルールとバッティングするのです。
バッティングする例
ディストリビューションのルールを強引に上書きする。(INSERT)
iptables -I FORWARD -i eth0 -o eth1 -j ACCEPT
とりあえず動くだろうと、ルールを先頭へINSERTして強引に上書きしていた。
上記のように、先頭に追加していた場合に誤動作が起きる。
もともとは、デフォルト FORWARD がDROPなので、それより先処理をしようと、先頭にINSERTしていた。
しかし、nftablesでポリシーを書かれると、上書きができない。
accept したら打ち止めにする。->非常にめんどくさい
nftableの書式を考えると。次にようになっているTableA,Bがあるとき
table ip tableA { chain chainA1 { type filter hook forward priority filter + 1; policy drop; } } table ip tableB { chain chainB1 { type filter hook forward priority filter + 2; policy drop; oifname "eth1" accept } }
tableBのほうが優先度が高いので、tableBでAcceptする。そのあと優先度の低い、TableAが評価されてDropされる。
なので、Dropがあるとめんどくさい。
iptablesのときは iptables -I
で強引に上書きするようなルールがかけたのですが、nftablesで管理されている場合、nftablesでDROPされていると、iptables で上書きするようなルールを突っ込んでもnftablesを上書きできず2つのテーブルが順番に評価され iptables 側でAcceptしてもその後のnftablesでDROPされる。(nftablesにDROPがある場合、nftables->ipablesの順の場合は無条件にDROPされる。)これは非常にめんどくさい。
対応策:iptablesでは無理。
nftablesでdrop を書かれてしまうと、iptablesで上書きすることは上記の理由で非常にめんどくさい。
nftablesでコツコツと先頭に挿入するしか無い。
いまあるforwardチェーンを調べる。
nft list chain inet fw4 forward
たとえば、openwrtのnftableだと次のようにforwardが定義されていた。
table inet fw4 { chain forward { type filter hook forward priority filter; policy drop; ct state established,related accept comment "!fw4: Allow forwarded established and related flows" ct state invalid drop comment "!fw4: Drop flows with invalid conntrack state" iifname { "tun4", "ovpn2", "br-lan" } jump forward_lan comment "!fw4: Handle lan IPv4/IPv6 forward traffic" iifname "pppoe-mopera" jump forward_wan comment "!fw4: Handle wan IPv4/IPv6 forward traffic" jump handle_reject } }
このforwardに追加する
nft insert rule inet fw4 forward oifname eth1 counter accept comment '"takuya: accept eth1"'
このように、nftで追加しないとiptablesでは既存のDROPを上書きできない。
これは、iptablesは固定の1つのFORWARDテーブル、nftablesでは複数のテーブルを優先度に従ってすべて処理し、DROPはそこで打ち止めに、ACCEPTは次のテーブル・ルールに処理を渡し継続するためだとおもう。iptablesでACCEPTしても次のnftでDROPされてしまう。困ったものだ。