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