代码之家  ›  专栏  ›  技术社区  ›  MaPo

Linux,设置锁定ICMP_过滤器选项

  •  1
  • MaPo  · 技术社区  · 2 月前

    我对过滤ICMP数据包很感兴趣。更确切地说,我打开了一个未经处理的插座

    int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
    

    我有兴趣发送 PING_ECHO 并接收 PING_ECHOREPLY 小包。 我分别使用 sendto recvfrom 功能。到目前为止,一切顺利。

    我想使用以下方式过滤接收到的icmp数据包 setsockopt 具有 ICMP_FILTER 选项,可以在中找到 man raw 然而,它们对我来说有点神秘:

    ICMP_FILTER

    为绑定到的原始套接字启用特殊过滤器 IPPROTO_ICMP协议。该值为每条ICMP消息设置了一个位 应该过滤掉的类型。默认情况下不过滤ICMP 信息。

    我如何安全地设置这些位?我在网上找不到文件。环顾四周,我发现有一个 struct icmp_filter 定义于 linux/icmp.h 头球 但是,我不知道它是否是正确的标题。

    1 回复  |  直到 2 月前
        1
  •  2
  •   kabanus    2 月前

    icmp.h 确实是正确的标题。您可以查看的源代码 icmp.h 对于这些东西:

    #define ICMP_ECHOREPLY      0   /* Echo Reply           */
    #define ICMP_DEST_UNREACH   3   /* Destination Unreachable  */
    #define ICMP_SOURCE_QUENCH  4   /* Source Quench        */
    #define ICMP_REDIRECT       5   /* Redirect (change route)  */
    #define ICMP_ECHO       8   /* Echo Request         */
    #define ICMP_TIME_EXCEEDED  11  /* Time Exceeded        */
    #define ICMP_PARAMETERPROB  12  /* Parameter Problem        */
    #define ICMP_TIMESTAMP      13  /* Timestamp Request        */
    #define ICMP_TIMESTAMPREPLY 14  /* Timestamp Reply      */
    #define ICMP_INFO_REQUEST   15  /* Information Request      */
    #define ICMP_INFO_REPLY     16  /* Information Reply        */
    #define ICMP_ADDRESS        17  /* Address Mask Request     */
    #define ICMP_ADDRESSREPLY   18  /* Address Mask Reply       */
    

    这些是位定义(它在 man icmp ),所以你需要为你想要的选项设置相应的位,通常使用shift,使用 | 多个比特在一起。定义筛选器对象,然后设置数据字段

    struct icmp_filter my_filter = {
      1U << ICMP_ECHO | 
      1U << ICMP_TIME_EXCEEDED ...
    };
    

    等等,并使用以下命令将其传递给套接字选项 setsockopt .