温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Linux防火墙iptables中mark模块分析及怎么进行编写

发布时间:2021-10-21 17:51:31 来源:亿速云 阅读:483 作者:柒染 栏目:云计算

这篇文章将为大家详细讲解有关Linux防火墙iptables中mark模块分析及怎么进行编写,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

在linux系统中为了更好的实现网络流量的管理,使用了内核的mark来标识网络流量。这样造成了用户层再使用mark来标记多线负载,两种mark会互相覆盖,达不到想要的结果。在此种情况下,通过研究发现可以扩展mark模块来解决这种冲突。 
  1 Iptables的结构和命令格式分析 
  1.1 Iptables的结构分析 
  Iptables是linux系统为用户提供的一个配置防火墙的工具。它提供一个命名规则集。在linux中iptables防火墙实现的核心模块是netfilter,它负责维护防火墙的规则链表,实现防火墙安全防御能力。Netfilter主要有三种功能:数据包过滤、网络地址转换(nat)以及数据包处理(mangle)。数据包过滤模块的功能是过滤报文,不作任何修改,或者接受,或者拒绝。Nat是网络地址转换,该模块以connection tracking模块为基础,仅对每个连接的第一个报文进行匹配和处理,然后交由connection tracking模块将处理结果应用到该连接之后的所有报文。Mangle是属于可以进行报文内容修改的ip tables,可供修改的报文内容包括mark、tos、ttl等。同时该模块带有用户空间和内核交流的接口。 
  1.2 Iptables命令格式分析 
  一个最简单的规则可以描述为拒绝所有转发报文,用iptables命令表示就是:iptables -A FORWORD -j DROP。Iptables应用程序将命令行输入转换为程序可读的格式,然后再调用libiptc库提供的iptc_commit()函数向核心提交该操作请求。它根据请求设置了一个struct ipt_replace结构,用来描述规则所涉及的表和HOOK点等信息,并在其后附接当前这条规则,一个struct ipt_entry结构。组织好这些数据后,iptc_commit()调用setsockopt()系统调用来启动核心处理这一请求。 
  2 Netfilter的结构分析 
  Netfilter是linux系统中的内核防火墙框架,主要进行包过滤,连接跟踪,地址转换的功能,是防火墙的基础。其主要通过表、链实现。在netfilter中,每种网络协议都有自己的一套hook函数。数据报经过协议栈的几个关键点时调用hook函数,hook函数标号和协议栈数据报作为参数,传递给netfilter框架。其主要框架如图1所示: 
  3 Netfilter和 Iptables相关模块属性分析 
  3.1 与netfilter有关的结构 
  Netfilter一个重大修正思想就是将netfilter作为一个协议无关的框架,表现在内核结构树中单独建立net/netfilter目录,在net/netfilter下的匹配和目标模块文件名称以“xt_”开头。 
  为了和iptables兼容,这些文件中增加了一个新的宏定义:module_alias,来表示模块的别名。所有扩展程序的名称也是以xt开头。 
  Netfilter扩展的程序框架: 
  Xt_kzmark.c: 
  Static unsigned int kzmark_tg(struct sk_buff *skb, const struct xt_action_param *par) 
  Static int kzmark_tg_check(const struct xt_tgchk_param *par) 
  Static void kzmark_tg_destroy(const struct xt_tgdtor_param *par) 
  Static boool kzmark_mt(const struct sk_buff *skb, struct xt_action_param *par) 
  Static int kzmark_mt_check(const struct xt_mtchk_param *par) 
  Static void kzmark_mt_destroy(const struct xt_mtdtor_param *par) 
  Static struct xt_target kzmark_tg_reg __read_mostly = {} 
  Static struct xt_match kzmark_mt_reg __read_mostly = {} 
  Static int __init kzmark_mt_init(void) 
  {Int ret; 
  Need_ipv4_conntrack(); 
  Ret = xt_register_target(&kzmark_tg_reg); 
  Ret = xt_register_match(&kzmark_mt_reg);} 
  Static void_exit kzmark_mt_exit(void) 
  {Xt_unregister_match(&kzmark_mt_reg); 
  Xt_unregister_target(&kzmark_tg_reg);}   Module_init(kzmark_mt_init); 
  Module_exit(kzmark_mt_exit); 
  3.2 与Iptables有关的扩展 
  Iptables是一个用户可自行配置状态防火墙的应用程序,其实现由extension来完成,其机制类似于插件,可以有效的扩展iptables功能。Iptables是由模块化集成的,它所有的功能都在模块中实现。如一个很简单的配置项:-m state,-m是一个match,而state是match的一个模块,对于-m这个match,其它可选的模块许多。在iptables结构中,模块和模块名称是相关的。此次扩展的iptables代码libxt_kzmark.c,libxt_KZMARK.c要放入extension文件夹中。 
  匹配模块的程序框架: 
  Libxt_kzmark.c: 
  Static const struct option kzmark_opts[] = {}; 
  Static void parse_range(const char *arg, struct xt_kzmark_mtinfo *si) 
  Static int kzmark_parse(int c, char **argv, int invert, unsigned int *flags, const void *entry, struct xt_entry_match **match) 
  Static void kzmark_print(const void *ip, const struct xt_entry_match *match, int numeric) 
  Static void kzmark_save(const void *ip, const struct xt_entry_match *match) 
  Static struct xtables_match kzmark_match = {//Todo something}; 
  Void _init(void) 
  {Xtables_register_match(&kzmark_match);} 
  4 程序使用及效果 
  Kzmark的使用: 
  Iptables -A INPUT -d 192.168.1.11/32 -m kzmark -j DROP 
  KZMARK的使用: 
  Iptables -A INPUT -d 192.168.1.11/32 -j KZMARK --set-mark 3000 
  通过对以上模块的测试,使用效果良好。Netfilter/iptables可以很好地扩展新的匹配模块,但需要使用者按照一定的方式编写程序,使其注意力集中在功能的具体实现上,而不再考虑其他因素。在具体程序的实现上以现成的匹配模块为基础进行修改,不需要了解内部结构的定义就可以完成编码,因此netfilter/iptables是一个程序模块化实现很好的实例,可以推广应用。 

关于Linux防火墙iptables中mark模块分析及怎么进行编写就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI