论坛风格切换切换到宽版
  • 731阅读
  • 3回复

[问题求助][RedHat] Netfilter5个HOOK点的含义 [复制链接]

上一主题 下一主题
离线花花86.
 
发帖
1980
C币
-60887
威望
371
贡献值
1
银元
-1
铜钱
4494
人人网人气币
0
只看楼主 倒序阅读 使用道具 楼主  发表于: 2009-05-01
Netfilter框架定义了5个基本HOOK点,包括NF_IP_PRE_ROUT.ING, NF_IP_LOCAL_IN., NF_IP_IP_FORWARD, NF_I.P_LOCAL_OUT, NF_IP_POST_ROUTING.
对于这5个点.的理解,我理解为:--------------彩票
数据包从外部进入.本机,经过.hook点NF_IP_PRE_ROUTING。<性病>
数据.包的目的地是本机,经过hook.点NF_IP_LOCAL_IN。            杀毒
目的.地是其.它的主机,经过hook点NF_IP_FORWARD。电脑
本机进程的数据包离开.本机,经过hook.点NF_IP_LOCAL_OUT。             电子
数据包准备传输到本机外部,经过hook点NF_IP_POST_R.OUTING.。健康
可是我不理解的是,如果NF_IP_ROUTING是判断数据包进入本机,然后在NF_IP_FORWARD之后,判断除.数据包不是发往其他机器,那为什么还要多个NF_IP._.LOCAL_IN呢? NF_IP_PRE_ROUTING和.NF_IP_FORWARD之间究竟有什么去区别? 希望大家能帮帮我。我用搜索引擎都搜不到一个具体的答案。(广告)

评价一下你浏览此帖子的感受

精彩

感动

搞笑

开心

愤怒

无聊

灌水
发帖
2112
C币
-235117
威望
406
贡献值
1
银元
-2
铜钱
4772
人人网人气币
0
只看该作者 沙发  发表于: 2010-04-13
Re:[RedHat]
你先搞清楚,这几个点都是什么功能,于是就好理解了

离线ruyiboy.
发帖
2018
C币
-152715
威望
383
贡献值
1
银元
-4
铜钱
4503
人人网人气币
0
只看该作者 板凳  发表于: 2010-04-13
Re:[RedHat]
local_in点是给本地的

离线zskj.
发帖
2010
C币
-262954
威望
359
贡献值
1
银元
-4
铜钱
4414
人人网人气币
0
只看该作者 地板  发表于: 2010-04-13
Re:[RedHat]
去看看内核sock数据包流经过程就会比较清晰了。

一下是引用“端木隐”大哥的总结。
貌似这位大哥这两年隐居了。






QUOTE:5个挂接点
以下内核代码版本2.6.17.11。
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_IP_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,
     u32 saddr, u32 daddr, struct ip_options *opt)
{
......
return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
         dst_output);
}
int ip_queue_xmit(struct sk_buff *skb, int ipfragok)
{
......
return NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL, rt->u.dst.dev,
         dst_output);
......
}
int ip_push_pending_frames(struct sock *sk)
{
......
/* Netfilter gets whole the not fragmented skb. */
err = NF_HOOK(PF_INET, NF_IP_LOCAL_OUT, skb, NULL,
        skb->dst->dev, dst_output);
......
}
1.5 POSTROUTING

/* net/ipv4/ip_output.c */
int ip_output(struct sk_buff *skb)
{
struct net_device *dev = skb->dst->dev;
IP_INC_STATS(IPSTATS_MIB_OUTREQUESTS);
skb->dev = dev;
skb->protocol = htons(ETH_P_IP);
return NF_HOOK_COND(PF_INET, NF_IP_POST_ROUTING, skb, NULL, dev,
              ip_finish_output,
       !(IPCB(skb)->flags & IPSKB_REROUTED));
}

以下是2.6.25的 ,但是 NF_INET_POST_ROUTING 我没看到定义????奇怪了!!!

# 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));  
# ......  
# }  


[ 本帖最后由 C__J 于 2009-5-5 02:07 编辑 ]
快速回复
限100 字节
如果您在写长篇帖子又不马上发表,建议存为草稿
 
上一个 下一个