IPVS之路由转发模式

2023-12-19 10:08
文章标签 模式 转发 路由 ipvs

本文主要是介绍IPVS之路由转发模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

如下ipvsadm配置命令:

$ ipvsadm -A -t 207.175.44.110:80 -s rr
$ ipvsadm -a -t 207.175.44.110:80 -r 192.168.10.1:80 -g

选项-g(–gatewaying)即指定使用Direct-routing转发模式。由ipvsadm-1.29源码中的选项解析函数parse_options可知,-g对应着Direct-routing模式,使用标志IP_VS_CONN_F_DROUTE标识。

static int parse_options(int argc, char **argv, struct ipvs_command_entry *ce, unsigned int *options, unsigned int *format)
{while ((c=poptGetNextOpt(context)) >= 0){switch (c) {case 'g':set_option(options, OPT_FORWARD);ce->dest.conn_flags = IP_VS_CONN_F_DROUTE;break;

连接绑定转发函数

在连接新建函数ip_vs_conn_new中,对于新创建的连接,使用函数ip_vs_bind_xmit为其绑定发送函数。

struct ip_vs_conn *ip_vs_conn_new(const struct ip_vs_conn_param *p, int dest_af, const union nf_inet_addr *daddr, __be16 dport, unsigned int flags, struct ip_vs_dest *dest, __u32 fwmark)
{struct ip_vs_conn *cp;cp = kmem_cache_alloc(ip_vs_conn_cachep, GFP_ATOMIC);#ifdef CONFIG_IP_VS_IPV6if (p->af == AF_INET6)ip_vs_bind_xmit_v6(cp);else
#endifip_vs_bind_xmit(cp);

对于转发模式为Direct-Routing的连接,其传输函数设置为ip_vs_dr_xmit。

/* Bind a connection entry with the corresponding packet_xmit. Called by ip_vs_conn_new. */
static inline void ip_vs_bind_xmit(struct ip_vs_conn *cp)
{ switch (IP_VS_FWD_METHOD(cp)) {case IP_VS_CONN_F_DROUTE:cp->packet_xmit = ip_vs_dr_xmit;break;

请求报文(Direct-Routing发送处理)

在netfilter的hook点NF_INET_LOCAL_IN或者NF_INET_LOCAL_OUT处理客户端请求报文时,函数ip_vs_in在进行完相应的处理之后,使用连接(如果连接不存在,将新建连接)的packet_xmit函数指针执行发送操作。对于Direct-Routing转发模式,其为函数ip_vs_dr_xmit。

static unsigned int ip_vs_in(struct netns_ipvs *ipvs, unsigned int hooknum, struct sk_buff *skb, int af)
{ip_vs_set_state(cp, IP_VS_DIR_INPUT, skb, pd);if (cp->packet_xmit)ret = cp->packet_xmit(skb, cp, pp, &iph);/* do not touch skb anymore */

以下看一下Direct-Routing发送函数ip_vs_dr_xmit,首先使用出口路由查找函数__ip_vs_get_out_rt,更新skb中的路由缓存,关于IPVS路由函数请参考:https://blog.csdn.net/sinat_20184565/article/details/102410129。

其次对于路由目的地为本地的报文,使用函数ip_vs_send_or_cont进行处理。否则,对于非本地报文,计算IP头部校验和,最后也是使用函数ip_vs_send_or_cont进行处理。在进行转发之前,设置忽略禁止分片标志ignore_df,以避免在分片函数ip_fragment中,遇到IP报头设置有DF标志的报文,并且其长度大于MTU,而引发icmp_send函数发送代码为ICMP_FRAG_NEEDED的ICMP报文。

int ip_vs_dr_xmit(struct sk_buff *skb, struct ip_vs_conn *cp, struct ip_vs_protocol *pp, struct ip_vs_iphdr *ipvsh)
{local = __ip_vs_get_out_rt(cp->ipvs, cp->af, skb, cp->dest, cp->daddr.ip,IP_VS_RT_MODE_LOCAL | IP_VS_RT_MODE_NON_LOCAL | IP_VS_RT_MODE_KNOWN_NH, NULL, ipvsh);if (local < 0)goto tx_error;if (local)return ip_vs_send_or_cont(NFPROTO_IPV4, skb, cp, 1);ip_send_check(ip_hdr(skb));/* Another hack: avoid icmp_send in ip_fragment */skb->ignore_df = 1;ip_vs_send_or_cont(NFPROTO_IPV4, skb, cp, 0);

看一下最终的发送处理函数ip_vs_send_or_cont,由以上介绍可知,最后一个参数local标识当前报文的目的地是本机还是外部主机。对于本机,不做处理,仅返回NF_ACCEPT交由协议栈进行处理。对于非本机报文,执行netfilter的NF_INET_LOCAL_OUT点的hook函数,最后由dst_output执行发送,其实际上将调用ip_output执行。

/* return NF_STOLEN (sent) or NF_ACCEPT if local=1 (not sent) */
static inline int ip_vs_send_or_cont(int pf, struct sk_buff *skb, struct ip_vs_conn *cp, int local)
{int ret = NF_STOLEN;skb->ipvs_property = 1;if (likely(!(cp->flags & IP_VS_CONN_F_NFCT)))ip_vs_notrack(skb);if (!local) {ip_vs_drop_early_demux_sk(skb);skb_forward_csum(skb);NF_HOOK(pf, NF_INET_LOCAL_OUT, cp->ipvs->net, NULL, skb,NULL, skb_dst(skb)->dev, dst_output);} elseret = NF_ACCEPT;

内核版本 4.15

这篇关于IPVS之路由转发模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/511784

相关文章

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Nginx路由匹配规则及优先级详解

《Nginx路由匹配规则及优先级详解》Nginx作为一个高性能的Web服务器和反向代理服务器,广泛用于负载均衡、请求转发等场景,在配置Nginx时,路由匹配规则是非常重要的概念,本文将详细介绍Ngin... 目录引言一、 Nginx的路由匹配规则概述二、 Nginx的路由匹配规则类型2.1 精确匹配(=)2

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

Linux系统配置NAT网络模式的详细步骤(附图文)

《Linux系统配置NAT网络模式的详细步骤(附图文)》本文详细指导如何在VMware环境下配置NAT网络模式,包括设置主机和虚拟机的IP地址、网关,以及针对Linux和Windows系统的具体步骤,... 目录一、配置NAT网络模式二、设置虚拟机交换机网关2.1 打开虚拟机2.2 管理员授权2.3 设置子

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M