|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
您现在的位置: ChinaBeta.cn 中文IT资讯 >> 网盟学院 >> 编程类 >> 其它编程程序 >> 网管技术正文
推荐网管技术让我穿过那道"墙"! 畅游网络应…推荐网管技术主动防御!瑞星杀毒2008抢先评…
推荐网管技术速度超快 Discuz! 6.0.0试用手…推荐网管技术奇虎举证:各杀毒软件均报CNNIC…
推荐网管技术Google Earth 4.2加入繁体中文…推荐网管技术专业防护!瑞星防火墙2008测试…
推荐网管技术挂载RAR文件 从认识到爱上WinM…推荐网管技术让你冲浪随心所欲 如何访问被封…
推荐网管技术轻装上阵!江民杀毒软件2008速…推荐网管技术VMware Fusion苹果版全程图解(…
推荐网管技术VMware Fusion苹果版全程图解(…推荐网管技术从菜鸟出发!征服高清详细评测全…
推荐网管技术VS2008和ASP.NET 3.5使用之初体…推荐网管技术[多图]Ubuntu 7.04 初体验
推荐网管技术东风吹战鼓擂 下载软件你选谁?推荐网管技术若隐若现 Windows XP DirectX …
推荐网管技术GPRS上网全攻略推荐网管技术主流杀毒软件Vista兼容性横评
推荐网管技术基于IRF的网络管理和业务管理解…推荐网管技术83个美丽的Wordpress主题
推荐网管技术软交换网络中的关键路由技术详…推荐网管技术不只是换肤?Windows Mobile 6 …
推荐网管技术css教程–十步学会用css建站(全…推荐网管技术巧妙设置路由 预防网络频繁掉线
推荐网管技术打造网络管理七大绝技推荐网管技术CorelDRAW X3 Service Pack 2 …
推荐网管技术重温经典:回归 Live Messenger…推荐网管技术Oracle数据库补丁分类、安装及…
NAT在NDIS中间层驱动中的实现
Www.ChinaBeta.Cn 更新时间:2006-6-19 阅读次数:

【ChinaBeta.Cn 网盟学院】

1.概要
    相信在IPv6的时代到来之前,NAT仍然是解决大多数人上网的主要途径,而且它在企业内网Intranet中也扮演着十分重要的角色.
    NAT的全称是Network Address Translator(网络地址转换),其主要作用是把内网IP地址转换成为全球唯一的可定位的外部IP地址,从而使得局域网内的所有用户可以通过一个或者少数几个IP地址与全球的Internet通信,不仅节约了IP地址,而且在一定程度上保护了内部网络.
    由于工作需要,笔者希望编写一个具有NAT功能的软件,将同一个网段内把本机设为网关的拥有私有IP的主机发来的数据包转发到外部网络,并把响应信息返回给对应的主机.这个问题在不同的层次上做就有不同的解决方案,由于笔者也是网络新手,走了不少弯路:
    首先,企图在用户层利用原始套接字(Raw Socket)来实现,但是系统拥有对未开放端口的自动复位功能,每当我们转发一个数据包时,需要占用系统的一个端口,但是这点系统并不知道,它接收到对于这个端口的回应信息时,会认为本端口不存在,并发送一个带有复位标志的数据包请求对方断开连接.这就阻拦了所有非本机请求的连接,所以这个方案首先被否定了.
    随后,不得不往系统下面走,准备在核心态实现.当然越简单越好,于是笔者选择了Filter-Hook驱动.Filter-Hook Driver, 事实上不是一种新的网络驱动,它只是扩展了IP过滤驱动(IP Filter Driver)的功能,是一种内核模式驱动(Kernel Mode Driver). 在Filter-Hook Driver中我们提供回调函数(callback),然后使用IP Filter Driver注册回调函数。这样当数据包发送和接收时,IP Filter Driver会调用回调函数。可惜梦想再一次破灭,这个回调函数的返回值只有PF_FORWARD,PF_DROP,PF_PASS三种,并不能把修改后的数据包主动发送出去.
    只有在向底层走了,NDIS应该是必经之路.而且经过两次失败,发现闭门造车是不可行的,偶然在网上搜索到了几篇文章,听说在NDIS的中间层驱动中可以实现NAT,新的探索之路就这样开始了......

2.NAT简介
    NAT(Network Address Translator)的出现并不是偶然的,一方面是由于IPv4的创造者们没有想到,Internet以及TCP/IP发展如此迅速,在他们还们完全享受TCP/IP的成功带来的快感之前,32位的IP地址竟然不够用了;另一方面我们必须保证某些特殊的主机在于局域网络连接的同时,保持对外界直接曝光,但是由需要与外界在受控的情况下通讯.下图是一个典型的NAT示意.
       \ | /                  .                               /
   +---------------+  WAN     .           +-----------------+/
   |Regional Router|----------------------|Stub Router w/NAT|---
   +---------------+          .           +-----------------+\
                              .                      |        \
                              .                      |  LAN
                              .               ---------------
                        Stub border

   下面举一个具体的例子说明两个处于内网的主机是如何通过NAT通信的
                                       \ | /
                                     +---------------+
                                     |Regional Router|
                                     +---------------+
                                   WAN |           | WAN
                                       |           |
                   Stub A .............|....   ....|............ Stub B
                                       |           |
                     {s=198.76.29.7,^  |           |  v{s=198.76.29.7,
                      d=198.76.28.4}^  |           |  v d=198.76.28.4}
                       +-----------------+       +-----------------+
                       |Stub Router w/NAT|       |Stub Router w/NAT|
                       +-----------------+       +-----------------+
                             |                         |
                             |  LAN               LAN  |
                       -------------             -------------
                                 |                 |
               {s=10.33.96.5, ^  |                 |  v{s=198.76.29.7,
                d=198.76.28.4}^ +--+             +--+ v d=10.81.13.22}
                                |--|             |--|
                               /____\           /____\
                             10.33.96.5       10.81.13.22

图中有两个残桩网络A和B,现在假设A中的一台主机10.33.96.5需要同B中的10.81.13.22通信,它必须把自己发送的数据报的目的地址设置为B的一个外网地址198.76.28.4,并在NAT中把源地址转换成A的外部地址198.76.29.7,才能使数据包顺利抵达广域网中的路由器,并转到B,在由B网的NAT把数据包发送给10.81.13.22.
    随着NAT多年的发展,出现了很多不同风格,应用于不同场合的NAT.笔者实现的是传统NAT中的一种特殊情况NAPT(Network Address Port Translation),它把所有内网的IP地址都转换成同一个外部IP地址,并通过不同的端口来区分各个不同的内部主机.

3.中间层驱动NDIS Intermediate Drivers
    所谓中间层驱动是指位于微端口和协议之间的驱动,实际上它是微软在网络驱动中留出来的接口,便于用户实现自己对数据包的处理.在协议驱动层看来,它就是微端口;在微端口看来,它又是协议层驱动.因此,如果需要在此层实现自己对数据包的处理函数,不仅要在上边缘注册MiniportXxx Function,还要在下边缘注册ProtocolXxx Function.一般在这个层次做工作的同志都会学习并了解DDK的一个经典Sample:Passthru.如果对它不了解,可以去看看Addylee前几天的文章"基于PassThru的NDIS中间层驱动程序扩展",讲得很清晰.

4.NAPT的具体实现
    程序整体框架依然是基于PaaThru的,具体要注意的问题有以下几点:
4.1 转发表的维护
typedef struct _PortNode
{
    USHORT inport;                      //内网端口
    USHORT export;                //转发端口
    USHORT report;                //远程端口
    ULONG inip;                //内网IP
    ULONG reip;                //远程IP
    struct _PortNode * next;            //链表指针
}PortNode;

PortNode * first = NULL;                    //全局变量,转发表的头结点

NTSTATUS
DriverEntry(
    IN    PDRIVER_OBJECT        DriverObject,
    IN    PUNICODE_STRING        RegistryPath
    )
{
        ......
    Status = NdisAllocateMemory(&first,sizeof(PortNode), 0,HighestAcceptableMax);
    if(Status == NDIS_STATUS_SUCCESS)
    {
        NdisZeroMemory(first,sizeof(PortNode));
        //首结点的inip表示本主机地址
        first->inip = 本主机IP            
        //首结点的reip表示本主机所在的网络地址
        first->reip = first->inip & 0x00ffffff;
    }
    ......
}

4.2 校验和的计算
USHORT CheckSum(USHORT *buffer, int size) 
{
    unsigned long cksum=0;
    while(size >1) 
    {
        cksum += * buffer++;
        size -=sizeof(USHORT);
    }
    if(size) 
    {
        cksum += *(UCHAR*)buffer;
    }
    cksum = (cksum >> 16) + (cksum & 0xffff);
    cksum += (cksum >>16);
    return (USHORT)(~cksum);
}
   IP TCP UDP三种包校验和的计算方法是一致的,本文采用的方法是简单地重新计算整个包的校验和,在RFC1631中,作者提出了一种差量计算法以提高计算速度,并且给出了C语言版的源代码.

[1] [2] 下一页  

Google

(责任编辑:hahack)

发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
热门文章 相关报道
普通网管技术 [软件应用]凤凰涅槃 驱动精灵2008归来 (01-03)最新网管技术
普通网管技术 [ASP|ASP.NET]为ASP.NET MVC框架添加AJAX支持 (01-02)最新网管技术
普通网管技术 [JSP|JAVA]从Java到Ruby:献给引路人的策略 (01-02)最新网管技术
普通网管技术 [PHP]PHP多文件上传实例 (01-02)最新网管技术
普通网管技术 [其它编程程序]QQ 静态截图完善实现之改造 CRec… (01-02)最新网管技术
普通网管技术 [其它编程程序]C++运算符重载转换运算符 (01-02)最新网管技术
普通网管技术 [其它编程程序]详细解析C++编写的ATM自动取款机… (01-02)最新网管技术
普通网管技术 [其它编程程序]C++中用vectors改进内存的再分配 (01-02)最新网管技术
普通网管技术 [其它编程程序]C++中的虚函数((((virtual funct… (01-02)最新网管技术
普通网管技术 [其它编程程序]C++中用函数模板实现和优化抽象操… (01-02)最新网管技术
没有相关网管技术
  网友评论内容:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
I D *
邮 箱
主 页
评 分 1分 2分 3分 4分 5分
评 论

关于我们  中国·国家信息产业部{粤ICP备06006652号}{陇ICP备06002562号}
版权所有:『AK网盟基地』站长:Hahack | QQ:80505955 | E-mail:Hahack@Gmail.com
Copyright (C) 2005-2007  akhack.org|chinabeta.cn All Rights Reserved