阅读:1799回复:6
凑凑热闹,关于NAT的小问题。
最近几个月看见大家都在讨论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也搜不出个所以然来。 上面我的理解不知对否?请老大们指点一二。 |
|
最新喜欢:jzyhum... |
沙发#
发布于:2004-01-12 23:23
请问,你所说的外网的数据在内网转发是如何实现的?
|
|
|
板凳#
发布于:2004-01-13 08:38
从外网转发数据到内网应该不难吧,就是在PtReceive()里边剔除相应头之后调用NdisSend()转发数据到内网网卡而已。(注:实际上我还没有动手编过一行代码,所以这些都是理论上,要是说错了,请老大们不要见笑哈,当然同时欢迎指正)。我现在困惑地是从内网转发到外网时,应该转发什么样的数据?不可能是仅仅调整MAC、IP、Port之后就可以转发的。
|
|
地板#
发布于:2004-01-13 09:36
这个问题我觉得你的思路有写偏差了。
你的adsl如何拨号的?我觉得是使用enternet或者raspppoe或者其他的拨号软件上网的,这个nat其实系统已经会做了,如果你要自己做的话,内网的报文修改了ip和端口之后应该是转发到adsl的拨号链接上去,而不是那块链接adsl猫的网卡上面去。比方说,如果是enternet,那么他又一块虚拟网卡,你直接把报文交给那个虚拟网卡就行了,如果是raspppoe,那么他使用的是系统的拨号链接,你要做的就是把报文转发到ndiswan上面去。 链接adsl猫的那块网卡在这种情况下只起到一个桥接的作用。 如果你使用adsl猫直接拨号,那么adsl猫应该支持nat的。 |
|
|
地下室#
发布于:2004-01-13 10:21
这个问题我觉得你的思路有写偏差了。 呵呵,老大分析得极是,实际上我的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”这种形式?还是可以随便使用一个? |
|
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。 |
|
|
6楼#
发布于:2004-01-13 17:33
ndiswan使用mac地址来区分拨号链路。 原来如此,收获不少,给分了。 |
|