新闻详情

新闻详情

首页 / 资讯中心 / 详情

Linux raw_sendmsg原始套接字与IP_HDRINCL控制

发布时间:2026/9/16 2:33:43来源:尧图网络
Linux raw_sendmsg原始套接字与IP_HDRINCL控制
Linux raw_sendmsg原始套接字与IP_HDRINCL控制原始套接字AF_INET, SOCK_RAW允许用户空间直接构造和发送IP数据报。raw_sendmsg是内核中处理原始套接字发送的核心函数位于net/ipv4/raw.c。它的关键设计围绕两个核心问题是否由用户填充IP头IP_HDRINCL控制以及如何校验和处理用户输入。一、 IP_HDRINCL选项与路径分岔用户通过 setsockopt(IP_HDRINCL) 控制IP头填充责任的归属。当 IP_HDRINCL 为1时用户必须在sendmsg的缓冲区中包含完整的IP头当 IP_HDRINCL 为0默认时内核自动构造IP头。raw_sendmsg的入口首先要检查此选项static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len){struct inet_sock *inet inet_sk(sk);struct ipcm_cookie ipc;struct rtable *rt NULL;int hdrincl;int err;struct flowi4 fl4;int free_len;hdrincl inet-hdrincl;if (hdrincl) {/* 用户提供了IP头len必须至少20字节 */if (len sizeof(struct iphdr))return -EINVAL;free_len len - sizeof(struct iphdr);} else {/* 内核构造IP头整个payload都是数据 */free_len len;}/* 路由查找 */err ipc_parse_header(sk, ipc, msg);if (err 0)return err;/* 根据hdrincl决定是否校验源地址等 */if (!hdrincl) {/* 内核构造IP头时需要获取源地址 */if (!ipc.addr)ipc.addr inet-inet_saddr;}/* 路由查找 */if (ipc.oif)fl4.flowi4_oif ipc.oif;elsefl4.flowi4_oif sk-sk_bound_dev_if;security_sk_classify_flow(sk, flowi4_to_flowi_common(fl4));rt ip_route_output_flow(net, fl4, sk);if (IS_ERR(rt))goto done;}二、 IP_HDRINCL1的精确实现在ip_reply_append当IP_HDRINCL 打开时用户数据的前20字节被视为IP头。内核需要对这个假IP头进行合法性校验。关键的校验逻辑在 raw_send_hdrincl 函数中static int raw_send_hdrincl(struct sock *sk, struct flowi4 *fl4,struct msghdr *msg, size_t len,struct rtable **rtp, int flags){struct iphdr *iph;int err;int offset sizeof(struct iphdr);/* 从用户态拷贝IP头以便校验 */iph (struct iphdr *)msg-msg_iter.iov-iov_base;/* 校验IP头版本号必须为4 */if (iph-version ! 4)return -EINVAL;/* 校验IP头长度不小于20字节 */if (iph-ihl 5)return -EINVAL;/* 校验总长度是否和用户提供的数据长度一致 */if (ntohs(iph-tot_len) 0) {/* tot_len为0表示由内核计算 */} else if (ntohs(iph-tot_len) len) {return -EINVAL;}/* 拷贝协议字段用于路由查找 */fl4-fl4_icmp_type 0;fl4-fl4_icmp_code 0;/* 从用户提供的IP头中提取目的地址 */fl4-daddr iph-daddr;fl4-saddr iph-saddr;/* 检查用户是否设置了一些危险选项 */if (iph-frag_off htons(IP_MF | IP_OFFSET)) {/* 如果启用了分片需要确保分片偏移合法 */}return offset;}注意这里内核会对IP头中的关键字段做基本验证但不做完整验证——因为RAW套接字本身就是设计来给特权用户完全控制IP头的。三、 skb构建与发送raw_sendmsg 在完成路由查找后通过 ip_append_data 或直接调用 ip_push_pending_frames 来发送数据err ip_append_data(sk, fl4, raw_send_hdrinc, ipc, rt,msg-msg_iov, free_len, ipc.transhdrlen,(hdrincl ? IP_HDRINCL : 0) | msg-msg_flags,first_skb, err);if (err)goto error;if (first_skb) {err ip_local_out(net, sk, first_skb);if (err)goto error;}当IP_HDRINCL为1时ip_append_data通过回调raw_send_hdrinc将用户提供的完整IP头连同数据一起拷贝到skb中。当IP_HDRINCL为0时ip_append_data内部构造IP头。四、 checksum校验与ICMP特殊处理对于RAW套接字IP头的校验和由硬件决定。用户提供的IP头中 checksum 字段的填充规则是if (hdrincl) {if (inet-cork.flags IPCORK_OPT)ip_options_build(skb, inet-cork.opt, inet-cork.addr, rt, 0);elseip_options_build(skb, NULL, fl4-daddr, rt, 0);/* 计算IP头校验和 */iph ip_hdr(skb);iph-check 0;ip_send_check(iph);}ip_send_check 计算IP头checksum并写入 iph-check 字段。该函数定义在 net/ipv4/ip_output.cvoid ip_send_check(struct iphdr *iph){iph-check 0;iph-check ip_fast_csum((unsigned char *)iph, iph-ihl);}无论IP_HDRINCL是否开启IP头校验和总是由内核计算。用户设置的值被内核覆盖。五、 分片处理与IP_MF标志raw_sendmsg 在两种模式下有不同的分片行为。IP_HDRINCL0时由 ip_append_data 的常规分片逻辑处理超过MTU的数据被分片成多个skb。IP_HDRINCL1且用户设置了分片相关字段时情况更复杂if (hdrincl iph-frag_off htons(IP_DF)) {/* 用户设置了DF标志禁止分片 */if (free_len dst_mtu(rt-dst)) {err -EMSGSIZE;goto error;}}当用户设置IP_DF且数据长度超过MTU时内核返回EMSGSIZE错误这是PMTU发现机制的基础。用户也可以自行设置IP_MF和偏移字段来控制分片行为此时内核基本上信任用户的设置。六、 安全校验与capability检查原始套接字的使用受到严格的权限控制。在 raw_sendmsg 的入口处需要检查 CAP_NET_RAW 权限static int raw_create(struct net *net, struct socket *sock, int protocol, int kern){struct sock *sk;if (kern)return raw_sk_create(net, sock, protocol, kern);/* 非内核创建的RAW套接字需要CAP_NET_RAW */if (!ns_capable(net-user_ns, CAP_NET_RAW))return -EPERM;return raw_sk_create(net, sock, protocol, kern);}此外内核还通过 security_sock_rcv_skb 和 iptable_raw 等安全模块对raw套接字的数据包进行过滤。即使拥有CAP_NET_RAW权限用户也可能被iptables规则限制。raw_sendmsg 的整个发送路径可以概括为权限检查 - IP_HDRINCL路径选择 - 路由查找 - ip_append_data(skb构建) - ip_local_out(路由输出) - dst_output - neigh_output - dev_queue_xmit。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Qwen3.5多模态大模型架构与PPIO平台部署实践 2026/9/16 10:50:38

Qwen3.5多模态大模型架构与PPIO平台部署实践

1. Qwen3.5技术架构与核心能力解析Qwen3.5作为阿里云最新推出的多模态大模型,其技术架构采用了混合专家系统(MoE)设计。基础层包含约700亿参数,通过动态路由机制实现不同任务场景下的专家模块组合调用。这种设计在保持模型规模的同…

阅读更多 →
Zero-Party Data应用场景与行业实践解析 2026/9/16 10:50:38

Zero-Party Data应用场景与行业实践解析

1. 领域适配性分析:哪些行业最适合构建Zero-Party Data产品1.1 高价值消费者互动领域在消费者决策周期长、品牌忠诚度高的行业,Zero-Party Data(零方数据)的价值尤为突出。奢侈品行业就是个典型案例——卡地亚去年推出的个性化珠宝…

阅读更多 →
jQuery Mobile表格开发实战与优化技巧 2026/9/16 10:50:38

jQuery Mobile表格开发实战与优化技巧

1. jQuery Mobile表格开发实战指南在移动端Web开发中,数据展示一直是核心需求之一。jQuery Mobile作为曾经风靡一时的移动端框架,其表格组件虽然不像现代框架那样功能丰富,但在简单数据展示场景中依然有其独特的优势。我曾在多个企业级移动项…

阅读更多 →
AI会议系统:跨国协作的智能解决方案 2026/9/16 10:50:38

AI会议系统:跨国协作的智能解决方案

1. 项目背景与核心价值在2023年ISE全球科技盛会上,一个名为"公信AI会议生态"的系统引发了行业广泛关注。这个基于人工智能技术的会议解决方案,正在重新定义跨国协作的效率和体验。作为现场亲测者,我发现这套系统完美解决了传统国际…

阅读更多 →
墨蝌签名点数充值与使用全攻略 2026/9/16 10:50:38

墨蝌签名点数充值与使用全攻略

1. 墨蝌签名点数充值全流程解析 作为一名长期使用墨蝌签名工具的开发人员,我深知点数充值这个看似简单的操作,在实际使用中却经常遇到各种问题。今天我就把完整的充值流程和这些年积累的经验技巧分享给大家。 墨蝌的IPA重签名服务采用点数计费模式&…

阅读更多 →
微调电路实战:从电位器到电阻网络的参数调整与故障排查 2026/9/16 10:47:38

微调电路实战:从电位器到电阻网络的参数调整与故障排查

前几天帮朋友处理一块控制板的信号异常,现象是传感器通道输出偏差很大,查了一圈最后问题锁定在两个元器件上:一个是板上的PTA3043-2015CPB103微调电位器,另一个是丝印R7KA8D2KFLCAC的贴片电阻网络。调完参数、重新标定之后&#x…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞