netfilter_netfilter安装_linux netfilter(2)

电脑杂谈  发布时间:2017-03-09 11:06:42  来源:网络整理

在这个HOOK上主要是对数据报作报头检测处理,以捕获异常情况。

* NF_IP_LOCAL_IN (1)

目的地为本地主机的数据报在IP数据报本地投递函数ip_local_deliver()(位于net/ipv4/ip_input.c,Line290)的最后经过这个HOOK。

经过这个HOOK处理之后,数据报进入ip_local_deliver_finish()(位于 net/ipv4/ip_input.c,Line219)

这样,IPTables模块就可以利用这个HOOK对应的INPUT规则链表来对数据报进行规则匹配的筛选了。防火墙一般建立在这个HOOK上。

* NF_IP_FORWARD (2)

目的地非本地主机的数据报,包括被NAT修改过地址的数据报,都要在IP数据报转发函数ip_forward()(位于net/ipv4/ip_forward.c,Line73)的最后经过这个HOOK。

经过这个HOOK处理之后,数据报进入ip_forward_finish ()(位于net/ipv4/ip_forward.c,Line44)

另外,在net/ipv4/ipmr.c中的 ipmr_queue_xmit()函数(Line1119)最后也会经过这个HOOK。(ipmr为多播相关,估计是在需要通过路由转发多播数据时的处理)

这样,IPTables模块就可以利用这个HOOK对应的FORWARD规则链表来对数据报进行规则匹配的筛选了。

* NF_IP_LOCAL_OUT (3)

本地主机发出的数据报在IP数据报构建/ 发送函数ip_queue_xmit()(位于net/ipv4/ip_output.c,Line339)、以及 ip_build_and_send_pkt()(位于net/ipv4/ip_output.c,Line122)的最后经过这个HOOK。(在数据报处理中,前者最为常用,后者用于那些不传输有效数据的SYN/ACK包)

经过这个HOOK处理后,数据报进入 ip_queue_xmit2()(位于net/ipv4/ip_output.c,Line281)

另外,在 ip_build_xmit_slow()(位于net/ipv4/ip_output.c,Line429)和ip_build_xmit()(位于 net/ipv4/ip_output.c,Line638)中用于进行错误检测;在igmp_send_report()(位于 net/ipv4/igmp.c,Line195)的最后也经过了这个HOOK,进行多播时相关的处理。

这样,IPTables模块就可以利用这个HOOK对应的OUTPUT规则链表来对数据报进行规则匹配的筛选了。

* NF_IP_POST_ROUTING (4)

所有数据报,包括源地址为本地主机和非本地主机的,在通过网络设备离开本地主机之前,在IP数据报发送函数ip_finish_output()(位于 net/ipv4/ip_output.c,Line184)的最后经过这个HOOK。

经过这个HOOK处理后,数据报进入ip_finish_output2()(位于net/ipv4/ip_output.c,Line160)

另外,在函数ip_mc_output()(位于net/ipv4/ip_output.c,Line195)中在克隆新的网络缓存skb时,也经过了这个HOOK进行处理。

简约流程图:

5个挂接点
以下内核代码版本2.6.25
1.1 PREROTING
/* net/ipv4/ip_input.c */
int ip_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt, struct net_device *orig_dev)
{
......
return NF_HOOK(PF_INET, NF_INET_PRE_ROUTING, skb, dev, NULL,
		       ip_rcv_finish);

......
}

1.2 INPUT
/* net/ipv4/ip_input.c */
int ip_local_deliver(struct sk_buff *skb)
{
......
return NF_HOOK(PF_INET, NF_IP_LOCAL_IN, skb, skb->dev, NULL,
         ip_local_deliver_finish);
}

1.3 FORWARD
/* net/ipv4/ip_forward.c */
int ip_forward(struct sk_buff *skb)
{
......

return NF_HOOK(PF_INET, NF_IP_FORWARD, skb, skb->dev, rt->u.dst.dev,
         ip_forward_finish);
......
}

1.4 OUTPUT
/* net/ipv4/ip_output.c */
int ip_build_and_send_pkt(struct sk_buff *skb, struct sock *sk,
  __be32 saddr, __be32 daddr, struct ip_options *opt)
{
......
return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
         dst_output);
}

int __ip_local_out(struct sk_buff *skb)
{
	struct iphdr *iph = ip_hdr(skb);

	iph->tot_len = htons(skb->len);
	ip_send_check(iph);
	return nf_hook(PF_INET, NF_INET_LOCAL_OUT, skb, NULL, skb->dst->dev,dst_output);
}
1.5 POSTROUTING

/* net/ipv4/ip_output.c */

int ip_mc_output(struct sk_buff *skb)
{

 ......
return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, skb->dev,ip_finish_output,!(IPCB(skb)->flags & IPSKB_REROUTED));
}

int ip_output(struct sk_buff *skb)
{
......
	return NF_HOOK_COND(PF_INET, NF_INET_POST_ROUTING, skb, NULL, dev,ip_finish_output,!(IPCB(skb)->flags & IPSKB_REROUTED));
......
}


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-36628-2.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 伍冲虚
      伍冲虚

      好像某米是高大上

    • 名冢佳织
      名冢佳织

      对于美国人对我岛礁建设提出的意见对我有利的将坚决采纳

    • 刘忠心
      刘忠心

      爱你喜欢听

    热点图片
    拼命载入中...