知っておくとちょっと便利!nftables によるパケットフィルタリング2

今号では、nftables で設定可能なオプションや、様々な設定方法について、もう少し深堀りして説明します!

代表的なオプション

  • -a (もしくは –handle) オプション
    前回の記事でもご説明した通り、ハンドル番号を表示します。
    # nft --handle list chain inet table1 chain1
    table inet table1 {
            chain chain1 { # handle 1
                    type filter hook input priority filter; policy accept;
                    tcp dport 22 accept # handle 2
                    tcp dport 80 accept # handle 3
            }
    }
    
  • -f オプション
    ファイルに記載されたルールセットを読み込みます。
    nftabels のルールは nft ファイルに定義します。例えば、test.nft というファイルに、下記の内容で新たにテーブル、チェーン、ルールを追加するとします。
    table inet table2 {
            chain chain2 {
                    type filter hook input priority filter; policy accept;
                    tcp dport 25 accept
            }
    }
    

    test.nft を -f オプションを指定して読み込みます。

    # nft -f test.nft
    

    nft list ruleset コマンドでルールセットを確認してみると、test.nft で指定したテーブル、チェーン、ルールが追加されたことが分かります。

    # nft list ruleset
    table inet table1 {
            chain chain1 {
                    type filter hook input priority filter; policy accept;
                    tcp dport 22 accept
                    tcp dport 80 accept
            }
    }
    table inet table2 {
            chain chain2 {
                    type filter hook input priority filter; policy accept;
                    tcp dport 25 accept
            }
    }
    
  • -c オプション
    nft ファイルの構文が正しいかを確認します。
    # nft -c -f test.nft
    

    何らかの構文ミスがあった場合、下記の様に表示されることがあります。

    # nft -c -f test.nft
    

ルールの書き方

ルールを設定する際の基本的な構造は、①条件 (どんなプロトコルやパケットが対象か) と、②処理 (そのパケットをどうするか) となります。

前回の記事での例を見てみましょう。

# nft add rule inet table1 chain1 tcp dport 22 accept
# nft add rule inet table1 chain1 tcp dport 80 accept

この場合、tcp dport が ①22 accept や 80 accept が②になります。

ちなみに、①に指定可能なパラメータとしては、下記のようなものがあります。

プロトコルの種類

  • tcp
  • udp
  • icmp

プロトコルに対する詳細な条件

  • dport
    宛先ポート番号
  • sport
    送信元ポート番号
  • daddr
    宛先 IP アドレス
  • saddr
    送信元 IP アドレス
  • iif
    パケットが入ってきたネットワーク機器名
  • oif
    パケットが出ていくネットワーク機器名

さらに、②に指定可能なパラメータは、下記の通りです。

  • accept
    パケットを許可
  • drop
    パケットを拒否 (送信元に拒否された旨の通知なし)
  • reject
    パケットを拒否 (送信元に拒否された旨の通知あり)

一般的な設定例

最後に、これまでの内容を踏まえ、簡単な設定例を 2つご紹介します。
※あくまで最小限の構成です。必要に応じてルールの追加をしてください。

注意事項

  • これから紹介する設定例では、複数の条件を指定する必要があるため nft ファイルの形式にて記載しました。
    下記の内容を nft 形式のファイルに記載の上 nft -f コマンドでそのファイルを指定し、設定を反映させてください。
  • nft -f コマンド実行後は、設定を永続化するため systemctl reload nftables を実行してください。

設定例

例1:一般的な Web サーバ

・SSH (22)、HTTP (80)、HTTPS (443) のみを許可
・上記以外は拒否

table inet server1 {
    chain input {
        type filter hook input priority 0; policy drop;

        # 確立済み・または関連のある通信を許可 (これがないとレスポンスが遮断される)
        ct state established,related accept

        # 自分の SSH 接続を許可
        tcp dport 22 accept

        # Web サーバ用のポート (80、443) を許可
        tcp dport { 80, 443 } accept

        # ループバックを許可
        iif lo accept
    }

    chain forward {
        type filter hook forward priority 0; policy drop;
    }

    chain output {
        type filter hook output priority 0; policy accept;
    }
}

例2:IP アドレスのブロックリスト

・指定した IP アドレスからのアクセスを拒否 (drop)

table inet server2 {
    chain input {
        type filter hook input priority 0; policy accept;

        # ブロックしたい IP アドレス (1つのルールごとに 1つ)
        ip saddr 192.0.2.10 drop
        ip saddr 192.0.2.50 drop
        ip saddr 203.0.113.12 drop

    }
}
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です