本人从事酒店网管6年有余,日常工作中发现常有客房上网须电脑维护人员帮忙设置,
因为很多客人怎样设置自动获取IP也不会,于是考虑能否实现客房上网无须任何设置,
真正即插即用,然后google了一下,相关产品早就有了,如:
http://www.kcomst.com/general/download.htm
等等。但是,我是个编程爱好者,在参考了很多协议资料后,尝试自己写。
目前工程已经实现的功能:
1、捕获网内所有生存主机;
2、可以根据需要重定向客人的URL;
3、监控所有数据包;
。。
。。
有兴趣的朋友可以一起讨论
QQ:81623859(隐身)
E-mail:[email protected]

解决方案 »

  1.   

    续:从本人查找的一些资料来看,此系统应该是基于局域网内ARP欺骗技术,
    配合winPcap函数库,能抓取所有网络原始包,网络上有关ARP欺骗,
    DNS重定向的资料也很多。
    本人新增了NetBIOS欺骗,参考RFC1001及RFC1002文档,
    当客户端既无网关,也无DNS时,在IE输入任意字符,会在本地子网广播一个
    NBNS查询包,系统抓取此包后,伪造一个NBNS响应包返回,在客户端的名称解析
    缓存中会产生一条记录(nbtstat /c 查看)。
      

  2.   

    续:
    在本人的模拟测试环境中,假设最坏状况:
    1、客户端IP与子网与本机(服务器)不在同一子网;
    2、无DNS;
    3、无网关;当客户端在IE输入任意URl或字符(如:www.abc.com),首先在本地缓存中查找解析名称对应IP的记录,之后查找本地的解析文件,之后向本地子网广播NBNS查询包,经服务端抓取此包后,返回伪响应包,此时客户端缓存中对应 www.abc.com 的IP 为 192.168.1.1(服务器端LAN IP),即完成了NetBT
    重定向。问题是:
        此时,客户端与服务端的TCP连接仍不能成功建立,分析客户端当前路由(route print),没有
    到达 192.168.1.1 的路由,于是,又写了个ICMP路由重定向函数,期望能在客户端路由表新增期望路由,可惜不成功,(也尝试了ICMP路由通告,不成功)。通过数据包分析工具Ethereal,抓取了一条名为:slow proctol 协议,源MAC与目标MAC既不是客户端MAC也不是服务端MAC,可能是交换机的端口MAC,在网上google后,有关slow proctol的资料几近于无
      

  3.   

    我原来做过一部分功能做到客户拿过来一台笔记本,不管他什么配置,他只要接上网线,就能ping通服务器,telnet或者ftp什么得,也能通
      

  4.   

    现在在公司里面,那份代码在家里电脑上。。程序是跑在linux上的,也就是酒店网关服务器上的你可以加我msn谈,msn:[email protected]
      

  5.   

    另,
    你给的那个url地址的那家公司,没有实现这个功能
    他们有client端。
      

  6.   

    我在考虑:当最坏情况下,使用ICMP欺骗不能实现更改客户端的路由表,
    是否可以考虑RIP欺骗,准备尝试一下。另:不知您当时的思路是否相同?
      

  7.   

    我是采用icmp 重定向来是实现的,这样用户的route table就自动被更新为我们所希望的那样了。。电脑接到网口上的时候,同一个局域网的所有机器都能检测到有新的网卡接入的包括那台网关服务器,这时候,不管用户电脑请求什么,都模拟一个req给它,这就是基本思路。然后用icmp redirect就可以达到要求了
      

  8.   

    当发现有新主机产生时,我是主动发送ICMP 重定向包的,为什么没成功?
    难道我的重定向包构造有误?---------------
    您所说的“模拟一个req给它”,是指什么协议请求包?
      

  9.   

    我贴出我的ICMP重定向函数,您帮我看看是否构造有误,多谢!
    void myPcap::sendICMP_Directional(u_char * data)  //data 是所捕获的原始数据包
    {
    ETH_HEADER ethR ,ethS;             //以太网首部
    IP_HEADER  ipR  ,ipS;              //IP数据报首部
    ICMP_HEADER icmpS;                 //ICMP首部
    unsigned long routeIP;             //应使用的路由IP
    unsigned char ipHadd8[28];         //IP首部+原始IP数据报中前8个字节
    char sendBuf[1024],temp[1024]; ethR=*(ETH_HEADER *)data;
    ipR=*(IP_HEADER *)(data + sizeof(ETH_HEADER));
    icmpS.type=5;
    icmpS.code=1;
    icmpS.checksum=0;
    routeIP=myIP;
    memcpy(ipHadd8,data + sizeof(ETH_HEADER),sizeof(ipHadd8)); ipS.checksum=0;
    ipS.destip=ipR.sourceip;           //这里对吗?
    ipS.frag_and_flags=0/*htons(16384)*/;
    ipS.h_lenver=(4<<4|sizeof(IP_HEADER)/sizeof(unsigned int));
    ipS.ident=htons(12345);
    ipS.protocol=IPPROTO_ICMP;
    ipS.sourceip=ipR.destip;          //这里对吗?
    ipS.tos=0;
    ipS.total_len=htons(sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+sizeof(routeIP)+sizeof(ipHadd8));
    ipS.ttl=255; memset(temp,0,sizeof(temp));
    memcpy(temp,&icmpS,sizeof(ICMP_HEADER));
    memcpy(temp+sizeof(ICMP_HEADER),&routeIP,sizeof(routeIP));
    memcpy(temp+sizeof(ICMP_HEADER)+sizeof(routeIP),ipHadd8,sizeof(ipHadd8));
    icmpS.checksum=checksum((USHORT *)temp,sizeof(ICMP_HEADER)+sizeof(routeIP)+sizeof(ipHadd8));           //计算校验和
    memset(temp,0,sizeof(temp));
    memcpy(temp,&ipS,sizeof(IP_HEADER));
    ipS.checksum=checksum((USHORT *)temp,sizeof(IP_HEADER));    //计算校验和 ethS.Ethertype=htons(ETH_IP);
    memcpy(ethS.DesMAC,ethR.SrcMAC,6);
    memcpy(ethS.SrcMAC,myMAC,6); memset(sendBuf,0,sizeof(sendBuf));
    memcpy(sendBuf,&ethS,sizeof(ETH_HEADER));
    memcpy(sendBuf+sizeof(ETH_HEADER),&ipS,sizeof(IP_HEADER));
    memcpy(sendBuf+sizeof(ETH_HEADER)+sizeof(IP_HEADER),&icmpS,sizeof(ICMP_HEADER));
    memcpy(sendBuf+sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(ICMP_HEADER),&routeIP,sizeof(routeIP));
    memcpy(sendBuf+sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+sizeof(routeIP),ipHadd8,sizeof(ipHadd8)); //发送伪ICMP重定向报文
    if(-1==pcap_sendpacket(adhandle,(u_char *)sendBuf,sizeof(ETH_HEADER)+sizeof(IP_HEADER)+sizeof(ICMP_HEADER)+sizeof(routeIP)+sizeof(ipHadd8)))
    outputSysInfo("发送伪ICMP重定向报文失败!");
    else outputListenInfo("成功发送一个伪造ICMP重定向报文!");
    }
      

  10.   

    比如用户配置是10.0.0.34,网关10.0.0.1
    而你这边服务器的配置为192.168.0.1当服务器收到用户的ethernet地址后,同时也能获取它的ip设置
    这时候,服务器发一个arp的响应给用户,让用户电脑认为它的网关10.0.0.1是存在的
    服务器然后发一个icmp重定向给局域网,告诉网内所有发向10.0.0.1的请求,让它走向192.168.0.1即可
    ,当然,路由要在ethernet实现,光ip层是不够的
      

  11.   

    是rep,不是req,写错了,不好意思
      

  12.   

    在用户有网关的情况下,你说的是可以实现,我这一步已经完成了----------
    你有没有在最坏情况下测试过?
    即:
    1、客户IP 与 服务器IP不同子网;
    2、无网关;
    3、无DNS;我是这种状况下测试的,此时,客户端会在本地子网上广播名称解析包,如下:
    客户配置
    IP:192.168.1.100
    mask:255.255.255.0
    DNS:无
    gateway:无服务配置:
    IP:150.0.1.1
    mask:255.255.254.0当客户端在IE中输入 www.abc.com 时,会在其本地子网(目标IP为192.168.1.255)上广播一个NBNS包,查询www.abc.com 的IP是多少?在经服务端NBNS欺骗后,客户会收到www.abc.com 的IP是 150.0.1.1 ,但仍然没有达到更改客户的
    route table
      

  13.   

    这一步我也没有做过说说我的看法而已:
    此时nbt欺骗时候,将abc.com的解析为192.168.1.1给客户,然后也用icmp redirect一下,让网内所有发向192.168.1.1的包发向服务器你看行不?