nf_tables入门2


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_TABLENFTA_CHAIN_NAME这两个消息就行了;

创建rule

目标函数nf_tables_newrulehttps://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_TABLENFTA_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


文章作者: q1ming
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 q1ming !
  目录