nftables规则管理:规则包含服务名时如何删除对应规则
nftables 服务名规则删除及相关操作方案
1. 服务名与端口的映射查询方法
nftables 显示规则时的服务名是从 /etc/services 文件匹配映射而来,和端口是一一对应的关系,可以通过以下方式互相查询:
- 查询指定端口对应的服务名(以TCP为例,替换
tcp为udp即可查询UDP协议):grep -w "^[a-zA-Z0-9_-]* *$PORT/tcp" /etc/services | awk '{print $1}' - 查询指定服务名对应的端口:
getent services $SERVICE_NAME,输出会直接返回对应端口与协议,兼容性优于直接读取/etc/services。
2. 无需提前查询handle的规则删除方式
nftables 原生支持按规则内容匹配直接删除,不需要先获取handle编号,且内部按端口数值匹配,规则显示为服务名不影响匹配逻辑:
- 比如你要删除
inet filter input链中允许TCP 80端口的规则(规则显示为http服务名),直接执行:nft delete rule inet filter input tcp dport 80 accept - 若不确定规则的完整结构,可以加
-n参数导出纯端口数值格式的规则列表,完全避开服务名干扰:nft -n list ruleset,该输出中所有端口都会显示为数字,直接用你存储的端口变量匹配即可。
3. 原有handle删除逻辑的适配方案
如果要继续沿用先查handle再删除的原有逻辑,只要调整查询命令即可兼容服务名场景:
- 查询对应链的规则时加
-n参数强制输出端口数值,再grep你的端口变量就能准确拿到handle:
示例命令(替换为你自己的表、链名):handle=$(nft -n list chain inet filter input | grep "dport $PORT" | awk '{print $NF}') nft delete rule inet filter input handle $handle
额外优化建议
- 新增规则时可以添加自定义注释,后续删除时直接匹配注释更精准,不会出现误删:
添加规则示例:nft add rule inet filter input tcp dport 80 accept comment "allow_web_port"
删除规则示例:nft delete rule inet filter input comment "allow_web_port" - 批量操作规则前先备份现有规则:
nft export ruleset > /opt/nft_rules_backup.nft,出现误操作时可以直接恢复:nft -f /opt/nft_rules_backup.nft
内容的提问来源于stack exchange,提问作者infantus
相关产品推荐
相关产品推荐

