我是 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 规则的东西?