nftables ルールを永続化するためのベストプラクティス

nftables ルールを永続化するためのベストプラクティス

私はUbuntu初心者で、iptablesを使用していたCentOS7のホスティングから移行しましたが、apfとbfdがiptablesを(隠して)処理する方法に慣れていました。うまく機能していました。

そこで、私はUbuntu(20.04 LSR)に移行しましたが、侵入の試みを自動的に禁止するファイアウォールを実行する「Ubuntu方式」は、nftablesとfail2banのようです。

iRedMail を使用して、nginx、postfix、dovecot、clamav、roundcube などの基本的なメール サーバーをセットアップし、fail2ban を設定して、メール サービスや ssh などへのハッキングの試みのログを監視しました。また、fail2ban がメール ログを正しく解析し、fail2ban でブロックされた IP を inet f2b-table テーブルに保存することを確認しました。

これは再起動後も正常に動作しますが、/etc/nftables.conf ファイルには fail2ban テーブルが 1 つも含まれていないことに気付きました。このファイルには、必要なすべての TCP ポート (基本的にメール、Web サーバー、SSH) を拒否してブロック解除するように静的に更新できる基本ファイアウォールが含まれています。

しかし、私が見る限り、fail2banルールは設定ファイルにはなく、iRedMailによって設定されたmysqlデータベースのfail2banテーブルのエントリから起動時に再構築されるようです。

これは問題ありません...しかし、ここにジレンマがあります。fail2ban の既存のテーブルを利用してファイアウォールにルールを手動で追加すると、次のようになります。

nft add element inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }

表示され、動作します。自分自身を正常にロックアウトし、ローカル コンソール経由で削除してテストしました。

ただし、再起動すると、テーブル全体が失われ、fail2ban によってテーブル エントリから再構築されます (これも問題ありません)

そこで、私は自分の新しいテーブルやものを追加しました

table inet spammers {
    set blackhole {
            type ipv4_addr
            elements = { sample.ip.addr.here }
    }

    chain spammers-chain {
            type filter hook input priority filter - 2; policy accept;
            ip saddr @blackhole drop
    }
 }

再度、これをテストしたところ、うまく動作しましたが、これを永続化するには、/etc/nftables.conf に書き込むか、ルールなどを読み込むようにそのディレクトリを設定する必要があります。

nftables.confに任意のルールのディレクトリへのincludeを追加し、アドレスを追加するたびにテーブルをそこに保存することでこれを行うことができますが、これは見苦しく間違っているようです。

例えば、新しいスパマーをリストに追加したい場合、

nft add element inet spammers blackhole { new.ip.addr.here }

しかし、その後、テーブルをファイルに永続化する必要があるのでしょうか?

nft list table inet spammers > /etc/nftables.d/spammers.conf

だから、それが私ができる一つの方法ですが、他の人がnetfilter-persistについて話しているのを見たことがありますが、それはUbuntuの一部ではないので、私が独自の車輪を発明するか、netfilter-persistのウサギの穴に落ちるか、(いやいや)fail2banがやったと思われることと似たことをする前に...(禁止されたIPをデータベースに保存し、ログイン時にリストを再構築する)

これを行う方法はいくつか考えられますが、ここで見逃している「ベスト プラクティス」の「Ubuntu 方式」があるのではないかと考えていました...

更新/編集: より良い提案がない限り、今のところの私の「解決策」は

mkdir /etc/nftables.d/
nft list table inet spammers > /etc/nftables.d/spammers.conf

そして、/etc/nftables.confを編集して、一番下に次の行を追加しました。

include "/etc/nftables.d/*.conf"

さて、テーブルにブロックを追加するときは、次の 2 つの手順を実行します。

nft add element inet spammers blackhole { some.evildoer.ip.address }
nft list table inet spammers > /etc/nftables.d/spammers.conf

あまりきれいではありませんが、間違いなく機能します。もちろん、これをすべて独自のカスタムスクリプトでラップして、次のようなものを呼び出すこともできます。

banspammer "badguy.ip.addr.here"

そして、banspammer は指定されたアドレス要素を追加し、更新されたテーブル定義を保存します...

繰り返しますが、これは単に「ベストプラクティスではない」ように思えるので、質問します。

編集: 2021-12-22 まあ、独り言のような感じですが、フィードバックがなかったので、自分のアイデアで進めました。うまく機能していて、この小さなバンスパマー スクリプトを書きました...これは生のもので、おそらく非常に危険です。構成ファイルのパスが有効かどうかを確認するなどの健全性チェックは行わず、そのファイルのバックアップも行いませんでした...

テーブルエントリはipv4_addr型なので、nftablesは検証を行うので、あまり心配する必要はありません。

私の特定の設定では、inet ファミリーに filter という名前のフィルタが既に存在していたことに注意してください。私はこれを少し低い優先度のリストとして明示的に追加しました。また、/etc/nftables.d ディレクトリを作成し、上記のように config ディレクトリを解析するコードを追加しました。

誰かにとってこれが役に立つことを願っています。

もしそのようなものがあれば、私はまだもっと「Ubuntu 風」なものに興味があるでしょう。

#!/usr/bin/sh

################################################################################
# banspammer                         2021-12-22                 DigitalSorceress
#  
# SUMMARY
# This script adds an ip or range of Ips (see element adding) to nftables
# specifically to my spammer blackhole
# it also persists it out to /etc/nftables.d/spammers.conf
#
# put this somewhere like /root/tandautils
# then go to /user/local/sbin and ln -s /root/tandautils/banspammer.sh banspammer
#
################################################################################

# Handle command line args
COMMAND=$1
ADDRESS=$2


# the location of the ssh daemon config file
# default for CentOS is CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf



# Here are the subroutines for individual actions
ban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "adding spammer to blackhole ..."
    
    nft add element inet spammers blackhole { ${ADDRESS} }
    BAN_SPAMMER_RESULT=$?
    if [ $BAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} added to spammer table"
    fi
    echo ""
}

unban_spammer () {
    # Issue the basic command to ban the spammer 
    echo "removing spammer from blackhole ..."
    
    nft delete element inet spammers blackhole { ${ADDRESS} }

    UNBAN_SPAMMER_RESULT=$?
    if [ $UNBAN_SPAMMER_RESULT -eq 0 ] 
    then
        echo "  DONE: ${ADDRESS} removed from table"
    fi
    echo ""
}

persist_spamtable () {
    echo "persisting out spamtable to ${CONFIG_FILE}..."
    # we need to persist out the spam table to the config
    nft list table inet spammers > ${CONFIG_FILE}
    if [ $? -eq 0 ]
    then
      echo "  done.. showing table..."
      echo ""
      nft list table inet spammers
    else
      echo "error persisting table.. "
    fi
    echo ""
}

list_spamtable () {
    echo "listing out spamtable"
    echo ""
    nft list table inet spammers
    echo ""
}

kill_spamtable () {
    echo "resetting /creating blank spamtable ${CONFIG_FILE}..."

    #rm -f /etc/nftables.d/spammers.conf
    tee /etc/nftables.d/spammers.conf <<EOF
table inet spammers {
    set blackhole {
        type ipv4_addr
    }

    chain spammers-chain {
        type filter hook input priority filter - 2; policy accept;
        ip saddr @blackhole drop
    }
}
EOF
    echo ""
    if [ $? -eq 0 ]
    then
        echo "success.. here's the new file:"
        echo ""
        cat /etc/hftables.d/spammers.conf
    else
        echo "error writing file... "
    fi
    
    echo ""
}

help_me () {
  echo "This is a tool to simplify blocking of IP addesses of spammers                  "
  echo "                                                                                "
  echo "banspammer                          2021-12-22                  DigitalSorceress" 
  echo "                                                                                "
  echo "SUMMARY                                                                         "
  echo " This script is used to simplify the act of adding/removing spammers from       "
  echo " a spammers table in the nftables ruleset                                       "
  echo "                                                                                "
  echo "                                                                                "
  echo "usage: $0 banspammer command [address]                                          "
  echo "                                                                                "
  echo " command options:                                                               "
  echo "           ban address                                                          "
  echo "             bans the target address; can be a singe IP or comma sep list       "
  echo "                                                                                "
  echo "           unban address                                                        "
  echo "             removes the target address can be a singe IP or comma sep list     "
  echo "                                                                                "
  echo "           reset                                                                "
  echo "             clears all entries from the spammers table                         "
  echo "             note this can be used to create a new empty table                  "
  echo "                                                                                "
  echo "           show                                                                 "
  echo "             shows the current spam table list                                  "
  echo "                                                                                "
  echo "           help                                                                 "
  echo "             Displays this help dialog                                          "
}



# Here is where we do the actual work based on the passed command
case "$COMMAND" in
  ban)
    if [ $# -eq 2 ] 
    then
        echo "banning address: ${ADDRESS}"
        ban_spammer ${ADDRESS}
      if [ $BAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    else
        echo "ban command requires a single IP or comma separated list of IPs "
    fi
    ;;
  unban)
    if [ $# -eq 2 ] 
    then
      echo "unbanning address: ${ADDRESS}"
      unban_spammer ${ADDRESS}
      if [ $UNBAN_SPAMMER_RESULT -eq 0 ]
      then
        persist_spamtable
      fi
    fi
    ;;
  show)
      list_spamtable
      ;;
  reset)
      kill_spamtable
      ;;
  help)
    help_me
    ;;
  *)
      echo "Usage: $0 ban|unban comma-separated-ip-list  or $0 show|reset"
      exit 1
esac

答え1

apt-get install iptables-persistentそれが引き込まれると、netfilter-persistentネットフィルターのルールを維持するために探していたものになるでしょうか?

関連情報