高手来谈谈NAT是如何实现的?还有代理ARP、NAT两者的优缺点?

xx2j 2003-09-09 11:22:29
高手来谈谈NAT是如何实现的?

还有代理ARP、NAT两者的优缺点?
...全文
389 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
dsend 2003-09-16
  • 打赏
  • 举报
回复
1.1 NDIS中间层驱动程序(NDIS Intermediate Drivers)概述

微软Windows网络驱动程序接口标准(NDIS 4.0)和Windows NT 4.0(SP3)引入了一种新的NDIS驱动程序,它可以嵌在NDIS 传输驱动程序TDI(如,TCP/IP)和底层的NDIS网络接口驱动程序的中间。这种新类型的驱动程序被称为NDIS中间层驱动,如图表 1。NDIS(网络驱动器接口标准)中间层驱动程序在其上边界导出MiniportXxx函数,在其下边界导出ProtocalXxx函数。该驱动程序在其上边界仅提供面向无连接通信支持,而在其下边界,则即可支持面向无连接通信,也可支持面向连接通信。
中间层驱动程序的微端口部分(上边界)必须是非串行的,系统将依赖这些非串行驱动程序,而不是NDIS对MiniportXxx函数的操作进行串行化处理和对内部生成的输出包进行排队操作,这样驱动程序只要保持很小的临界区(每次只能有一个线程执行该代码)就能提供性能良好的全双工操作。但是这些非串行Miniport要受到更多也更严格的设计要求的限制,往往要为此付出更多的调试和测试时间。
中间层驱动程序是一种典型的层次结构程序,它基于一个或多个NDIS NIC驱动程序,其上层是一个向上层提供TDI(传输驱动程序接口)支持的传输驱动程序(也可能是多层结构)。从理论上讲,一个中间层驱动程序也可以是基于其他中间层驱动程序或作为其他中间层驱动程序的低层出现的,尽管这种方案未必能展现更好的性能。
中间层驱动程序的一个示例是LAN仿真中间层驱动程序,其上层是一个早期传输驱动程序,下层是一个非LAN介质的微端口 NIC驱动程序。该驱动程序从上层接收LAN格式的数据包并将其转换为本地网卡的介质格式,然后将其发送到那个NIC的NDIS 微端口。接收数据时,该驱动程序将低层网卡驱动程序送来的数据包转换为LAN兼容格式,最后向上层传输驱动程序提交这些转换过的数据包。
例如,NDISWAN就具有一些上述特征。NDISWAN将数据包从上层的传输LAN格式转换为WAN数据包格式,或者将数据包从低层的网卡驱动WAN格式转换为LAN数据包格式。另外,如果低层NIC硬件不支持这些功能,那么NDISWAN也可提供诸如压缩、加密和端对端协议(PPP)等的数据格式化功能。NDISWAN为在NDIS API和网卡驱动程序之间进行通信提供了一个专用接口,同时,NDISWAN也将协议绑定映射为活动连接请求。
另一个中间层驱动程序的例子是ATM LANE (LAN仿真)驱动程序,它将数据包从上层无连接的传输格式转换为下层面向连接的网卡支持的ATM格式。
图1.1说明了中间层驱动程序结构



图表 1 中间层驱动程序结构

NDIS中间层驱动程序在NDIS中起着转发上层驱动程序送来的数据包,并将其向下层驱动程序发送的接口功能。当中间层驱动程序从下层驱动程序接收到数据包时,它要么调用NdisMXxxIndicateReceive函数,要么调用NdisMindicateReceivePacket函数向上层指示该数据包。
中间层驱动程序通过调用NDIS打开和建立一个对低层NIC驱动程序或者NDIS中间层驱动程序的绑定。中间层驱动程序提供MiniportSetInformation和MiniportQueryInformation函数来处理高层驱动程序的设置和查询请求,某些情况下,可能还要将这些请求向低层NDIS驱动程序进行传递,如果其下边界是面向无连接的可通过调用NidsRequest实现这一功能,如果其下边界是面向连接的则通过调用NidsCoRequest实现该功能。
中间层驱动程序通过调用NDIS提供的函数向网络低层NDIS驱动程序发送数据包。例如,下边界面向无连接的中间层驱动程序必须调用NdisSend或NdisSendPackets来发送数据包或者包数组,而在下边界面向连接的情况下就必须调用NdisCoSendPackets来发送包数组数据包。如果中间层驱动程序是基于非NDIS NIC驱动程序的,那么在调用中间层驱动程序的MiniportSend或Miniport(Co)SendPackets函数之后,发送接口对NDIS将是不透明的。
NDIS提供了一组隐藏低层操作系统细节的NdisXxx函数和宏。例如,中间层驱动程序可以调用NdisMInitializeTimer来创建同步时钟,可以调用NdisInitializeListHead创建链表。中间层驱动程序使用符合NDIS标准的函数,来提高其在支持Win32接口的微软操作系统上的可移植性。

1.2 NDIS中间层驱动程序的用途

NDIS中间层驱动有几个方面的用途,包括:
· 局域网仿真(LAN Emulation) – NDIS中间层驱动可以使一个非局域网NIC驱动(如,ATM)犹如一个局域网NIC驱动(如,Ethernet)。
· 包过滤(Packet Filtering) - 可以拦截和修改高层TDI(传输驱动程序)和底层NIC驱动程序之间的网络包(Packets):
· 通过或过滤掉(Pass/Drop Packets)
· 延迟或重新排序( Delay/Reorder Packets)
· 加密或解密(Packet Encryption/Decryption)
· 压缩或解压(Packet Compression/Decompression)
· 路由包(Route Packets):
· NAT网络地址转换(Network Address Translation)
· LBFO负载平衡和失效替换(Adapter Load Balancing And Fail-Over)

1.3 NDIS中间层驱动程序的开发环境

OS : Microsoft Windows 2000 Server
IDE : Microsoft Visual C++ V6.0
DDK : Windows 2000 Device Drivers Kit
xx2j 2003-09-12
  • 打赏
  • 举报
回复
应该是在ndis层实现才对吧?
xx2j 2003-09-12
  • 打赏
  • 举报
回复
To:phoenixandlinda(会抄程序)

  Sygate wingate好象都不是用spi实现的,我用sporder.exe看了一下,它们并没有安装。
费尔防火墙就是用spi实现的,所以用sporder.exe看到。
phoenixandlinda 2003-09-12
  • 打赏
  • 举报
回复
对,SPI只能抓到使用Socket的包,如果要一网打尽必须用NDIS的,关于NDIS你可以到www.driverdevelop.com哪有很多做驱动和系统底层的高手。
xx2j 2003-09-11
  • 打赏
  • 举报
回复
To:phoenixandlinda(会抄程序) 谢谢!

那代理ARP呢?WIN2K有没有办法实现,如何实现。
phoenixandlinda 2003-09-11
  • 打赏
  • 举报
回复
在win2k可用WinSock SPI,在类Unix下用Raw Socket,可以方便的操作IP包。最好亲自动动手,遇到问题再看看别人怎么做的,会更深刻点。
kingzai 2003-09-11
  • 打赏
  • 举报
回复
你去查找一下CSDN网络通讯版有关的帖子,有好几篇都在精华贴。
xx2j 2003-09-11
  • 打赏
  • 举报
回复
sygate是怎么实现的?
phoenixandlinda 2003-09-11
  • 打赏
  • 举报
回复
dsniff中的arpspoof能实现ARP欺骗(也是代理的一部分),dsniff软件可以在下面的网址下载:
http://naughty.monkey.org/~dugsong/dsniff

fanfyj 2003-09-09
  • 打赏
  • 举报
回复
up
xx2j 2003-09-09
  • 打赏
  • 举报
回复
不会没人会吧!
自己顶。
ylc001 2003-09-09
  • 打赏
  • 举报
回复
你自己写,就是改包头咯
或者找LINUX下的IPTABLE的源代码
xx2j 2003-09-09
  • 打赏
  • 举报
回复
to : phoenixandlinda(会抄程序)

NAT的原理我也会,我要的不是原理。我是想知道怎么用代码实现,或有代码download.
phoenixandlinda 2003-09-09
  • 打赏
  • 举报
回复
NAT服务器类似于网关的实现,它同时属于两个或多个网段,当内网有数据要出去时,将内网数据包的IP地址、端口替换成相应网段的自己的IP和端口,数据回来是执行相反过程;外部网络是不能直接访问内部的(除非用端口映射、和反弹端口)。

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧