2.3.4. nft コマンドを使用したテーブル、チェーン、ルールの管理

コマンドラインまたはシェルスクリプトで nftables ファイアウォールを管理するには、nft ユーティリティーを使用します。

重要

この手順のコマンドは通常のワークフローを表しておらず、最適化されていません。この手順では、nft コマンドを使用して、一般的なテーブル、チェーン、およびルールを管理する方法を説明します。

手順

  1. テーブルが IPv4 パケットと IPv6 パケットの両方を処理できるように、inet アドレスファミリーを使用して nftables_svc という名前のテーブルを作成します。

    # nft add table inet nftables_svc
  2. 受信ネットワークトラフィックを処理する INPUT という名前のベースチェーンを inet nftables_svc テーブルに追加します。

    # nft add chain inet nftables_svc INPUT { type filter hook input priority filter \; policy accept \; }

    シェルがセミコロンをコマンドの最後として解釈しないようにするには、\ 文字を使用してセミコロンをエスケープします。

  3. INPUT チェーンにルールを追加します。たとえば、INPUT チェーンの最後のルールとして、ポート 22 および 443 で着信 TCP トラフィックを許可し、Internet Control Message Protocol (ICMP)ポートに到達できないメッセージで他の着信トラフィックを拒否します。

    # nft add rule inet nftables_svc INPUT tcp dport 22 accept
    # nft add rule inet nftables_svc INPUT tcp dport 443 accept
    # nft add rule inet nftables_svc INPUT reject with icmpx type port-unreachable

    ここで示されたように nft add rule コマンドを実行すると、nft はコマンド実行と同じ順序でルールをチェーンに追加します。

  4. ハンドルを含む現在のルールセットを表示します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 443 accept # handle 3
        reject # handle 4
      }
    }
  5. ハンドル 3 で既存ルールの前にルールを挿入します。たとえば、ポート 636 で TCP トラフィックを許可するルールを挿入するには、以下を入力します。

    # nft insert rule inet nftables_svc INPUT position 3 tcp dport 636 accept
  6. ハンドル 3 で、既存ルールの後ろにルールを追加します。たとえば、ポート 80 で TCP トラフィックを許可するルールを追加するには、以下を入力します。

    # nft add rule inet nftables_svc INPUT position 3 tcp dport 80 accept
  7. ハンドルでルールセットを再表示します。後で追加したルールが指定の位置に追加されていることを確認します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        tcp dport 80 accept # handle 6
        reject # handle 4
      }
    }
  8. ハンドル 6 でルールを削除します。

    # nft delete rule inet nftables_svc INPUT handle 6

    ルールを削除するには、ハンドルを指定する必要があります。

  9. ルールセットを表示し、削除されたルールがもう存在しないことを確認します。

    # nft -a list table inet nftables_svc
    table inet nftables_svc { # handle 13
      chain INPUT { # handle 1
        type filter hook input priority filter; policy accept;
        tcp dport 22 accept # handle 2
        tcp dport 636 accept # handle 5
        tcp dport 443 accept # handle 3
        reject # handle 4
      }
    }
  10. INPUT チェーンから残りのルールをすべて削除します。

    # nft flush chain inet nftables_svc INPUT
  11. ルールセットを表示し、INPUT チェーンが空であることを確認します。

    # nft list table inet nftables_svc
    table inet nftables_svc {
      chain INPUT {
        type filter hook input priority filter; policy accept
      }
    }
  12. INPUT チェーンを削除します。

    # nft delete chain inet nftables_svc INPUT

    このコマンドを使用して、まだルールが含まれているチェーンを削除することもできます。

  13. ルールセットを表示し、INPUT チェーンが削除されたことを確認します。

    # nft list table inet nftables_svc
    table inet nftables_svc {
    }
  14. nftables_svc テーブルを削除します。

    # nft delete table inet nftables_svc

    このコマンドを使用して、まだルールが含まれているテーブルを削除することもできます。

    注記

    ルールセット全体を削除するには、個別のコマンドですべてのルール、チェーン、およびテーブルを手動で削除するのではなく、nft flush ruleset コマンドを使用します。

関連情報

nft(8) man ページ