Skip to content

配置规则

每个规则由零个或多个表达式组成,后跟一个或多个语句。

每个表达式都测试数据包是否与特定有效payload字段或数据包/流元数据 匹配。

多个表达式从左到右线性计算:如果第一个表达式匹配,则计算下一个表达式,依此类推。如果我们到达最终表达式,则数据包将匹配规则中的所有表达式,并执行规则的语句。

每个语句都执行一个操作,例如设置 netfilter 标记、计算数据包、记录数据包或做出判定,例如接受或丢弃数据包或跳转到另一条链。

与表达式一样,多个语句从左到右线性计算:单个规则可以使用多个语句执行多个操作。请注意,判决声明就其性质而言结束了规则。

常用规则

shell
{add | insert} rule [family] table chain [handle handle | index index] statement ... [comment comment]
replace rule [family] table chain handle handle statement ... [comment comment]
{delete | reset} rule [family] table chain handle handle

1. 备份配置

备份配置

备份单个表 nft list table [family] <table> <filePath>

备份所有规则 nft list ruleset > all_ruleset

导入规则

nft -f <filePath>

注意

  • 早期版本需要手动先创建table,否则导入可能因表不存在而报错,再更高的版本支持自动创建

  • Flushing Sets: flush table 不会刷新该表中定义的任何sets。要同时刷新集,请使用flush ruleset 刷新规则集(自 Linux 3.17 起可用)或显式删除sets。早期版本 (Linux <=3.16) 不允许导入已存在的集,但在更高版本中允许这样做

  • 重复规则: 如果在配置文件开头加上flush table <table>行,则可以实现类似每次加载前清空规则,然后导入配置表,如果不清空,则多导入几次就会产生几次重复值 (注意 会清空原有的规则),只有有一个include的文件中包含即可

2. 新建规则

{add | insert} rule [family] table chain [handle handle | index index] statement ... [comment comment]

add: 在指定handle后面新增一条规则,如没有指定handle就在最后新增

insert: 在指定handle前面新增一条规则,如没有指定,则在第一条新增

shell
[root@localhost ~]# nft -a -n list table  inet test
table inet test { # handle 21
	chain chain2 { # handle 2
		comment "常规链"
	}

	chain chain1 { # handle 58
		comment "基础链"
		type filter hook input priority 0; policy accept;
		tcp dport 22 accept # handle 66
		tcp dport 443 accept # handle 67
		tcp dport 1443 accept # handle 68
	}

	chain chain4 { # handle 60
		type filter hook input priority 110; policy accept;
		tcp dport 22 accept # handle 65
	}
}
[root@localhost ~]# nft insert rule inet test chain1 handle 67  tcp dport 12  accept
[root@localhost ~]# nft add  rule inet test chain1 handle 67  tcp dport 14  accept
[root@localhost ~]# nft -a -n list table  inet test
table inet test { # handle 21
	chain chain2 { # handle 2
		comment "常规链"
	}

	chain chain1 { # handle 58
		comment "基础链"
		type filter hook input priority 0; policy accept;
		tcp dport 22 accept # handle 66
		tcp dport 12 accept # handle 70
		tcp dport 443 accept # handle 67
		tcp dport 14 accept # handle 71
		tcp dport 1443 accept # handle 68
	}

	chain chain4 { # handle 60
		type filter hook input priority 110; policy accept;
		tcp dport 22 accept # handle 65
	}
}
[root@localhost ~]#

3. 修改/替换

replace rule [family] table chain handle handle statement ... [comment comment]

此功能用来替换规则,也可以叫做修改规则

shell
[root@localhost ~]# nft replace rule inet test chain1 handle 71 tcp dport 114 accept
[root@localhost ~]# nft -a -n list table  inet test
table inet test { # handle 21
	chain chain2 { # handle 2
		comment "常规链"
	}

	chain chain1 { # handle 58
		comment "基础链"
		type filter hook input priority 0; policy accept;
		tcp dport 11 accept # handle 69
		tcp dport 22 accept # handle 66
		tcp dport 12 accept # handle 70
		tcp dport 443 accept # handle 67
		tcp dport 114 accept # handle 71
		tcp dport 1443 accept # handle 68
	}

	chain chain4 { # handle 60
		type filter hook input priority 110; policy accept;
		tcp dport 22 accept # handle 65
	}
}
[root@localhost ~]#

4. 删除规则

delete rule [family] table chain handle handle

delete就不赘述了,按照handle删除规则即可