前世紀に住んでおらず、クラウドコンピューティングまたは関連分野のブリックムーバーである場合は、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には主に次の変更があります。
iptablesルールのレイアウトは、メモリの連続ブロック、つまり配列レイアウトに基づいていますが、 nftablesのルールはチェーンレイアウトを使用します。実際、それは配列とリンクされたリストの違いです。Kubernetesユーザーはこれに非常に興奮しているはずですか? iptablesの作業のほとんどはカーネルモードで行われます。新しい関数を追加する場合は、カーネルを再コンパイルすることしかできません。一方、 nftablesの作業のほとんどはユーザーモードで行われます。新しい関数を追加するのは簡単で、カーネルを変更する必要はありません。 iptablesにはチェーンが組み込まれています。チェーンが1つだけ必要な場合でも、他のチェーンも登録されます。nftablesには組み込みのチェーンはありませんが、オンデマンドで登録できます。 iptablesにはパケットカウンターが組み込まれているため、これらの組み込みチェーンが空であっても、パフォーマンスが低下します。IPv4 / IPv6デュアルスタック管理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 \;}
\)はエスケープに使用されるため、シェルはセミコロンをコマンドの終わりとして解釈しません。 priorityは負の数の整数値を使用し、小さい値のチェーンが最初に処理されます。チェーン内のすべてのルールを一覧表示します。
$ 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は名前付きコレクションもサポートしており、名前付きコレクションは変更できます。コレクションを作成するには、その要素のタイプを指定する必要があります。現在サポートされているデータタイプは次のとおりです。
ipv4_addr:IPv4アドレス ipv6_addr:IPv6アドレス ether_addr:イーサネットアドレス inet_proto:ネットワークプロトコル inet_service:ネットワークサービス mark:マークタイプまず、空の名前付きコレクションを作成します。
$ 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