IPVS的实现利用了Netfilter的三个Hook点,分别是:NF_INET_LOCAL_IN、NF_INET_LOCAL_OUT和NF_INET_FORWARD。在每个Hook点,IPVS注册了两个钩子函数。如下所示:

static const struct nf_hook_ops ip_vs_ops[] = {/* After packet filtering, change source only for VS/NAT */{.hook       = ip_vs_reply4,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_LOCAL_IN,.priority   = NF_IP_PRI_NAT_SRC - 2,},/* After packet filtering, forward packet through VS/DR, VS/TUN,* or VS/NAT(change destination), so that filtering rules can be applied to IPVS. */{.hook       = ip_vs_remote_request4,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_LOCAL_IN,.priority   = NF_IP_PRI_NAT_SRC - 1,},/* Before ip_vs_in, change source only for VS/NAT */{.hook       = ip_vs_local_reply4,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_LOCAL_OUT,.priority   = NF_IP_PRI_NAT_DST + 1,},/* After mangle, schedule and forward local requests */{.hook       = ip_vs_local_request4,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_LOCAL_OUT,.priority   = NF_IP_PRI_NAT_DST + 2,},/* After packet filtering (but before ip_vs_out_icmp), catch icmp destined for 0.0.0.0/0, which is for incoming IPVS connections */{.hook       = ip_vs_forward_icmp,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_FORWARD,.priority   = 99,},/* After packet filtering, change source only for VS/NAT */{.hook       = ip_vs_reply4,.pf     = NFPROTO_IPV4,.hooknum    = NF_INET_FORWARD,.priority   = 100,},
}

如下表所示,IPVS中对于Request和Reply的定义,是按照由外部客户端到IPVS内部的报文为Request;而由IPVS内部回复到外部客户端的报文为Reply。所以,Hook函数的命名中带有request的都对应IPVS核心函数ip_vs_in;而Hook函数命名中带有reply的函数都对应IPVS的核心函数ip_vs_out。

HOOK 函数 核心函数 Priority
NF_INET_LOCAL_IN ip_vs_reply4 ip_vs_out NF_IP_PRI_NAT_SRC - 2
NF_INET_LOCAL_IN ip_vs_remote_request4 ip_vs_in NF_IP_PRI_NAT_SRC - 1
NF_INET_LOCAL_OUT ip_vs_local_reply4 ip_vs_out NF_IP_PRI_NAT_DST + 1
NF_INET_LOCAL_OUT ip_vs_local_request4 ip_vs_in NF_IP_PRI_NAT_DST + 2
NF_INET_FORWARD ip_vs_forward_icmp ip_vs_in_icmp 99
NF_INET_FORWARD ip_vs_reply4 ip_vs_out 100

Hook点LOCAL_IN

在Hook点NF_INET_LOCAL_IN上,IPVS挂载了两个函数ip_vs_reply4和ip_vs_remote_request4,其中前者优先级高于后者。前者ip_vs_reply4主要用于NAT/Masq转发模式,其核心处理函数为ip_vs_out,负责处理IPVS系统回复给外部客户端的报文,包括修改IP地址等。

由于是回复报文,要求系统中已经存在连接,否则处理IPVS系统中真实服务器可能发送的ICMP报文。

static unsigned int ip_vs_out(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int af)
{/* Check if the packet belongs to an existing entry*/cp = pp->conn_out_get(ipvs, af, skb, &iph);if (likely(cp)) {if (IP_VS_FWD_METHOD(cp) != IP_VS_CONN_F_MASQ)goto ignore_cp;return handle_response(af, skb, pd, cp, &iph, hooknum);}if (sysctl_nat_icmp_send(ipvs) &&(pp->protocol == IPPROTO_TCP ||pp->protocol == IPPROTO_UDP ||pp->protocol == IPPROTO_SCTP)) {

另外一个Hook函数ip_vs_remote_request4,其核心函数为ip_vs_in,负责处理由外部客户端进入IPVS系统的报文,如果没有可用的连接,将使用调度函数进行调度处理,创建连接结构。

static unsigned int ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int af)
{if (unlikely(!cp)) {int v;if (!ip_vs_try_to_schedule(ipvs, af, skb, pd, &v, &cp, &iph))return v;}ip_vs_in_stats(cp, skb);ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pd);if (cp->packet_xmit)ret = cp->packet_xmit(skb, cp, pp, &iph);
}

Hook点LOCAL_OUT

与前一节的NF_INET_LOCAL_IN Hook点不同,此处的NF_INET_LOCAL_OUT的Hook点用于处理IPVS本机发送的报文。而前者用于处理外部客户端进入IPVS系统的报文。

在Hook点NF_INET_LOCAL_OUT上,IPVS挂载了两个函数ip_vs_local_reply4和ip_vs_local_request4,其中前者优先级高于后者。前者ip_vs_local_reply4的核心函数为ip_vs_out,主要用于NAT/Masq转发模式,负责NAT地址的修改。

函数ip_vs_local_request4的核心函数为ip_vs_in,其负责处理由本机应用层进入IPVS系统的报文的调度和发送。

Hook点FORWARD

在Hook点NF_INET_FORWARD上,IPVS挂载了两个函数ip_vs_forward_icmp和ip_vs_reply4,其中前者优先级高于后者。前者ip_vs_forward_icmp的核心处理函数为ip_vs_in_icmp,用于处理外部进入IPVS系统的ICMP报文,将其调度到对应的真实服务器上。

static int ip_vs_in_icmp(struct netns_ipvs *ipvs, struct sk_buff *skb, int *related, unsigned int hooknum)
{cp = pp->conn_in_get(ipvs, AF_INET, skb, &ciph);if (!cp) {int v;if (!sysctl_schedule_icmp(ipvs))return NF_ACCEPT;if (!ip_vs_try_to_schedule(ipvs, AF_INET, skb, pd, &v, &cp, &ciph))return v;new_cp = true;}verdict = ip_vs_icmp_xmit(skb, cp, pp, offset, hooknum, &ciph);

函数ip_vs_reply4,核心函数为ip_vs_out,主要用于NAT/Masq转发模式,负责NAT地址的修改。对于真实服务器回复的报文,其目的地址为外部客户端的地址,非IPVS系统的虚拟地址,所以其将进入此转发Hook点,此时进行SNAT转换,将源地址转换为IPVS的虚拟地址。

内核版本 4.15

IPVS使用的Netfilter Hook点相关推荐

  1. netfilter hook函数

    HOOK函数注册 image.png 上图是netfilter中注册的部分hook函数.这些hook函数是通过 nf_register_hook注册到二维数组nf_hooks中的. enum nf_i ...

  2. linux hook 任意内核函数,【求助】Kernel 4.8下编译编写的Netfilter Hook函数失败

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 #include #include #include #include #include MODULE_LICENSE("Dual BSD/GP ...

  3. 【博客587】ipvs hook点在netfilter中的位置以及优先级

    ipvs hook点在netfilter中的位置以及优先级 1.netfilter栈全景图 2.Netfilter hooks 五个hook点: 每个 hook 在内核网络栈中对应特定的触发点位置,以 ...

  4. Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架 — conntrack(CT,连接跟踪)

    目录 文章目录 目录 CT CT CT(conntrack,connection tracking,连接跟踪),顾名思义,就是跟踪(并记录)连接的状态,是许多网络应用的基础.例如:iptables.L ...

  5. K8S中iptables和ipvs区别

    原文 从k8s的1.8版本开始,kube-proxy引入了IPVS模式,IPVS模式与iptables同样基于Netfilter,但是ipvs采用的hash表,iptables采用一条条的规则列表.i ...

  6. IPVS(也叫LVS)的源码分析之persistent参数

    最近在用 LVS做 LB,发现一个问题客户端总是出现session丢失问题,采用常用配置,均衡策略使用wlc, 看了一下wlc的策略相同的客户端都有可能轮训到不同的后台机器,在后台服务器上并没有对se ...

  7. 深入理解 netfilter 和 iptables!

    Netfilter (配合 iptables)使得用户空间应用程序可以注册内核网络栈在处理数据包时应用的处理规则,实现高效的网络转发和过滤.很多常见的主机防火墙程序以及 Kubernetes 的 Se ...

  8. iptables命令_理解 Linux 下的 Netfilter/iptables

    Netfilter/iptables 项目由 Rusty Russe 创建于1998年,并于 1999 年建立了 Netfilter Core team,并在此后负责维护此项目,同时也于2000年3月 ...

  9. 【转】Linux Netfilter实现机制和扩展技术

    转自https://www.ibm.com/developerworks/cn/linux/l-ntflt/index.html 作者: 杨沙洲 2.4.x的内核相对于2.2.x在IP协议栈部分有比较 ...

  10. Netfilter 详解

    其他不错的文章: http://bbs.chinaunix.net/thread-2196854-1-1.html 引用: http://blog.chinaunix.net/uid-24977843 ...

最新文章

  1. LeetCode: 111. Minimum Depth of Binary Tree
  2. mysql group by 报错 ,only_full_group_by 三种解决方案
  3. MySQL-获取有性能问题SQL的方法_慢查询 实时获取
  4. Flask学习记录之Flask-SQLAlchemy
  5. 计算机应用基础的题库,统考计算机应用基础题库
  6. 道路计划猿练级(笔者:陈浩)
  7. Nhibernate学习的第一天
  8. Machine Learning - XI. Machine Learning System Design机器学习系统设计(Week 6)系统评估标准
  9. Dxg——AD(Altium Designer) 开发笔记整理分类合集【所有的相关记录,都整理在此】
  10. 2021年道路运输企业主要负责人和安全生产管理人员安全考核题型[安考星]
  11. 台式电脑主板插线步骤图_台式电脑主板接线图解
  12. burp暴力破解 ——合天网安实验室学习笔记
  13. arm android开发板推荐,arm7开发板推荐 最新arm开发板了解
  14. 泛微oa流程表单之流程阻止提交
  15. Linux 操作系统的体系结构
  16. 跟我学Spring3-开涛-笔记
  17. 安装office提示Office 16 Click-to-Run Extensibility Component
  18. python的sqlite数据库_Python操作SQLite数据库
  19. AAC 音频数据的两种格式
  20. MPU6500模块调试笔记——小心冒牌货

热门文章

  1. html双线型边框线怎么设置,Word文字边框双线条怎么设置
  2. 会议论文参考文献格式(待更新)
  3. Maven: was cached in the local repository, resolution will not be reattempted until...
  4. 学习 FPGA 经验与书籍
  5. 高性能MySQL读书笔记(一)
  6. SQL 错误: Statement cancelled due to client request
  7. 1563页Go语言中文文档,涵盖Go语言所有核心知识点
  8. uniapp 安卓ios端热更新
  9. 数据库MySQL中更新数据库update
  10. 华为手机鸿蒙系统官方下载入口,华为鸿蒙系统官方下载入口