使用IP_HDRINCL选项构造IP头发送ICMP包无报错但未实际发包问题
问题原因及修复方案
- 1 运行权限不足
原始套接字SOCK_RAW需要root权限才能创建和使用,运行程序时必须加sudo前缀,否则即使看起来没有报错,实际套接字创建失败也可能因为异常处理逻辑漏洞导致后续空执行。 - 2 网络字节序转换缺失(最核心丢包原因)
IP头的所有多字节字段(ip_len、ip_id、ip_off)都要求使用大端字节序(网络字节序),你代码中直接赋值主机字节序的数值,内核校验不通过会直接丢弃报文不会返回错误:
错误写法:
修正为:ip->ip_len=20+8; ip->ip_id=8848; ip->ip_off=IP_DF;ip->ip_len=htons(20+8); ip->ip_id=htons(8848); ip->ip_off=htons(IP_DF); - 3 源IP地址有效性问题
你硬编码的源IP192.168.1.69需要和你发送报文的网卡实际IP一致,否则内核会直接丢弃非法源IP的报文,或者将报文从其他匹配路由的接口发出,导致你在当前网卡抓不到包。 - 4 抓包配置问题
Wireshark抓包时要选择正确的出口网卡,同时设置过滤规则icmp避免其他报文干扰,还要确认本地防火墙没有拦截出口ICMP报文。 - 5 其他代码规范问题
main函数标准返回值为int,不是voidgetaddrinfo申请的内存需要用freeaddrinfo释放,避免内存泄漏
内容的提问来源于stack exchange,提问作者mojo
相关产品推荐
相关产品推荐

