それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

nftablesに変わった後、iptablesで- j ACCEPTが動かない。

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されてしまう。困ったものだ。