nf-凯发app官方网站

凯发app官方网站-凯发k8官网下载客户端中心 | | 凯发app官方网站-凯发k8官网下载客户端中心
  • 博客访问: 752956
  • 博文数量: 144
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1150
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-17 14:32
个人简介

小公司研发总监,既当司令也当兵!

文章分类

全部博文(144)

相关博文
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·
  • ·

分类: linux

2015-06-10 21:32:27

内核模式实现dns拦截(或代为回复)。注意,内核需要在2.6.31版本以上

点击(此处)折叠或打开

  1. #include <linux/vermagic.h>
  2. #include <linux/compiler.h>
  3. #include <linux/sockios.h>
  4. #include <linux/inetdevice.h>
  5. #include <linux/netdevice.h>
  6. #include <linux/types.h>
  7. #include <linux/skbuff.h>
  8. #include <linux/if_ether.h>
  9. #include <linux/netfilter.h>
  10. #include <linux/netfilter_ipv4.h>
  11. #include <linux/string.h>

  12. #include <linux/module.h>
  13. #include <linux/kernel.h>
  14. #include <linux/init.h>
  15. #include <linux/workqueue.h>
  16. #include <linux/in.h>
  17. #include <linux/inet.h>
  18. #include <linux/socket.h>
  19. #include <linux/ip.h>
  20. #include <linux/udp.h>
  21. #include <net/sock.h>
  22. #include <net/route.h>
  23. #include <net/ip.h>
  24. #include <net/flow.h>

  25. #include <linux/version.h>

  26. #include "idns_intercept.h"

  27. static unsigned int idns_intercept_handler( unsigned int hooknum,
  28.                             struct sk_buff *skb,
  29.                             const struct net_device *in,
  30.                             const struct net_device *out,
  31.                             int ( *okfn )(struct sk_buff *) );


  32. static struct nf_hook_ops idns_hook_ops = {
  33.     .hook    =    idns_intercept_handler,
  34.     .owner    =    this_module,
  35.     .pf        =    pf_inet,
  36.     .hooknum =    nf_inet_pre_routing,
  37.     .priority    =    nf_ip_pri_nat_dst - 1,/*    after dnat */
  38. };


  39. static unsigned char query_str[] = {
  40.         0x03,
  41.         0x77,0x77,0x77,    /* www */
  42.         0x05,
  43.         0x6c,0x6f,0x67,0x69,0x6e,    /* login */
  44.         0x03,
  45.         0x6e,0x65,0x74,    /* net */
  46.         0x00
  47. };

  48. #define dns_query_len    sizeof( query_str)


  49. static unsigned int idns_intercept_handler( unsigned int hooknum,
  50.                             struct sk_buff *skb,
  51.                             const struct net_device *in,
  52.                             const struct net_device *out,
  53.                             int ( *okfn )(struct sk_buff *) )
  54. {
  55.     struct sk_buff *pskb = skb;
  56.     struct iphdr *iph = ip_hdr(pskb);
  57.     struct udphdr *udp_hdr;
  58.     dns_header *dns_hdr;

  59.     unsigned char * dns_payload;
  60.     unsigned char * tmp;
  61.     
  62.     __u16 dport;
  63.     __u16 query_type;

  64.     int ret;
  65.     int name_type;
  66.     

  67.     if ( eth_p_ip != pskb->protocol )/* not ip packets */
  68.     {
  69.             return nf_accept;
  70.     }

  71.     if ( null == iph || 4 != iph->version)/* not ipv4 packets */
  72.     {
  73.         return nf_accept;
  74.     }
  75.     
  76.     if ( ipproto_udp != iph->protocol )/* not udp packets */
  77.     {
  78.         return nf_accept;
  79.     }
  80.     
  81.     udp_hdr = ( struct udphdr * )( ( unsigned char * )iph  iph->ihl * 4 );/* strip ip header*/
  82.     if ( null == udp_hdr )
  83.     {
  84.         return nf_accept;
  85.     }
  86.     
  87.     dport = udp_hdr->dest;    
  88.     dport = ntohs( dport );

  89.     if ( domain_port != dport )/*    not dns request packet    */
  90.     {
  91.         return nf_accept;
  92.     }

  93.     dns_hdr = ( dns_header * )( ( unsigned char * )udp_hdr  udp_header_len ); /* strip udp header*/
  94.     if ( null == dns_hdr)
  95.     {
  96.         return nf_accept;
  97.     }

  98.     if ( ( ntohs( dns_hdr->flag ) & dns_response_packet ) )/* not dns request? */
  99.     {
  100.         return nf_accept;
  101.     }
  102.     
  103.     dns_payload = ( unsigned char * )( ( unsigned char * )dns_hdr  dns_header_len );
  104.     if ( null == dns_payload )
  105.     {
  106.         return nf_accept;
  107.     }

  108.     ret = memcmp( dns_payload, query_str, dns_query_len);
  109.     if (== ret)
  110.     {
  111.         printk("intercept one dns requst\n");
  112.         // do intercept
  113.     }

  114.     return nf_accept;
  115. /*
  116.     tmp = dns_payload  dns_query_len;
  117.     memcpy( &query_type, tmp, sizeof( query_type ) );
  118.     query_type = ntohs( query_type );

  119.     if( dns_query_type != query_type )// is query type not a?
  120.         return nf_accept;
  121.     }

  122.     tp_send_dns_packet( pskb, iph, udp_hdr, dns_hdr, name_type );
  123.     
  124.     return nf_drop;
  125.     
  126. */
  127. }

  128. int start_dns_intercept(void)
  129. {
  130.     int ret;
  131.     
  132.     ret = nf_register_hook(&idns_intercept_handler);
  133.     if ( ret < 0 )
  134.     {
  135.         return ret;
  136.     }
  137.     
  138.     return 0;
  139. }

  140. void exit_dns_intercept(void)
  141. {
  142.     nf_unregister_hook(&idns_intercept_handler);
  143.     return;
  144. }


点击(此处)折叠或打开

  1. #ifndef i_dns_intercept_h
  2. #define i_dns_intercept_h

  3. #define domain_port 53

  4. #define eth_header_len ( 2  14 )
  5. #define ip_packet_ttl 128
  6. #define dns_answer_ttl ( 2 * 24 * 60 *60 )

  7. #define ip_addr_len sizeof( __u32 )
  8. #define port_len sizeof( __u16 )
  9. #define udp_header_len sizeof( struct udphdr )
  10. #define dns_header_len sizeof( dns_header )

  11. #define dns_response_packet ( 0x8000 ) /* response packet flag */
  12. #define dns_query_type    ( 0x0001 )         /* query type,type a */
  13. #define dns_query_class ( 0x0001 )        /* query class,clase internet */
  14. #define dns_response_flag ( 0x8080 )    /* response flag value */
  15. #define dns_response_pointer ( 0xc00c )/* response field pointer */
  16. #define dns_resource_len ( 0x0004 )        /* response field ip length */


  17. typedef struct
  18. {
  19.     __u16 transaction_id;
  20.     __u16 flag;
  21.     __u16 questions;
  22.     __u16 answers_rrs;
  23.     __u16 authority_rrs;
  24.     __u16 additional_rrs;
  25. }__attribute__ ((__packed__))dns_header;

  26. int start_dns_intercept(void);
  27. void exit_dns_intercept(void);

  28. #endif

代为回复未实现。
阅读(4128) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~
")); function link(t){ var href= $(t).attr('href'); href ="?url=" encodeuricomponent(location.href); $(t).attr('href',href); //setcookie("returnouturl", location.href, 60, "/"); }
网站地图