Linux 3.13登場
Linux 3.13は何より、nftablesの最初のオフィシャルリリースである。nfstablesは、既存のiptablesで知られる{ip, ip6, arp, eb}tablesフレームワークを置き換える目的を持ったプロジェクトだ。Linux 3.13に含まれるnftablesはまだ完全ではなく、いくつかの重要な機能が不足しているが、今後のLinuxバージョンで登場してくるだろう。既に多くのケースでは使い物になるものだが、完全なサポート(nftablesがiptablesよりも高いレベルに達するという意味)はLinux 3.15になる予定だ。
nftablesには、nftという新しいコマンドラインツールが含まれている。nftは、iptablesやその派生したもの(ipt6tables, arptables)を継承するものだ。そして、完全に違う文法を持っている。そう、あなたがiptablesになれているのなら、これはショックな出来事だ。ただし、カーネル上ではnftablesによってフィルタリングが行われている環境でも、iptablesを使うことができる互換レイヤが存在している。
今のところほんのごく少しのドキュメントしか世の中には存在していない。私のnftablesクイックHowtoを見るか、その他の新たな情報がもうすぐ一般に出回るだろう。
コマンドラインの例
1行で複数のルールを書く
iptablesで、パケットのログを取ってから破棄したいとしよう。2つのルールを書く必要がある。一つはログを取るため、もう一つは破棄するためだ。
iptables -A FORWARD -p tcp --dport 22 -j LOG
iptables -A FORWARD -p tcp --dport 22 -j DROP
nftでは、2つのターゲットをまとめることができる。
nft add rule filter forward tcp dport 22 log drop
ルールのセットの作成
異なるポート、異なるicmpv6タイプのパケットを許可したいとしよう。iptablesの場合は以下のようにする必要がある。
ip6tables -A INPUT -p tcp -m multiport --dports 23,80,443 -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-solicitation -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type echo-request -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type router-advertisement -j ACCEPT
ip6tables -A INPUT -p icmpv6 --icmpv6-type neighbor-advertisement -j ACCEPT
nftでは、ルール内のあらゆる要素にセットが使える。
nft add rule ip6 filter tcp dport {telnet, http, https} accept
nft add rule filter input icmpv6 type { nd-neighbor-solicit, echo-request, nd-router-advert, nd-neighbor-advert } accept
簡単にかけて、プロトコルごとに1つのルールだけになるので、フィルタリングの点でも効率的になる。
後から呼び出すこともできるように、名前付きセットも使える。
# nft -i # use interactive mode
nft> add set global ipv4_ad { type ipv4_address;}
nft> add element global ipv4_ad { 192.168.1.4, 192.168.1.5 }
nft> add rule ip global filter ip saddr @ipv4_ad drop
この後別な悪ガキが出現したら…
# nft -i
nft> add element global ipv4_ad { 192.168.3.4 }
マッピング
nftablesの高度な機能の一つがマッピングだ。異なるデータタイプをつなぐことができる。例として、インタフェースとそれ専用のルールセット(チェーン内に既にあって事前に作成していたもの)を関連付けてみよう。この例では、チェーンはlow_secとhigh_secという名前だ。
# nft -i
nft> add map filter jump_map { type ifindex => verdict; }
nft> add element filter jump_map { eth0 => jump low_sec; }
nft> add element filter jump_map { eth1 => jump high_sec; }
nft> add rule filter input meta iif vmap @jump_map
これで、新しいダイナミックインタフェースppp1があるとすると、そのフィルタを設定するのが簡単になる。単純に、jump_mapマッピングに追加すればいいだけだ。
nft> add element filter jump_map { ppp1 => jump low_sec; }
管理とカーネル側の動作
アップデートの高速化
iptablesでルールを追加すると、ルールの数が増えるに従って劇的に処理が遅くなっていて、それがiptablesを使ったスクリプトの処理に時間がかかる原因になっていた。この点は、ルールセットの更新をアトミックで高速に行うnftablesでは解消されている。
カーネルアップデートの減少
iptablesでは、マッチやターゲットごとにカーネルモジュールが必要だった。そのため、新しい何かを使いたかったり、取り込み忘れたものがあった時は、カーネルのリコンパイルからやる必要があった。これもnftablesでは必要なくなった。nftablesでは、ほとんどの処理はユーザスペースで実行され、カーネルはいくつかの基本的な命令のみを認識する(フィルタリングは仮状態マシンとして実装されている)。例えば、icmpv6サポートは、ntfツールのシンプルなパッチとして実現されている。iptablesでこの類の変更をする場合は、カーネルとiptablesのアップグレードが必要だった。