slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:1799回复:6

凑凑热闹,关于NAT的小问题。

楼主#
更多 发布于:2004-01-12 21:15
最近几个月看见大家都在讨论NAT,这周六、日特定使用两天时间看了一些NAT理论,发现理论很简单,就是具体实现起来有点费劲 :D

比如说吧,我装有两块网卡,一块连内网,一块连ADSL Modem上宽带网。问题来了,因为我是通过宽带上网,通过外网网卡的数据格式是:MAC头 + PPPoE头 + PPP头 + IP头 + TCP(UDP)头 + 数据,而我从内网网卡得到的数据格式却是:MAC头 + IP头 + TCP(UDP)头 + 数据,少了PPPoE和PPP头。

这样一来,就算我修改了相应的MAC、IP、PORT也无法直接转发修改过后的数据到外网网卡的(???),至少应该添加PPPoE、PPP头之后再转发,否则这些数据包怎么上得了宽带网?可是我怎么知道应该如何添加PPPoE和PPP头呢?[ 相反,从外网网卡得到的数据包剔除PPPoE、PPP头之后再转发到内网网卡好像倒不是很难???]

本来我想把修改过后的数据包发送到TCPIP.SYS,让它再把数据包发送到它下面的PPPoE驱动添加PPPoE和PPP头,最后再发到外网网卡,可是我怎么把这个数据包发送到TCPIP.SYS呢?至今为止我只在一片介绍VPN的文章中看到过L2TP驱动可以把修改过后的数据包再次发送到TCPIP,最后才发送到网络上,可以具体怎么实现它也不说。使用Google也搜不出个所以然来。

上面我的理解不知对否?请老大们指点一二。

最新喜欢:

jzyhummeljzyhum...
nitaliu
驱动牛犊
驱动牛犊
  • 注册日期2003-11-12
  • 最后登录2005-03-29
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-01-12 23:23
请问,你所说的外网的数据在内网转发是如何实现的?
***************** Apple Liu R&D Dep. ,,,, ( '!') / \ ~~~~~~
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-01-13 08:38
从外网转发数据到内网应该不难吧,就是在PtReceive()里边剔除相应头之后调用NdisSend()转发数据到内网网卡而已。(注:实际上我还没有动手编过一行代码,所以这些都是理论上,要是说错了,请老大们不要见笑哈,当然同时欢迎指正)。我现在困惑地是从内网转发到外网时,应该转发什么样的数据?不可能是仅仅调整MAC、IP、Port之后就可以转发的。
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-01-13 09:36
这个问题我觉得你的思路有写偏差了。

你的adsl如何拨号的?我觉得是使用enternet或者raspppoe或者其他的拨号软件上网的,这个nat其实系统已经会做了,如果你要自己做的话,内网的报文修改了ip和端口之后应该是转发到adsl的拨号链接上去,而不是那块链接adsl猫的网卡上面去。比方说,如果是enternet,那么他又一块虚拟网卡,你直接把报文交给那个虚拟网卡就行了,如果是raspppoe,那么他使用的是系统的拨号链接,你要做的就是把报文转发到ndiswan上面去。

链接adsl猫的那块网卡在这种情况下只起到一个桥接的作用。

如果你使用adsl猫直接拨号,那么adsl猫应该支持nat的。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-01-13 10:21
这个问题我觉得你的思路有写偏差了。

你的adsl如何拨号的?我觉得是使用enternet或者raspppoe或者其他的拨号软件上网的,这个nat其实系统已经会做了,如果你要自己做的话,内网的报文修改了ip和端口之后应该是转发到adsl的拨号链接上去,而不是那块链接adsl猫的网卡上面去。比方说,如果是enternet,那么他又一块虚拟网卡,你直接把报文交给那个虚拟网卡就行了,如果是raspppoe,那么他使用的是系统的拨号链接,你要做的就是把报文转发到ndiswan上面去。

链接adsl猫的那块网卡在这种情况下只起到一个桥接的作用。

如果你使用adsl猫直接拨号,那么adsl猫应该支持nat的。


呵呵,老大分析得极是,实际上我的ADSL Modem就具有NAT功能,我只是为了实现一些过滤功能,所以才需要自己实现NAT功能的。这样看来,只好把数据发送到ADSL的拨号连接上面了。

顺便请老大帮我看一下这些MAC地址到底是怎么回事。

下面是使用WinPoET 5.0拨号时我的Passthru的输出结果:

.....
Send Packet,Source MAC Address: 00-00-01-00-00-00 , Target MAC Address: D6-CC-20-00-02-00
Send Packet from Timer now.Type = 0800 , Size = 678 , Send To = \\DEVICE\\NDISWANIP
Send Packet,Source MAC Address: 00-E0-2A-B0-5E-0F , Target MAC Address: 00-90-1A-40-0F-89
Send Packet from Timer now.Type = 8864 , Size = 657 , Send To = \\DEVICE\\{932EC419-AE43-4023-AD36-74361467D93A}
....
Recv Packet,Source MAC Address: 00-90-1A-40-0F-89 , Target MAC Address: 00-E0-2A-B0-5E-0F
Recv Packet from Timer now.Type = 8864 , Size = 62 , Recv From = \\DEVICE\\{932EC419-AE43-4023-AD36-74361467D93A}
Recv Packet,Source MAC Address: D6-CC-20-00-02-00 , Target MAC Address: 00-00-01-00-00-00
Recv Packet from Timer now.Type = 0800 , Size = 54 , Recv From = \\DEVICE\\NDISWANIP
.....

发送包到NDISWAN时,那个Source MAC是“00-00-01-00-00-00”,这是什么意思?

=============================================================================

下面是使用EnterNet300拨号时Passthru的输出结果:

....
Send Packet,Source MAC Address: 44-45-53-54-77-77 , Target MAC Address: 00-00-00-11-22-33
Send Packet from Timer now.Type = 0800 , Size = 75 , Send To = \\DEVICE\\{E1E3938A-BF01-461A-9204-E1F0AF50AE78}
Send Packet,Source MAC Address: 00-E0-2A-B0-5E-0F , Target MAC Address: 00-90-1A-40-0F-89
Send Packet from Timer now.Type = 8864 , Size = 83 , Send To = \\DEVICE\\{932EC419-AE43-4023-AD36-74361467D93A}
.....
Recv Packet,Source MAC Address: 00-90-1A-40-0F-89 , Target MAC Address: 00-E0-2A-B0-5E-0F
Recv Packet from Timer now.Type = 8864 , Size = 142 , Recv From = \\DEVICE\\{932EC419-AE43-4023-AD36-74361467D93A}
Recv Packet,Source MAC Address: 00-02-03-04-05-06 , Target MAC Address: 44-45-53-54-77-77
Recv Packet from Timer now.Type = 0800 , Size = 134 , Recv From = \\DEVICE\\{E1E3938A-BF01-461A-9204-E1F0AF50AE78}
....

发送包到EnterNet300虚拟网卡时,Target MAC是“00-00-00-11-22-33”,而从这个虚拟网卡接收包时,Source MAC却是“00-02-03-04-05-06”,怎么不是“00-00-00-11-22-33”了?这些MAC地址有什么特殊的含义吗?

=============================================================================

如果真地象你所说的那样,把从内网得到的包转换过后再发送到NDISWAN上面,那么我自己转换得到的那个新包的Source MAC是否也应该使用诸如“00-00-01-00-00-00”这种形式?还是可以随便使用一个?
mikeluo
驱动老牛
驱动老牛
  • 注册日期2001-09-04
  • 最后登录2007-05-07
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-01-13 14:01
ndiswan使用mac地址来区分拨号链路。

enternet使用的mac地址是为了让系统协议栈能够正常发包使用的,对于系统的任何arp报文,返回的都是那个00-00-00-11-22-33,他的mac地址没有什么实际意义,报文到了enternet的miniport以后就要被修改了。发包的时候你也可以修改目的mac地址为00-00-00-11-22-33。
学而不思则罔,思而不学则殆 学而思之,思而学之,岂非圣人乎?
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-01-13 17:33
ndiswan使用mac地址来区分拨号链路。

enternet使用的mac地址是为了让系统协议栈能够正常发包使用的,对于系统的任何arp报文,返回的都是那个00-00-00-11-22-33,他的mac地址没有什么实际意义,报文到了enternet的miniport以后就要被修改了。发包的时候你也可以修改目的mac地址为00-00-00-11-22-33。


原来如此,收获不少,给分了。
游客

返回顶部