2015-02-08 22 views
0

我使用Sharppcap组播UDP数据包,以单播,然后将数据包转发到另一个网络 我建立了两个网络之间,如以下情形IPsec的工具和浣熊隧道的IPsec 连接转换,它工作正常Sharppcap如何使用ubuntu中的路由发送数据包?

diagram

但是在gateway1中,我运行一个简单的程序,使用sharppcap监听eth1,捕获来自网络A的所有多播udp数据包,并将目标地址更改为gateway2的eth1地址,然后重新发送,然后另一个网关将数据包更改为多播并转发到网络B. 我这样做是因为IPsec隧道模式doe sn't组播 工作,例如在gatway1:

private static void device_PcapOnPacketArrival(object sender, PcapCaptureEventArgs e) 
     { 
      if(e.Packet is UDPPacket) 
      {    
       UDPPacket udp = (UDPPacket)e.Packet; 
       System.Net.IPAddress dstIp = udp.DestinationAddress; 
       if (dstIp.ToString() == "224.5.6.7") 
       { 
        udp.DestinationAddress= IPAddress.Parse("192.168.2.1"); 
        udp.SourceHwAddress= System.Net.NetworkInformation.PhysicalAddress.Parse("A0-48-1C-D6-7E-C0"); 
        udp.DestinationHwAddress= System.Net.NetworkInformation.PhysicalAddress.Parse("A0-48-1C-D6-D5-90"); 
        udp.TimeToLive=20; 
        udp.ipv4.IPChecksum= udp.ComputeIPChecksum(); 
        device1.SendPacket(udp); 
       } 
      } 
     } 

修改的数据包到达目的地的其他网络中,但仍然在网关1和网关2 之间的隧道没有加密,我认为解决的办法是让操作系统句柄发送数据包 但我不知道如何使用sharppcap来做到这一点。

回答

0

libpcap/winpcap(因此Sharppcap)通过pcap_sendpacket/pcap_inject()发送数据包。这些都是原始数据包,因此如果您想使用加密,则在发送数据包时必须自己应用这些数据包,因为这些调用正绕过操作系统中较高级别的通信堆栈。

也许你可以使用混合方式接收Sharppcap的数据包,然后使用IPSec隧道,正如通常将它用作应用程序一样,例如。在两个系统之间打开一个套接字并通过该套接字发送数据包。这将让操作系统通过IPSec隧道路由数据。

+0

感谢@克里斯 有没有什么办法打开使用sharppcap 你可以给我一个例子 – 2015-02-09 08:43:17

+0

@AhmadDarwish两个网关之间的插槽,你会打开插座,就像您其他任何插座。 https://msdn.microsoft.com/en-us/library/kb5kfec7%28v=vs.110%29.aspx这真的取决于,如果你想同步与异步,哪个端口,什么协议等 – 2015-02-09 15:47:54

+0

谢谢,问题是当我使用套接字时,我丢失了原始数据包的源IP地址,因为套接字只接受来自其中一个本地地址的发送,它不能绑定到原始源IP地址 ,这在我的应用程序中是不可接受的 我需要找到另一种方式来执行此操作 – 2015-02-10 12:30:14

相关问题