如何构建伪造的ICMP“目标无法访问”类型3代码4数据包

时间:2014-11-19 21:20:08

标签: sockets tcp scapy icmp network-security

我创建了伪造的目标无法访问的ICMP,类型3和代码4(需要分段并设置DF位)。我的设置有服务器,客户端和它们之间的切换。理想情况下,这个ICMP由路由器/网关生成,但我在客户端生成这个。我正在使用Scapy工具创建此ICMP。以下是我的创作方式:

ip = IP()
icmp = ICMP()
# IP Packet sent to client
ip.dst = ip_server
ip.src = ip_client
ip.protocol = 1 #shows that ip header contains icmp as data 
# icmp type 3 + code 4 
icmp.type = 3
icmp.code = 4
mtu =1300
icmp.unused = mtu
#
# build original packet for ICMP ping request
#
ip_orig = IP()
ip_orig.src = ip_server
ip_orig.dst = ip_client
icmp_orig = TCP()
tcp_orig.sport = 50000 
tcp_orig.dport = 50000
tcp_orig.seq= original sequence number
#
# send the packet
#
send (ip/icmp/ip_orig/tcp_orig)

我正在遵循以下步骤来演示此ICMP的效果: 1 GT;服务器和客户端使用套接字相互通信 2 - ;一旦服务器接受连接,我在机器中暂停60秒,在此期间我禁用从客户端机器发出的所有TCP ACK(因为如果服务器收到它发送的消息的ACK,那么它将不会响应ICMP)。 3 GT;服务器首先向客户端发送消息,但不会收到任何ACK,服务器会不断重新发送消息,同时我注入了上面scapy代码中提到的ICMP消息:send(ip / icmp / ip_orig / tcp / orig)。我在发送的icmp中报告了MTU 1300。 4>理想情况下,服务器应该减少它的MTU并将消息发送回MTU大小为1300的客户端。

但是服务器不断重新传输MTU大小为1500的消息。请帮助我。 为什么服务器没有降低其MTU?我在演示中做错了吗?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

我在this answer及其评论中列出了一些指示:

  1. 规范要求封装在ICMP错误消息中的原始IP头(即ip_orig)与收到的IP头完全相同。因此,仅设置其源IP地址和目标IP地址(分别为ip_orig.srcip_orig.dst)可能还不够。
  2. 应该设置封装在ICMP错误消息中的原始TCP报头的序列号(即tcp_orig.seq),因为规范要求至少有8个字节的有问题的数据包的IP层有效负载是包含在ICMP错误消息中。
  3. 验证是否已启用路径MTU发现并且已设置DF位。您可enable path MTU discovery使用sysctl -w net.ipv4.ip_no_pmtu_disc=0
  4. 确认没有任何阻止ICMP消息的防火墙和/或iptables规则。