NF_INET_LOCAL_OUT
根据优先级依次是 ip_vs_local_reply4,ip_vs_local_request4
| -- ip_vs_local_reply4
| -- ip_vs_out
| -- ip_vs_fill_iph_skb // 填充 ip 头
| -- ip_vs_proto_data_get // 根据 ip 头获取协议对应的 ipvs data
| -- pp->conn_out_get // 查询是否属于已存在的连接
| -- 有已存在连接
| -- handle_response // 回复,重写 报文,发送
| -- snat_handler // 使用协议 data 的 snat_handler 方法
| -- tcp_snat_handler // 如 tcp 的 snat 方法,修改 tcp 源端口为 vport,计算 checksum
| -- 修改源 ip 为 vip, 计算 checksum
| -- ip_vs_route_me_harder // 重新计算路由
| -- ip_vs_update_conntrack // 更新 nf_ct 表
| -- ip_vs_conn_put // 更新 连接
| -- 无已存在连接
| -- 允许发送 ipvs icmp 报文的情况下且没有 rs 的情况下,回复 ICMP_DEST_UNREACH 或 ICMP_PORT_UNREACH,并丢弃报文
| -- NF_ACCEPT
Local_OUT hook,即发包前,查询是否有 ipvs 已存在连接,如果有,做 snat 再发,如果没有且在 内核开启 vs_icmp_nat,有对应 rs 时(回包匹配到 rs),回复 ICMP_DEST_UNREACH/ICMP_PORT_UNREACH;其他通过 hook 点。
ip_vs_local_request4
| -- ip_vs_in
| -- ip_vs_proto_data_get // 获取协议
| -- cp = pp->conn_in_get // 查是否已存在连接
| -- ip_vs_try_to_schedule
| -- conn_schedule 对应协议的 conn_schedule // tcp 的 tcp_conn_schedule
| -- tcp_conn_schedule 根据报文查询 ipvs 的 service
| -- ip_vs_schedule ipvs 主要函数,调度去获取真实的后端
使用场景通常是需要 ipvs 应用将报文发送到真正的后端;在 k8s 中,使用该函数将流量发送到 rs文章来源:https://www.toymoban.com/news/detail-697041.html
如 kubernetes service 的 ipvs 使用过程中,每个节点都有 vip 的情况下,pod 访问 vip 时先 LOCAL_INPUT 的 ip_vs_remote_request4,再 LOCAL_OUT 的 ip_vs_local_request4。如果宿主机访问 vip,则是LOCAL_OUT 的 ip_vs_local_request4。文章来源地址https://www.toymoban.com/news/detail-697041.html
到了这里,关于ip_vs 原理解析 (四)hook 后的开始 NF_INET_LOCAL_OUT的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!