ICMP 报文包含 引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 字节?怎么验证

2021-11-14 15:03:10 +08:00
 amiwrong123

就是上面这句话,ICMP 报文包含 引起该 ICMP 报文首次生成的 IP 数据报的首部和前 8 字节? 我试了一下 wireshark 抓包 ping 命令,https://blog.csdn.net/weixin_41656968/article/details/80595038 ,还是没看出来头绪。所以怎么通过抓包验证这句话?

另外,“以便发送方能确定引发该差错的数据报”,这句话看起来好像很合理,但是我没有从抓包得到验证 上一句的证据,所以这句话也有点疑惑。

我只发现,每一对 ICMP 请求和回应里,它们的 ICMP 的 payload 都是什么 61 62 63 ... 这样的无意义的东西。

2079 次点击
所在节点    程序员
19 条回复
senghoo
2021-11-14 16:14:48 +08:00
ping ( ICMP Echo)没有, 他的 Payload 是 abcd....
其他的比如( Destination unreachable )。这部分是有 IP 头部和其他 8 字节内容。
xarthur
2021-11-14 16:23:38 +08:00
完全没看懂这个中文是什么意思……感觉是翻译的问题。
随便查了一个英文的说法是
1. Type (类型)一个字节,用来表示 ICMP 包的类型
2. Code (代码)一个字节,一般用来表示报文的类型和提供关于出错类型的附加信息
3. Checksum (校验码) 2 个字节,用来校验报文
4. Pointer (指针) 4 个字节,用来指出原始 IP 报文中出错的位置
5. 数据部分,IPv4 下是 72 字节,IPv6 下是 160 个字节,内容是有错误的 IP 报文
dendi009
2021-11-14 16:24:49 +08:00
wireshark 鼠标直接点 消息释义,比如 Internet Control Message 中的 Type:8 ( 8 请求 0 应答)。就能对找到对应的位。61 、62 、63 这些不是无意义, 是你打开方式不对,看对应位置,对应组合表达不同的约定意思。
dendi009
2021-11-14 16:30:57 +08:00
@dendi009 ICMP 指定报文大小的情况( ping -s )会追加 无意义数据到 协议内容后面的 data 数据里面。鼠标多点点就懂了
xarthur
2021-11-14 16:38:24 +08:00
https://imgur.com/a/D16tTsl.jpg
手工构造了一个 host-unreachable 的请求,你可以看到,确实会带 IP 包的信息的,包括地址。
xarthur
2021-11-14 16:39:38 +08:00
所以就像一楼说的,只是 ICMP Echo 的 payload 没有带而已。
amiwrong123
2021-11-14 16:46:47 +08:00
@xarthur #5
老哥,你的图床我死活看不到。我好想看,却看不到~( PS:可以用这个图床 https://imgurl.org/)

另外,你是咋手工构造的呀😂有点神奇哦
xarthur
2021-11-14 16:51:25 +08:00
https://i.bmp.ovh/imgs/2021/11/fde6026d72b3f82b.png
@amiwrong123 iptables 和 nftables 都可以指定某个地址 reject 时候返回的 ICMP 类型
xarthur
2021-11-14 16:56:52 +08:00
@amiwrong123 顺便 ICMP 的主要作用是用来报告 IP 报文的错误,不过一般人手动用 ICMP 最多的时候还是 Echo 就是了……
amiwrong123
2021-11-14 16:59:19 +08:00
@xarthur #8
看到了 12.12.12.12 就是 4 个 0C , 4 个 0C 后面的,就是我想要的 东西了。数了一下,payload 一共有 64 个字节。

即 IP 数据报的首部和前 8 字节 = 64 字节。哇,那 这个 IP 数据报的首部有 56 字节啊,好长啊
jedihy
2021-11-14 17:00:49 +08:00
ping 不行的,只有 ICMP error 才会带传输层的头部。抓包 tracert 就能看到。
xarthur
2021-11-14 17:04:56 +08:00
@amiwrong123 https://i.bmp.ovh/imgs/2021/11/4303fd586b8655a1.png
这张图你可能看的清楚点,4 个 0C (也就是 12.12.12.12 )之后就是我之前的发送报文( ICMP Echo )。
你注意看上面 Wireshark 给的报文结构
xarthur
2021-11-14 17:06:56 +08:00
@amiwrong123 ICMP 报文的数据部分的内容就是一个 IP 报文被截取(前 72 或者 160 个字节,根据 IP 类型不同)
amiwrong123
2021-11-14 17:11:16 +08:00
@xarthur
谢谢老哥,等会 我在我的 window 上也试一下~
xarthur
2021-11-14 17:15:08 +08:00
@amiwrong123 我刚刚说错了一个地方,ICMP 数据部分最高是 72 ( IPv4 )和 160 ( IPv6 )个字节,不是必然有这么多字节。
amiwrong123
2021-11-14 22:19:37 +08:00
@xarthur #8
我有点不太会弄这个 iptables ,本着不懂就问的原则,我先按照 这文章里的 https://www.cnblogs.com/EasonJim/p/6851007.html 先新建一个 rules.v4 ,做完步骤。然后在 这文件添加一行啥呢?(我是用 Windows 的 Ubuntu 虚拟机)

类似于
iptables -A INPUT -p tcp -m tcp --dport 4444 -j DROP 吗
xarthur
2021-11-14 23:42:02 +08:00
@amiwrong123 如果是虚拟机的话你要先把虚拟机的设置里把网卡改成桥接模式(这样虚拟机就有单独的 ip ,可以 ping )
然后直接在命令行输入
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
这样会禁止所有入站的包,并且返回 host-prohibited 类型的 icmp 报文,如果你要不同报文类型就改 —reject-with 后面的参数,具体有哪些看文档。
建议稍微看一眼 iptables 的用法。
反正是实验不用持久化,不用写到文本里的。
别忘了启用 ubuntu 的防火墙。
hxysnail
2021-11-15 10:39:51 +08:00
当 IP 包发生差错时,会将该差错包的头部以及前 8 个字节附到 ICMP 包的数据部分。

之所以要附上差错包的前 8 个字节,是因为: IP 报文数据经常承载传输层的协议分组,前 8 个字节刚好是分组的头部。有了差错包的传输层分组头部,则可以进一步确定差错是访问目标主机的什么端口产生的。关于 ICMP 协议更具体的内容,可以参照这篇文章: https://fasionchan.com/network/icmp/ping/

ping 命令也是利用 ICMP 报文的回显请求和回显响应报文来探测主机的。原理可以看下这篇: https://fasionchan.com/network/icmp/ping/
hxysnail
2021-11-15 10:40:42 +08:00
ICMP 协议的链接错了,应该是: https://fasionchan.com/network/icmp/icmp/

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/815287

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX