免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2199 | 回复: 4

[网络管理] DNS解析中请求和回应地址不同--求教 [复制链接]

论坛徽章:
0
发表于 2011-12-21 19:23 |显示全部楼层
    我在linux下调用域名解析函数返回失败;
   抓包后分析  向DNS1发送请求后,回应解析后地址的并不是DNS1的地址,而是另外一个地址 运营商说是二级地址,并且是不固定的;
  我这里地址是10.240.44.184   请求的DNS地址是125.210.177.185   回应解析包的地址是 125.210.177.146
  另外我ping 125.210.177.185   也是125.210.177.146给我回应
    这种情况有什么方法可以 正常解析域名呢
求大侠们指点一下啊

论坛徽章:
0
发表于 2011-12-21 22:25 |显示全部楼层
我现在的想法是 用socket添一个抓包程序 向DNS 125.210.177.185 发送请求之后,解析所有收到的UDP包,然后过滤掉125.210.177.XXX之外的包,
解析这个包的内容,得到解析后的地址;
我从网上找到的抓包代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>  
#include <netinet/in.h>  
#include <arpa/inet.h>   
#include <netinet/ip.h>  
#include <string.h>  
#include <netdb.h>  
#include <netinet/tcp.h>  
#include <netinet/udp.h>
#include <stdlib.h>  
#include <unistd.h>  
#include <signal.h>  
#include <net/if.h>  
#include <sys/ioctl.h>  
#include <sys/stat.h>  
#include <fcntl.h>  
#include <linux/if_ether.h>
#include <net/ethernet.h>


void die(char *why, int n)  
{  
        perror(why);  
        exit(n);  
}

int do_promisc(char *nif, int sock )  
{  
        struct ifreq ifr;  

        strncpy(ifr.ifr_name, nif,strlen(nif)+1);  
        if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1))  //获得flag
        {         
                die("ioctl", 2);  
        }  

        ifr.ifr_flags |= IFF_PROMISC;  //重置flag标志

        if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 )  //改变模式
        {
                die("ioctl", 3);  
        }  
}  
//修改网卡成PROMISC(混杂)模式

char buf[40960];

int catch_packet_func()  
{  
        struct sockaddr_in addr;
        struct ether_header *peth;
        struct iphdr *pip;         
        struct tcphdr *ptcp;
        struct udphdr *pudp;

        char mac[16];
        int i,sock, r, len;         
        char *data;
        char *ptemp;
        char ss[32],dd[32];

        if((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) == -1)  //建立socket
        //man socket可以看到上面几个宏的意思
        {
                die("socket", 1);  
        }

        do_promisc("eth0", sock);    //eth0为网卡名称

        system("ifconfig";

        for(;  
        {  
                len = sizeof(addr);

                r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);  
                buf[r] = 0;  
                ptemp = buf;
                peth = (struct ether_header *)ptemp;

                ptemp += sizeof(struct ether_header); //指针后移eth头的长度
                pip = (struct ip *)ptemp; //pip指向ip层的包头

                ptemp += sizeof(struct ip);//指针后移ip头的长度

                switch(pip->protocol)   //根据不同协议判断指针类型
                {
                        case IPPROTO_TCP:
                                ptcp = (struct tcphdr *)ptemp;       //ptcp指向tcp头部
                                printf("jcwang||TCP pkt :FORM:[%s]:[%d]\n",inet_ntoa(*(struct in_addr*)&(pip->saddr)),ntohs(ptcp->source));
                                printf("jcwang||TCP pkt :TO:[%s]:[%d]\n",inet_ntoa(*(struct in_addr*)&(pip->daddr)),ntohs(ptcp->dest));

                                break;

                        case IPPROTO_UDP:
                                pudp = (struct udphdr *)ptemp;      //ptcp指向udp头部  
                                printf("jcwang||UDP pkt:\n len:%d payload len:%d from %s:%d to %s:%d\n",  r,  ntohs(pudp->len),
                                        inet_ntoa(*(struct in_addr*)&(pip->saddr)),
                                        ntohs(pudp->source), inet_ntoa(*(struct in_addr*)&(pip->daddr)), ntohs(pudp->dest) );  
       
                                break;

                        case  IPPROTO_ICMP:
                                printf("jcwang||ICMP pkt:%s\n",inet_ntoa(*(struct in_addr*)&(pip->saddr)));
                                break;

                        case  IPPROTO_IGMP:
                                printf("jcwang||IGMP pkt:\n";
                                break;

                        default:
                                printf("jcwang||Unkown pkt, protocl:%d\n", pip->protocol);
                                break;
                } //end switch

                perror("dump";
        }

}

但是 我看程序的打印   只有125.210.177.185  :53端口到 125.210.177.185 :XX端口的包  
没有看到10.240.44.184到125.210.177.185              和125.210.177.146到10.240.44.184的包
是不是底层给过滤了  这端程序如何修改才能抓到DNS包

  在线等啊  有木有大侠来指教哇

论坛徽章:
34
亥猪
日期:2015-03-20 13:55:11戌狗
日期:2015-03-20 13:57:01酉鸡
日期:2015-03-20 14:03:56未羊
日期:2015-03-20 14:18:30子鼠
日期:2015-03-20 14:20:14丑牛
日期:2015-03-20 14:20:31辰龙
日期:2015-03-20 14:35:34巳蛇
日期:2015-03-20 14:35:56操作系统版块每日发帖之星
日期:2015-11-06 06:20:00操作系统版块每日发帖之星
日期:2015-11-08 06:20:00操作系统版块每日发帖之星
日期:2015-11-19 06:20:00黄金圣斗士
日期:2015-11-24 10:43:13
发表于 2011-12-21 22:26 |显示全部楼层
dns本来就分 迭代和递归 啊

论坛徽章:
0
发表于 2011-12-21 22:34 |显示全部楼层
但是 我自动获取的DNS是125.210.177.185  调用linux的gethostbyname()函数返回是失败的

论坛徽章:
0
发表于 2011-12-21 22:51 |显示全部楼层
继续请教 如果要收到所有发到我这儿的UDP包  上面的代码该怎么改呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP