12月技术周 | OpenStack Router原理分析


一、路由功能概述


在OpenStack中,不同网络(vlan)的虚拟机不能直接通信,除非借助路由器,可以是物理路由器或者虚拟路由器。在OpenStack中,默认使用虚拟机路由器功能,通过L3 agent来实现。


二、L3 agent概述


L3 agent 即 neutron-l3-agent 服务。运行在OpenStack的网络节点上,允许用户创建用于连接 2 层网络的虚机路由。L3 agent 实现了 3 层网络转发和 NAT功能。利用 Linux Network Namespaces,可以创建多个具有重合 IP 地址段的虚拟路由器,每个虚拟路由器都具有自己的 namespace,基于 router 在 Neutron 中的uuid来命名。


三、L3 agent的配置


1、在网络节点上,编辑l3_agent.ini,

vim /etc/neutron/l3_agent.ini

其中[DEFAULT] section的interface_driver是最重要的配置选项,用来指定

mechanism driver,neutron支持三种interface_driver,具体配置项如下:


使用openvswitch:

interface_driver =

neutron.agent.linux.interface.OVSInterfaceDriver


使用linuxbridge:

interface_driver = 

neutron.agent.linux.interface.BridgeInterfaceDriver


使用null:

interface_driver = 

neutron.agent.linux.interface.NullDriver


2、在控制节点上运行neutron命令行,检查neutron服务是否运行正常。


四、虚拟router操作


1、horizon界面创建虚拟机router,并添加网络接口。


12月技术周 | OpenStack Router原理分析

12月技术周 | OpenStack Router原理分析

2、重复操作,添加两个vlan网络到虚拟路由器,并在两个网络中分别创建一台虚拟机,拓扑效果如下:


12月技术周 | OpenStack Router原理分析


ps:后续的分析使用该环境数据:

虚拟机test1,IP 192.168.1.10, 网段192.168.1.0/24, 网关192.168.1.1

虚拟机test2,IP 192.168.2.12, 网段192.168.2.0/24, 网关192.168.2.1


3、验证虚拟机test1到test2的连通性。


五、虚拟router原理分析


1、创建虚拟router,并添加网络接口时,L3 agent会在网络节点的br-int创建一个port qr-xxx,同时创建一个qrouter-<router-id>的namespace,并在namespace里,将网段192.168.1.0/24的网关(默认是x.x.x.1)配置在qr-xxx网卡上。


a.查看br-int上的qr-xxx port

b.查看qrouter-<router-id> namespaces

c.查看namespace中的网关配置信息

c.查看qrouter-<router-id> namespace路由

d.查看虚拟机内部路由信息

ps:

a. qr-xxx的命名是使用gateway_port的id前11位

b. 使用namespace是为了解决网络地址重叠的问题

c. 该网段的所有虚拟机上在启动时,都下发一条指向网关(默认是x.x.x.1)的路由。


六、instance通过Router出外网


1、创建一个外部网络,并绑定到路由器。在内网上创建一个虚拟机test1,拓扑效果如下:


12月技术周 | OpenStack Router原理分析


实验环境:

内网: 192.168.1.0/24

外网: 10.100.1.0/24

test1 ip: 192.168.1.12,gateway:192.168.1.1

qg- ip:10.100.1.11


2、执行上述操作之后,L3 agent会在网络节点的br-int创建一个qg-xxx port,并在router namespace里,将从外网中随机分配一个ip(10.100.1.11)配置在qg-xxx网卡上,并下发一条iptables规则(snat)。


3、当test1 ping外网的ip时,会查询路由表,根据默认路由,将报文送到router。


4、当报文送达router之后,会先进入iptables的PREROUTING链,然后查询路由表。


然后会进入POSTROUTING链,做一次SNAT和连接跟踪。


5、通过以上流程实现instance到外网的通信。


七、浮动ip的实现分析


1、分配一个浮动ip,并关联到test1。


12月技术周 | OpenStack Router原理分析


绑定floating ip之后,neutron会在router的namespace中添加3条规则:dnat&snat,并将floating ip配置在qg-xxx上。


instance绑定floating ip之后,需要分析两种情况:instance到外网和外网到instance。


instance出外网


a、instance会根据默认路由将报文(源ip为fix ip:192.168.1.10)送到路由器。


b、报文到达router之后,会先进入PREROUTING链(此时不会命中,不做任何改变),然后查询路由表,准备进行转发(此时还未进行转发)。


c、随后进入iptables的POSTROUTING链,命中snat规则,将源ip修改为浮动ip,进行转发,将报文送到外网ip。


外网到instance


a、外网的报文(目的ip为floating ip:10.100.1.3)到达router之后,先进入PREROUTING链,命中dnat规则,将目的ip修改为instance的fix ip。


b、检查路由表,命中路由之后,准备从对应端口进行转发(此时还未进行转发)。


c、然后进入POSTROUTING链(未命中),进行转发,将报文送到instance。


关于九州云99Cloud

九州云成立于2012年,是中国早期从事OpenStack和相关开源服务的专业公司。公司成立六年,秉承“开源 · 赋能变革”的理念,不断夯实自身实力,已实现业务从核心云到边缘云再到垂直行业应用的拓展和积累,先后为政府、金融、运营商、能源、制造业、商业、交通、物流、教育、医疗等各大行业的企业级客户提供高质量的云计算服务。目前拥有国家电网、中国人民银行、中国银联、中国移动、中国电信、中国联通、中国资源卫星、eBay、国际陆港集团、中国人寿、万达信息、东风汽车、诺基亚等众多重量级客户,被用户认可为开源界的领军企业。

12月技术周 | OpenStack Router原理分析