如何添加和删除临时 nftables 接受规则

如何添加和删除临时 nftables 接受规则

要获取并续订 Letscrypt 证书,我需要在certbot运行时打开 http 端口 80,然后将其关闭。 (该服务器中没有正常的Web服务)。

iptables在letsencrypt“/etc/letsencrypt/renewal-hooks/pre”和“.../post”脚本中使用了这些命令:

iptables -I INPUT -p tcp --dport 80 -j ACCEPT -m comment --comment "Allow HTTP for certbot"

iptables -D INPUT -p tcp --dport 80 -j ACCEPT -m comment --comment "Allow HTTP for certbot"

我可以iptables-translate与第一个-I(nsert) 规则一起使用来获取等效nft命令:

nft insert rule ip filter INPUT tcp dport 80 counter accept comment \"Allow HTTP for certbot\"

但是通过-D(elete)命令,我得到了

Translation not implemented

那么使用 nftables 实现这一点的最佳方法是什么?

nft add table ...也许我还可以使用 和 来添加然后删除整个特殊表nft delete table ...?但是如何确保数据包不会被我的其他表丢弃呢policy drop

答案1

要删除一条规则,我们需要知道它的“句柄”。使用-a以下选项时会显示此信息

nft -a list chain filter input

因此,在这种特殊情况下,需要打开然后再次关闭端口 80,我在letsencrypt“renewal-hooks”目录中使用以下脚本:

在 /etc/letsencrypt/renewal-hooks/ 中/fw-certbot-open

#!/bin/bash

# Open firewall to let certbot renew certificates

me=$(basename "$0")

logger -t "$me" "Opening port 80 for certbot"

## Reverse order since we do inserts
nft insert rule ip filter input              tcp dport 80 counter                                accept comment \"Allow HTTP for certbot\"
nft insert rule ip filter input ct state new tcp dport 80 log prefix \"nft:ok-certbot \" group 0 accept comment \"Allow and log HTTP for certbot\"

并在“/etc/letsencrypt/renewal-hooks/邮政/fw-certbot-close”:

#!/bin/bash

# Removing firewall rules created for certbot renew certificates

me=$(basename "$0")

logger -t "$me" "Closing port 80 opened for certbot"

## Remove port 80 accept rules
for h in $(nft -a list chain filter input \
           | awk '/dport 80 .* accept .* # handle [0-9]+/ {print $NF}')
do
    nft delete rule filter input handle $h
done

这似乎有效。我仍然想知道是否有一种更简单的方法来做到这一点,而不必解析输出nftawk获取句柄。

答案2

由 mivk 提供的答案会完全按照你的要求去做。

另一种可能更容易管理的方法是使用包含临时规则的链,并在不再需要时将其刷新:

# nft add chain ip filter temporary_web
# nft insert rule ip filter INPUT tcp dport 80 counter jump temporary_web comment \"Allow HTTP for certbot\"

然后您将能够在 certbot 之前运行以下命令:

# nft insert rule ip filter temporary_web counter accept

certbot 运行后,您可以通过以下方式清除链

# nft flush chain ip filter temporary_web 

相关内容