ip_vs 原理解析 (五)hook 后的开始 NF_INET_LOCAL_OUT

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

如 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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值