Nftables的架构
table(表):用于指定网络协议的类型,如ip,ip6,arp等;
chains(链):用于指定流量的类型,如流入的流量或者是流出的流量并可以指定网络接口,如本地回环接口或者以太网接口等;
rules(规则):规则是用于过滤数据包所依据的规则,例如检查协议、来源、目的地、端口等规则;
express(表达式):表达式则是具体的操作;
相关数据结构
nft_table:https://elixir.bootlin.com/linux/v5.10/source/include/net/netfilter/nf_tables.h#L1074
nft_chains:https://elixir.bootlin.com/linux/v5.10/source/include/net/netfilter/nf_tables.h#L943
nft_rule:https://elixir.bootlin.com/linux/v5.10/source/include/net/netfilter/nf_tables.h#L869
nft_expr:https://elixir.bootlin.com/linux/v5.10/source/include/net/netfilter/nf_tables.h#L843
实操
创建chain
函数是nf_tables_newchain
https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L2381
之后会调用到nf_tables_addchain
:
操作十分简单,还是构造这个struct nlmsghdr
上,首先nlmsg_type
设置为(NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWCHAIN
就能进入到函数nf_tables_newchain
中,然后再消息体中需要有NFTA_CHAIN_TABLE
和NFTA_CHAIN_NAME
这两个消息就行了;
创建rule
目标函数nf_tables_newrule
:https://elixir.bootlin.com/linux/v5.15/source/net/netfilter/nf_tables_api.c#L3262
首先nlmsg_type
设置为(NFNL_SUBSYS_NFTABLES << 8) | NFT_MSG_NEWRULE
就能进入到函数nf_tables_newrule
中,然后再消息体中需要有NFTA_RULE_TABLE
和NFTA_RULE_CHAIN
这两个消息就行了;
创建expr
参考
https://zhuanlan.zhihu.com/p/641687837
https://leohsiao.com/Linux/%E7%BD%91%E7%BB%9C/%E9%98%B2%E7%81%AB%E5%A2%99.html