请教一个关于指定winpcap抓取指定方向数据包的问题

mingzihua 2008-10-09 11:50:08
我的问题是:用winpcap编程有没有办法实现只抓从某个网口进来或出去的包?或者有没有别的办法在程
序中实现同样的功能?以下是我程序的实现环境和问题,写得比较多,但高手应该一目了然。谢谢!
------------------------------------------------------------------------------------
我用winpcap开发一个包转发的程序,在两个通信节点(假设为A和B)中间插入我的包转发程序,程序运行
的目的是使A和B仍能正常的通信,即我的程序对A和B是透明的,这样我程序运行的节点至少有两个网口(假设
为a和b),分别接向A和B。
程序是这样工作的:用两个进程或两个线程(这里假设使用两个进程)分别负责把从一个口捕获到的包原封
从另一个口转发出去,即一个进程把从a口捕获到的包从b口转发出去,另一个进程则刚好相反。
现在的问题是:一个进程转发出去的包会被另一个进程捕获,最后造成包的循环转发,两个进程陷入转发
包的死循环。
可以采用对捕获的包进行分析过滤的办法来防止造成死循环,但通信的包很复杂不能简单的通过判断IP或
协议来进行过滤。另一种办法是想法使每个进程只抓从一个网口传进来的包而不抓传出去的包,winpcap中有
一个过滤选项inbound/outbound即指定winpcap只抓一个方向的包,但winpcap的官网上解释说只能用在没
有链路层(比如,像slip这样的点对点协议)的连接中,试了下没能实现抓指定方向的包。
...全文
395 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
huangjacky 2009-05-05
  • 打赏
  • 举报
回复
支持一下
qq_sugar 2008-10-13
  • 打赏
  • 举报
回复
你说的多口是什么意思啊? A口 B口什么意思?是指端口号?还是不同的网卡?

1 你是想在某一个网卡上抓包,然后再另外一个网卡上发包?
在用winpcap抓包的时候,创建抓包对象的时候,会指定某一个网卡,创建的收包对象只接受这个网卡上收到的包。所以发包和收包都是用不同的网卡对象即可。

2 如果是在一个网卡上收包,同时处理后在这个网卡上发包?
a 在创建winpcap收包对象的时候,可以指定一个filter,通过这个filter控制收包包的种类,譬如只收udp还是tcp包,以及更高层的协议包,还可以根据ip报文字段进行过滤,譬如根据源ip还是目的ip进行过滤,还可以根据udp或者tcp的源端口和目的端口进行过滤。
b winpcap进行抓包的时候,最底层不区分是本机发出去的报文,还是网卡上收到的报文,缺省情况下都是会抓到的,所以一般要创建filter捕获你想要的包.


mingzihua 2008-10-13
  • 打赏
  • 举报
回复
我的程序是在二层上进行处理,或许只能进行MAC分析了.
但个人觉得抓包程序应该可以实现指定从一个网口的输入或输出缓冲读数据,只要实现这点,我就可以指定程序只从A口和B口的输入缓冲抓包,这样就能避免转发出的包又被抓回的问题,因为转发出的包在输出缓冲中。
谢谢楼上的分析!
mingzihua 2008-10-09
  • 打赏
  • 举报
回复
谢谢楼上的回答!
但我的程序是在底层用winpcap的混杂模式抓包,没有涉及到路由的问题。
另外我这样做的目的其实是想在中间对包进行一定的处理,比如有意的丢弃
一些包不转发,所以HUB的实现方式也不符合我的要求。
一半乐事 2008-10-09
  • 打赏
  • 举报
回复
出现你这个问题的根本原因就是:你错误地改变了IP包的发送方向。
我没用过winpcap,但我觉得从网络的角度看有两种解决办法:
一、由路由表确定转发方向
既然你这台设备串连到网络当中,又有不同的网卡,那么应该以三层设备来看待,首先在设备上要有配置路由表,以保证数据包在不被采集的情况下就能正常转发。然后你的程序只负责采集到数据包并分析就可以,包转发由设备操作系统的路由功能实现。
二、通过HUP或交换机镜像实现数据采集
如果不希望运行程序的设备做路由转发,可以考虑在A和B中间加一个HUB,你的程序设备也连接到HUB上,因为HUB是以广播方式工作的,因此所有的数据包你都可以通过自己的网卡采集到,然后进行分析就可以了。

如果不用上面两种办法,一定要按你的实现方法(相当于你的程序同时实现路由功能),那么我觉得可以要对路由表以及IP包中的目的地址进行分析,比如你如果要捕获A口进来的包,那么要判断该包的目的地址,查询路由表,如果计算出下一跳路由指向A口,说明这是从A口发出去的包,需要抛弃。如果下一跳指向B口,那么需要捕获。这样做的好处就是你可以对包分析处理的更灵活一些。
一半乐事 2008-10-09
  • 打赏
  • 举报
回复
嗯,那就是我最后说的那一段。因为你串联在网络中间,因此不管你抓到的是IP包还是帧,甚至电平信号,为了能保证数据包能正确地穿过,你就不可避免地要对三层进行处理,因为你串入的这台设备,已经起到路由器的作用了,如果你的设备没有路由功能,那你串入之后,网络应该就中断了。

如果从二层的角度来看,即你串入的这台设备好像一个HUB或交换机,你捕获到的也是二层帧。那么你在处理完后就应该模拟HUB或交换机对帧进行处理。HUB是对所有端口广播,交换机是查找MAC表然后转发到相应端口,MAC表最初也是由广播建立。

总之,如果要实现你的想法,即单纯捕获某个网口进来或出去的包,肯定要对包进行分析的,要不然只能像HUB一样广播,但这样会给你带来死循环的问题,就是个广播风暴啊,呵呵。

我又重新看了一下你的问题,你说你的设备对网络是透明的,意思应该是在二层上处理。我觉得似乎没有必要对两个网卡同时抓包,你只要在A卡上抓包然后处理就可以了。

4,386

社区成员

发帖
与我相关
我的任务
社区描述
通信技术相关讨论
社区管理员
  • 网络通信
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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