CentOS 8がリリースされましたが、引き続きnftablesを使用できますか?

前世紀に住んでおらず、クラウドコンピューティングまたは関連分野のブリックムーバーである場合は、CentOS 8の公式バージョンが最近リリースされ、「CentOS」は「RedHat」の再発行に完全に準拠していると聞いたことがあるはずです。ポリシーを作成し、アップストリーム製品と完全に機能的に互換性があるように努めます。 CentOS8の主な変更点はRedHatEnterprise Linux 8と同じです。これは、Fedora28とカーネルバージョン 4.18に基づいています。主なネットワークの変更点は、*の代わりに** nftables ****フレームワークを使用することです。 * iptables ****フレームワークは、デフォルトのネットワークパケットフィルタリングツールとして使用されます。 ** nftablesについて聞いたことがない場合は、今が学ぶべき時です。

nftablesは netfilterプロジェクトであり、既存の{ip、ip6、arp、eb}テーブルフレームワークを置き換え、{ip、ip6}テーブル用の新しいパケットフィルタリングフレームワークと新しいユーザースペースユーティリティ(nft )そして互換性レイヤー。既存のフック、リンク追跡システム、ユーザースペースキューイングコンポーネント、および netfilterロギングサブシステムを使用します。

nftablesは主に、カーネル実装、libnl netlink通信、nftablesユーザースペースの3つのコンポーネントで構成されています。カーネルは netlink構成インターフェースとランタイムルールセット評価を提供し、 libnlはカーネルと通信するための基本機能を含み、ユーザースペースは nftを介してユーザーと対話できます。

この記事では、主にユーザースペースコマンドラインツール nftの使用法を紹介します。

1.

nftables VS iptables

iptablesと同様に、nftablesはテーブル、チェーン、およびルールで構成されます。テーブルにはチェーンが含まれ、チェーンにはルールが含まれ、ルールは実際のアクションです。 iptablesと比較して、nftablesには主に次の変更があります。

nftablesに戻って、デフォルトのルールセットを見てみましょう。

$ nft list ruleset

何も、実際には組み込みのチェーンはありません( firewalldサービスをオフにした場合)。

2.

テーブルを作成

nftablesの各テーブルにはアドレスクラスターが1つだけあり、そのクラスターのデータパケットにのみ適用できます。テーブルは、次の5つのクラスターのいずれかを指定できます。

nftables cluster iptablesコマンドラインツール
ip iptables
ip6 ip6tables
inet iptablesおよびip6tables
arp arptables
bridge ebtables

inetはIPv4パケットとIPv6パケットの両方に適用できます。つまり、 ipクラスターと ip6クラスターが統合されているため、ルールの定義が簡単です。次の例では、すべてinetクラスターを使用します。

まず、新しいテーブルを作成します。

$ nft add table inet my_table

すべてのルールを一覧表示します。

$ nft list ruleset
table inet my_table {}

これで、テーブルにルールはありません。ルールを格納するチェーンを作成する必要があります。

3.

チェーンを作成

チェーンはルールを格納するために使用されます。nftablesにはチェーンが組み込まれていないため、テーブルと同様にチェーンも明示的に作成する必要があります。チェーンには2つのタイプがあります。

通常のチェーンを作成します。

$ nft add chain inet my_table my_utility_chain

基本的なチェーンを作成します。

$ nft add chain inet my_table my_filter_chain { type filter hook input priority 0 \;}

チェーン内のすべてのルールを一覧表示します。

$ nft list chain inet my_table my_utility_chain
table inet my_table {
  chain my_utility_chain {}}

$ nft list chain inet my_table my_filter_chain
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;}}

4.

ルールを作成

テーブルとチェーンを作成したら、ステートメントまたは式で構成され、チェーンに含まれるルールを作成できます。 SSHログインを許可するには、以下のルールを追加してください。

$ nft add rule inet my_table my_filter_chain tcp dport ssh accept

addは、ルールをチェーンの最後に追加することを意味します。ルールをチェーンの最初に追加する場合は、 insertを使用できます。

$ nft insert rule inet my_table my_filter_chain tcp dport http accept

すべてのルールを一覧表示します。

$ nft list ruleset
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    tcp dport http accept
    tcp dport ssh accept
        }}

insertが以前に使用されたため、httpルールはsshルールの前に来ることに注意してください。

ルールをチェーンの指定された位置に挿入することもできます。2つの方法があります。

1、 ルールのインデックスを指定するには、 indexを使用します。 addは、新しいルールがインデックス位置のルールの後に追加されることを意味し、 inserは、新しいルールがインデックス位置のルールの前に追加されることを意味します。 indexの値は0から増加します。

$ nft insert rule inet my_table my_filter_chain index 1 tcp dport nfs accept
$ nft list ruleset
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    tcp dport http accept
    tcp dport nfs accept
    tcp dport ssh accept
     }}

$ nft add rule inet my_table my_filter_chain index 0 tcp dport 1234 accept
$ nft list ruleset
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    tcp dport http accept
    tcp dport 1234 accept
    tcp dport nfs accept
    tcp dport ssh accept
     }}

indexはiptablesの -Iオプションに似ていますが、注意すべき点が2つあります。1つはindexの値が0から始まること、もう1つはindexが nft insertrule…index0などの既存のルールを指している必要があることです。違法。

2、 ルールのハンドルを指定するには、 handleを使用します。 addは、新しいルールがインデックス位置のルールの後に追加されることを意味し、 inserは、新しいルールがインデックス位置のルールの前に追加されることを意味します。 handleの値は、パラメータ --handleによって取得できます。

$ nft --handle list ruleset
table inet my_table { # handle 10
  chain my_filter_chain { # handle 2
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 4
    tcp dport 1234 accept # handle 6
    tcp dport nfs accept # handle 5
    tcp dport ssh accept # handle 3}}

$ nft add rule inet my_table my_filter_chain handle 4 tcp dport 1234 accept
$ nft insert rule inet my_table my_filter_chain handle 5 tcp dport nfs accept
$ nft --handle list ruleset
table inet my_table { # handle 10
  chain my_filter_chain { # handle 2
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 4
    tcp dport 2345 accept # handle 8
    tcp dport 1234 accept # handle 6
    tcp dport 3456 accept # handle 9
    tcp dport nfs accept # handle 5
    tcp dport ssh accept # handle 3}}

nftablesでは、ルールが削除されない限り、ハンドル値は固定されます。これにより、ルールの安定したインデックスが提供されます。 indexの値は可変であり、新しいルールが挿入されている限り、変更される可能性があります。一般に、 handleを使用して新しいルールを挿入することをお勧めします。

ルールの作成時にルールのハンドル値を取得することもできます。ルールの作成時にパラメータ --echoと --handleを同時に追加するだけで済みます。

$ nft --echo --handle add rule inet my_table my_filter_chain udp dport 3333 accept
add rule inet my_table my_filter_chain udp dport 3333 accept # handle 10

5.

ルールを削除

単一のルールは、そのハンドルを介してのみ削除できます。まず、削除するルールハンドルを見つける必要があります。

$ nft --handle list ruleset
table inet my_table { # handle 10
  chain my_filter_chain { # handle 2
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 4
    tcp dport 2345 accept # handle 8
    tcp dport 1234 accept # handle 6
    tcp dport 3456 accept # handle 9
    tcp dport nfs accept # handle 5
    tcp dport ssh accept # handle 3
    udp dport 3333 accept # handle 10}}

次に、ハンドル値を使用してルールを削除します。

$ nft delete rule inet my_table my_filter_chain handle 8
$ nft --handle list ruleset
table inet my_table { # handle 10
  chain my_filter_chain { # handle 2
    type filter hook input priority 0; policy accept;
    tcp dport http accept # handle 4
    tcp dport 1234 accept # handle 6
    tcp dport 3456 accept # handle 9
    tcp dport nfs accept # handle 5
    tcp dport ssh accept # handle 3
    udp dport 3333 accept # handle 10}}

6.

リストルール

前の例ではすべてのルールをリストしていますが、必要に応じてルールの一部をリストすることもできます。例えば:

テーブル内のすべてのルールを一覧表示します。

$ nft list table inet my_table
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    tcp dport http accept
    tcp dport 1234 accept
    tcp dport 3456 accept
    tcp dport nfs accept
    tcp dport ssh accept
    udp dport 3333 accept
        }}

チェーン内のすべてのルールを一覧表示します。

$ nft list chain inet my_table my_other_chain
table inet my_table {
 chain my_other_chain {
  udp dport 12345 log prefix "UDP-12345"}}

7.

セットする

nftablesの構文は、コレクションをネイティブにサポートします。コレクションは、複数のIPアドレス、ポート番号、ネットワークカード、またはその他の条件に一致させるために使用できます。

匿名コレクション

コレクションは、匿名コレクションと名前付きコレクションに分けられます。匿名コレクションは、将来変更する必要のないルールに適しています。

たとえば、次のルールは、送信元IPが「10.10.10.123〜10.10.10.231」の範囲にあるホストからのトラフィックを許可します。

$ nft add rule inet my_table my_filter_chain ip saddr {10.10.10.123,10.10.10.231} accept
$ nft list ruleset
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    tcp dport http accept
    tcp dport nfs accept
    tcp dport ssh accept
    ip saddr {10.10.10.123,10.10.10.231} accept
        }}

匿名コレクションの欠点は、コレクションを変更する必要がある場合、ルールを置き換える必要があることです。後でコレクションを頻繁に変更する必要がある場合は、名前付きコレクションを使用することをお勧めします。

前の例で追加されたルールは、セットによって簡略化することもできます。

$ nft add rule inet my_table my_filter_chain tcp dport { http, nfs, ssh } accept

iptablesは ipsetを使用してコレクションを使用でき、nftablesはネイティブにコレクションをサポートするため、 ipsetに頼る必要はありません。

コレクションに名前を付ける

nftablesは名前付きコレクションもサポートしており、名前付きコレクションは変更できます。コレクションを作成するには、その要素のタイプを指定する必要があります。現在サポートされているデータタイプは次のとおりです。

まず、空の名前付きコレクションを作成します。

$ nft add set inet my_table my_set { type ipv4_addr \;}
$ nft list sets
table inet my_table {set my_set {
    type ipv4_addr
        }}

ルールを追加するときにコレクションを参照するには、 @記号を使用してコレクションの名前を確認できます。次のルールは、セット my_setのIPアドレスをブラックリストに追加することを意味します。

$ nft insert rule inet my_table my_filter_chain ip saddr @my_set drop
$ nft list chain inet my_table my_filter_chain
table inet my_table {
  chain my_filter_chain {
    type filter hook input priority 0; policy accept;
    ip saddr @my_set drop
    tcp dport http accept
    tcp dport nfs accept
    tcp dport ssh accept
    ip saddr {10.10.10.123,10.10.10.231} accept
        }}

コレクションに要素を追加します。

$ nft add element inet my_table my_set {10.10.10.22,10.10.10.33}
$ nft list set inet my_table my_set
table inet my_table {set my_set {
    type ipv4_addr
    elements ={10.10.10.22,10.10.10.33}}}

コレクションに間隔を追加すると、エラーが報告されます。

$ nft add element inet my_table my_set {10.20.20.0-10.20.20.255}

Error: Set member cannot be range, missing interval flag on declaration
add element inet my_table my_set {10.20.20.0-10.20.20.255}^^^^^^^^^^^^^^^^^^^^^^^

コレクションで間隔を使用する場合は、適切なデータ構造を採用するためにカーネルがコレクションに格納されているデータのタイプを事前に確認する必要があるため、フラグ intervalを追加する必要があります。

サポート間隔

サポート間隔の名前付きコレクションを作成します。

$ nft add set inet my_table my_range_set { type ipv4_addr \; flags interval
$ nft add element inet my_table my_range_set {10.20.20.0/24}
$ nft list set inet my_table my_range_set
table inet my_table {set my_range_set {
    type ipv4_addr
    flags interval
    elements ={10.20.20.0/24}}}

サブネットマスク表記は暗黙的にIPアドレスの範囲に変換されます。範囲 10.20.20.0-10.20.20.255を直接使用して、同じ効果を得ることができます。

さまざまなタイプをカスケード

名前付きコレクションは、カスケード演算子 .で区切られた、さまざまなタイプの要素のカスケードもサポートします。たとえば、次のルールは、IPアドレス、プロトコル、およびポート番号を一度に一致させることができます。

$ nft add set inet my_table my_concat_set  { type ipv4_addr . inet_proto . inet_service \;}

$ nft list set inet my_table my_concat_set
table inet my_table {set my_concat_set {
    type ipv4_addr . inet_proto . inet_service
        }}

コレクションに要素を追加します。

$ nft add element inet my_table my_concat_set {10.30.30.30. tcp . telnet }

ルールで参照されるカスケードタイプのセットは以前と同じですが、セット内の各要素がルール内のどの位置に対応するかを示す必要があります。

$ nft add rule inet my_table my_filter_chain ip saddr . meta l4proto . tcp dport @my_concat_set accept

これは、パケットの送信元IP、プロトコルタイプ、および宛先ポートが 10.30.30.30、tcp、telnetと一致する場合、nftablesがパケットの通過を許可することを意味します。

匿名コレクションでは、次のようなカスケード要素を使用することもできます。

$ nft add rule inet my_table my_filter_chain ip saddr . meta l4proto . udp dport {10.30.30.30. udp . bootps } accept

これで、nftablesコレクションのパワーを理解できるはずです。

nftablesカスケードタイプのコレクションは、 hash:ip、portなどのipsetの集約タイプに似ています。

8.

辞書

ディクショナリはnftablesの高度な機能であり、さまざまなタイプのデータを使用して、一致条件を特定のルールにマップできます。また、ハッシュマッピング方式であるため、チェーンルールジャンプのパフォーマンスオーバーヘッドを完全に回避できます。

たとえば、TCPパケットとUDPパケットの処理ルールを論理的に分離するために、辞書を使用して実装することができます。これにより、上記の要件をルールを通じて実現できます。

$ nft add chain inet my_table my_tcp_chain
$ nft add chain inet my_table my_udp_chain
$ nft add rule inet my_table my_filter_chain meta l4proto vmap { tcp : jump my_tcp_chain, udp : jump my_udp_chain }
$ nft list chain inet my_table my_filter_chain
table inet my_table {
 chain my_filter_chain {...
 meta nfproto ipv4 ip saddr . meta l4proto . udp dport {10.30.30.30. udp . bootps } accept
 meta l4proto vmap { tcp : jump my_tcp_chain, udp : jump my_udp_chain }}}

コレクションと同様に、匿名の辞書に加えて、名前付きの辞書を作成することもできます。

$ nft add map inet my_table my_vmap { type inet_proto : verdict \;}

辞書に要素を追加します。

$ nft add element inet my_table my_vmap {192.168.0.10: drop,192.168.0.11: accept }

辞書の要素は、後でルールで参照できます。

$ nft add rule inet my_table my_filter_chain ip saddr vmap @my_vmap

9.

テーブルと名前名

nftablesでは、各テーブルは独立した名前名です。つまり、異なるテーブルのチェーン、セット、辞書などはすべて同じ名前を持つことができます。例えば:

$ nft add table inet table_one
$ nft add chain inet table_one my_chain
$ nft add table inet table_two
$ nft add chain inet table_two my_chain
$ nft list ruleset
...
table inet table_one {
 chain my_chain {}}
table inet table_two {
 chain my_chain {}}

この機能を使用すると、さまざまなアプリケーションが相互に影響を与えることなく独自のテーブルのルールを管理できます。これは、 iptablesでは不可能です。

もちろん、この機能にも欠陥があります。各テーブルは独立したファイアウォールと見なされるため、特定のデータパケットは、実際にリリースされる前に、すべてのテーブルのルールによってリリースされる必要があります。「table_one」でデータパケットの通過が許可されている場合でも、データパケットは、 table_twoによって引き続き拒否される場合があります。この問題を解決するために、nftablesはpriorityを導入します。 priorityの値が高いほど優先度が低くなるため、 priorityの値が低いチェーンが priorityの値が高いチェーンの前に実行されます。 2つのチェーンの優先順位が同じである場合、それらは競争状態になります。

10.

バックアップと復元

上記のすべての例のルールは一時的なものです。永続的に有効にするために、ルールをバックアップし、再起動後に自動的にロードして復元できます。実際、nftablesの systemdサービスは次のように機能します。

バックアップルール:

$ nft list ruleset >/root/nftables.conf

負荷回復:

$ nft -f /root/nftables.conf

CentOS 8では、 nftables.serviceのルールは / etc / nftables.confに保存されます。これには、他のいくつかのルール例が含まれ、通常はファイル / etc / sysconfig / nftables.confにありますが、デフォルトではコメントアウトされます。

11.

総括する

この記事の説明を通して、nftablesの機能と使用法を理解していただければ幸いです。もちろん、この記事には簡単な使用法しか含まれていません。より高度な使用法については、nftablesの公式「wiki」を確認するか、次の記事をお待ちください。この記事の知識があれば、nftablesを使用してLinuxスマートディストリビューションを実装できるはずです。詳細については、以下のQRコードをスキャンして、この記事を参照してください:Linuxグローバルインテリジェントディストリビューションスキーム。

Recommended Posts

CentOS 8がリリースされましたが、引き続きnftablesを使用できますか?