持久化 nftables 规则的最佳实践

持久化 nftables 规则的最佳实践

我是 Ubuntu 新手,从使用 iptables 的 CentOS7 主机迁移过来,我对 apf 和 bfd 处理(隐藏)iptables 的方式很满意,而且运行良好

因此,我已迁移到 Ubuntu(20.04 LSR),并且“ubuntu 方式”使用 nftables 和 fail2ban 来实现防火墙自动禁止入侵

我使用 iRedMail 设置了一个基本的 nginx、postfix、dovecot、clamav、roundcube 等邮件服务器,并配置了 fail2ban 来监视日志,以查看是否有人试图入侵邮件服务和 ssh 等。我发现它正确地解析了我的邮件日志,并将 fial2ban 阻止的 ips 存储在表 inet f2b-table 中

这在重启后仍然可以正常使用,但我注意到 /etc/nftables.conf 文件中没有任何 fail2ban 表 - 它有我的基本防火墙,我可以静态更新它以拒绝所有我想要的 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 中添加一个包含任意规则的目录来实现这一点,然后在每次添加地址时将我的表存储到其中,但这看起来很丑陋而且是错误的

如果我想将新的垃圾邮件发送者添加到我的列表中,我可以这样做

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"

现在,当我向表中添加一个块时,需要两个步骤:

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 好的,所以我有点像在自言自语,但是因为我没有收到任何反馈,所以我坚持了我的想法——它正在发挥作用,我编写了这个小小的 banspammer 脚本……它很原始,而且可能非常危险——我没有做过健全性检查,比如检查配置文件路径是否有效,也没有对所述文件进行任何备份等……

由于表条目是 ipv4_addr 类型,nftables 会进行验证,所以我不太担心这一点

请注意,我的特定设置已经在 inet 系列中拥有一个名为 filter 的过滤器 - 我特意将其添加为优先级稍低的列表,我还创建了 /etc/nftables.d 目录并在我的代码中添加了它,以使其解析配置目录,正如我上面提到的

希望有人觉得这有用。

如果有这样的东西,我仍然对更“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这似乎是您正在寻找的以保留您的 netfilter 规则的东西?

相关内容