V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
amiwrong123
V2EX  ›  程序员

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

  •  
  •   amiwrong123 · 2021-11-14 15:03:10 +08:00 · 1845 次点击
    这是一个创建于 866 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    19 条回复    2021-11-15 10:40:42 +08:00
    senghoo
        1
    senghoo  
       2021-11-14 16:14:48 +08:00
    ping ( ICMP Echo)没有, 他的 Payload 是 abcd....
    其他的比如( Destination unreachable )。这部分是有 IP 头部和其他 8 字节内容。
    xarthur
        2
    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
        3
    dendi009  
       2021-11-14 16:24:49 +08:00
    wireshark 鼠标直接点 消息释义,比如 Internet Control Message 中的 Type:8 ( 8 请求 0 应答)。就能对找到对应的位。61 、62 、63 这些不是无意义, 是你打开方式不对,看对应位置,对应组合表达不同的约定意思。
    dendi009
        4
    dendi009  
       2021-11-14 16:30:57 +08:00
    @dendi009 ICMP 指定报文大小的情况( ping -s )会追加 无意义数据到 协议内容后面的 data 数据里面。鼠标多点点就懂了
    xarthur
        5
    xarthur  
       2021-11-14 16:38:24 +08:00
    https://imgur.com/a/D16tTsl.jpg
    手工构造了一个 host-unreachable 的请求,你可以看到,确实会带 IP 包的信息的,包括地址。
    xarthur
        6
    xarthur  
       2021-11-14 16:39:38 +08:00
    所以就像一楼说的,只是 ICMP Echo 的 payload 没有带而已。
    amiwrong123
        7
    amiwrong123  
    OP
       2021-11-14 16:46:47 +08:00
    @xarthur #5
    老哥,你的图床我死活看不到。我好想看,却看不到~( PS:可以用这个图床 https://imgurl.org/)

    另外,你是咋手工构造的呀😂有点神奇哦
    xarthur
        8
    xarthur  
       2021-11-14 16:51:25 +08:00
    https://i.bmp.ovh/imgs/2021/11/fde6026d72b3f82b.png
    @amiwrong123 iptables 和 nftables 都可以指定某个地址 reject 时候返回的 ICMP 类型
    xarthur
        9
    xarthur  
       2021-11-14 16:56:52 +08:00
    @amiwrong123 顺便 ICMP 的主要作用是用来报告 IP 报文的错误,不过一般人手动用 ICMP 最多的时候还是 Echo 就是了……
    amiwrong123
        10
    amiwrong123  
    OP
       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
        11
    jedihy  
       2021-11-14 17:00:49 +08:00
    ping 不行的,只有 ICMP error 才会带传输层的头部。抓包 tracert 就能看到。
    xarthur
        12
    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
        13
    xarthur  
       2021-11-14 17:06:56 +08:00
    @amiwrong123 ICMP 报文的数据部分的内容就是一个 IP 报文被截取(前 72 或者 160 个字节,根据 IP 类型不同)
    amiwrong123
        14
    amiwrong123  
    OP
       2021-11-14 17:11:16 +08:00
    @xarthur
    谢谢老哥,等会 我在我的 window 上也试一下~
    xarthur
        15
    xarthur  
       2021-11-14 17:15:08 +08:00
    @amiwrong123 我刚刚说错了一个地方,ICMP 数据部分最高是 72 ( IPv4 )和 160 ( IPv6 )个字节,不是必然有这么多字节。
    amiwrong123
        16
    amiwrong123  
    OP
       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
        17
    xarthur  
       2021-11-14 23:42:02 +08:00 via iPhone
    @amiwrong123 如果是虚拟机的话你要先把虚拟机的设置里把网卡改成桥接模式(这样虚拟机就有单独的 ip ,可以 ping )
    然后直接在命令行输入
    iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
    这样会禁止所有入站的包,并且返回 host-prohibited 类型的 icmp 报文,如果你要不同报文类型就改 —reject-with 后面的参数,具体有哪些看文档。
    建议稍微看一眼 iptables 的用法。
    反正是实验不用持久化,不用写到文本里的。
    别忘了启用 ubuntu 的防火墙。
    hxysnail
        18
    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
        19
    hxysnail  
       2021-11-15 10:40:42 +08:00
    ICMP 协议的链接错了,应该是: https://fasionchan.com/network/icmp/icmp/
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2764 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:18 · PVG 20:18 · LAX 05:18 · JFK 08:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.