我正在使用 ansible 在我的 DB 服务器上配置 ufw,以便只接受来自某些服务器到特定端口的连接(比如说1234
)。
当曾经具有访问权限的服务器从池中取出时,可能会忘记删除该服务器的访问规则。
我的解决方案:制定规则时,我想删除所有端口规则1234
,然后使用当前池中的服务器重新创建它们。
不幸的是,ufw delete
需要精确指定要删除的规则(端口、协议、scr IP、...)。
我尝试过类似的解决方案ufw delete $(ufw status numbered | grep 1234 | <get all the numbers of the rules> )
,但它变得非常糟糕,而且速度非常快。
有没有更好的方法来删除某个端口的所有规则?
答案1
这里有两个问题需要解决:
- 生成与所需字符串匹配的 ufw 规则编号列表。
- 让 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
只要不可能在没有确认的情况下强制删除每个项目,我还没有找到更好的解决方案......