如何删除某个端口的所有 ufw 规则?

如何删除某个端口的所有 ufw 规则?

我正在使用 ansible 在我的 DB 服务器上配置 ufw,以便只接受来自某些服务器到特定端口的连接(比如说1234)。

当曾经具有访问权限的服务器从池中取出时,可能会忘记删除该服务器的访问规则。

我的解决方案:制定规则时,我想删除所有端口规则1234,然后使用当前池中的服务器重新创建它们。

不幸的是,ufw delete需要精确指定要删除的规则(端口、协议、scr IP、...)。

我尝试过类似的解决方案ufw delete $(ufw status numbered | grep 1234 | <get all the numbers of the rules> ),但它变得非常糟糕,而且速度非常快。

有没有更好的方法来删除某个端口的所有规则?

答案1

这里有两个问题需要解决:

  1. 生成与所需字符串匹配的 ufw 规则编号列表。
  2. 让 shell 扩展此列表并将其添加到“ufw delete [规则编号]”命令序列的末尾。

我认为我可以通过 bash 中的这一行代码解决第一个问题:

ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}')

上面的示例与字符串“80 / tcp”的任何防火墙规则匹配,并仅打印去掉括号的规则编号。

我还没有解决问题#2,因为据我所知,“ufw delete”命令没有抑制“(y | n)”确认提示的开关,从而阻碍了自动化。

但是,您可以运行下面的命令,并通过按“y”键确认,然后按向上箭头 => 输入以重复,手动删除每个规则

ufw delete $(ufw status numbered |(grep '80/tcp'|awk -F"[][]" '{print $2}'))

答案2

我知道这是一个非常老的问题,但谷歌把我带到了这里,到目前为止的答案都很有帮助,所以我想分享我的完整解决方案。@Seth 的回答帮助我解决了大部分问题。

我的目标是删除所有允许连接到端口 3306 上的本地 MySQL 服务器的 UFW 规则。以下是我使用的方法:

for NUM in $(ufw status numbered | grep 3306 | awk -F"[][]" '{print $2}' | tr --delete [:blank:] | sort -rn); do
    yes | ufw delete $NUM
done

实现自动化的关键是删除相反的顺序。当你从末尾删除时,上面的数字不会改变。

运行时,ufw status numbered您将获得如下输出:

     To                         Action      From
     --                         ------      ----
[ 1] 22                         ALLOW IN    10.181.225.123
[ 2] 3306/tcp                   ALLOW IN    10.181.225.123
[ 3] 3306/tcp                   ALLOW IN    10.181.226.45
[ 4] 3306/tcp                   ALLOW IN    10.181.226.77
[ 5] 3306/tcp                   ALLOW IN    10.181.225.196
[ 6] 3306/tcp                   ALLOW IN    10.181.226.3
[ 7] Anywhere                   ALLOW IN    10.181.226.45
[ 8] 3306/tcp                   ALLOW IN    10.181.224.55
[ 9] 3306/tcp                   ALLOW IN    10.181.224.80
[10] 3306/tcp                   ALLOW IN    10.208.6.136
[11] 3306/tcp                   ALLOW IN    10.178.128.13

需要了解以下几点:

  • 输出awk -F"[][]" '{print $2}'将包含 10 以下数字的前导空格,tr --delete [:blank:]将其删除
  • 一旦删除前导空格,sort -rn将按相反的数字顺序对数字进行排序。
  • 我使用管道传输yes到 ufw 而不是使用,--force因为我有一个非常旧的 ufw。如果你有一个现代版本,你可以使用--force

答案3

如果您需要清除所有规则(不仅仅是特定端口):

ufw --force reset

(如果不想提示确认则选择--force)

答案4

也许不用多说:每次删除一个编号的 ufw 项后,该项后面的所有项都会重新编号。因此,此一行代码将在第一个删除的项之后删除错误的项:

#Wrong use of deleting multiple ufw-items:
for numb in $(ufw status numbered | grep DENY | cut -d" " -f1 | grep -o [[:digit:]]*); do ufw delete $numb; done

只要不可能在没有确认的情况下强制删除每个项目,我还没有找到更好的解决方案......

相关内容