Linux:如何将整个数据包发送到另一台主机上的特定端口?

时间:2013-02-06 15:26:07

标签: linux networking tcp network-programming libpcap

我使用libpcap捕获了一个TCP数据包,我希望将整个数据包(无需修改)发送到另一个主机上的特定端口(另一个嗅探器监听该端口)。

我有什么方法可以做到这一点吗?

非常感谢!

3 个答案:

答案 0 :(得分:1)

您没有指定您正在使用的编程语言以及您迄今为止尝试过的内容。

将IP地址字段更改为目标IP,将TCP端口字段更改为所需的端口。不要忘记更新两个校验和。

IP packet format TCP packet format

如果你想要的是TCP转发,Linux kernel already does this for you

答案 1 :(得分:1)

netcat可能会在这种情况下工作,虽然我认为你可能需要重新构建标题,但还没试过。

How to escape hex values in netcat

另一个选择是使用iptables将数据包发送到另一个嗅探器,同时仍然在包裹分析器中捕获它

http://www.bjou.de/blog/2008/05/howto-copyteeclone-network-traffic-using-iptables/

另一种选择是使用端口镜像,根据所使用的交换机,它会有一些不同的名称,但它允许您将交换机上的端口设置为基本上是集线器。

我认为,如果你不能让netcat工作,你最好的选择是使用iptables,你甚至可以添加过滤器。

答案 2 :(得分:0)

我不知道您是否必须使用C,但即使您这样做,我也建议您先使用Python / Scapy构建原型。

使用scapy,以下是步骤:

  1. 使用rdpcap()读取pcap文件。
  2. 获取目标IP地址和TCP目标端口号(pkt.getlayer(IP).dst,pkt.getlayer(TCP).dport)并将其保存为您想要的格式的字符串(例如,payload =“192.168 .1.1:80" )。
  3. 更改数据包的目标IP地址和目标端口号,以便正在侦听特定端口的其他主机接收它。
  4. 在数据包顶部添加有效负载(pkt = pkt / payload)
  5. 发送数据包(sendp(pkt,iface ='eth0'))
  6. 您必须在另一台主机上剖析数据包以获取有效负载。如果不确切知道原始数据包中TCP层的顶部是什么,我无法为您提供准确的代码,但应该相对简单。
  7. 使用Python / Scapy这一切都很容易,但我希望C更难,必须手动计算正确的偏移量和校验和。祝你好运,我希望这会有所帮助。