Neutron L3
L3的实现只负责路由的功能,传统路由器中的其他功能(如Firewalls、LB、VPN)都被独立出来实现了,因此ML3的实际需求比较少。
neutron-server 接到请求 –> 将请求发送到MQ –> neotron-plugins 得到请求 –> 发送请求到MQ –> neotron-agent 建立网络设备。
neutron-plugin : 处理 Neutron Server 发来的请求,维护 OpenStack 逻辑网络的状态, 并调用 Agent 处理请求。每个厂商基于Openstack开发了模拟自己硬件的软件,这个软件就是plugin。 在早期,每个厂商开发各自的plugin,功能也是各自实现,有大量的代码是重复的;另外,不同的厂商有不同的开发标准,导致程序的兼容性很差。针对这种情况neutron-plugin 被分为了两部分:Core-plugin 和 Service-plugin 。
Service-plugin : 即为除core-plugin以外其它的plugin,包括l3 router、firewall、loadbalancer、VPN、metering等等,主要实现L3-L7的网络服务。这些plugin要操作的资源比较丰富,对这些资源进行操作的REST API被neutron-server看作Extension API,需要厂家自行进行扩展。
Router
提供虚拟三层服务,包括租户网络(Tenant Network)之间、租户网络与外部网络(External Network)之间的路由和网络地址转换,原生模式下路由器管理功能以Service Plugin的形式集成在Neutron Server中,路由器实体以Linux网络命名空间的形式存在,由Neutron L3 Agent管理。
由上图可以看出,Neutron L3模块的功能主要由Server端的L3RouterPlugin和Agent端的L3NATAgentWithStateReport配合实现:
Client通过HTTP向Server发起L3资源Router、Floating IP的管理命令,Server负责处理资源在数据库的增删改查,并通过RPC将资源的更新事件通知到Agent,Agent最终通过Linux下的网络工具栈来实现具体的L3功能。
L3的核心资源是Router,大部分L3 API都是围绕着Router的基础属性、扩展属性或附属资源的增删改查,Router也是L3 Plugin与L3 Agent进行同步的数据单元。
neutron-agent : 处理 Plugin 的请求,负责在 network provider 上真正实现各种网络功能。和 plugin 是一一对应的关系。
iproute2
如何查看网络接口、地址、路由
iproute2 工具包最基础的功能就是管理本机的网络接口。
ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 54:be:f7:08:c2:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.56.126/24 brd 192.168.56.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::56be:f7ff:fe08:c21b/64 scope link
valid_lft forever preferred_lft forever
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 54:be:f7:08:c2:1b brd ff:ff:ff:ff:ff:ff
inet 192.168.56.126/24 brd 192.168.56.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::56be:f7ff:fe08:c21b/64 scope link
valid_lft forever preferred_lft forever
你也可以输入如下的命令来修改 MTU 和分组队列的长度:
ip link set eth1 mtu 1500
ip link set eth1 txqueuelen 1000
一般来说,本机的网络接口通常会被命名成像是eth0,eth1,lo这样的名称。在过去,常常使用net-tools包提供的ifconfig命令来配置网络接口。而使用iproute2时,通常可以使用子命令ip addr和ip link来完成相同的功能。
IP 路由规则(rule)
ip rule show
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
这三条路由规则是内核配置的默认规则。第一行可以匹配任何流量,用于路由高优先级的流量。第二行是处理常规路由的主要规则。最后一行是空规则,如果上面的规则与数据包不匹配,则使用该行进行后处理(post-processing)。
OpenStack FWaaS功能
在架构设计上, Neutron沿用了OpenStack完全分布式的思想,各组件之间通过消息机制进行通信,使得Neutron中各个组件甚至各个进程都可以运行在任意的节点上。
SWaas
Neutron是OpenStack网络即服务项目,包括一个防火墙即服务(FWaaS)插件,该插件在OpenStack对象(如项目、路由器端口和路由器)上实施防火墙。
防火墙规则:指定当流量与一组属性(如端口范围、协议或IP地址)匹配时,防火墙应采取的操作(允许或拒绝)。
防火墙策略:一组有序的规则。你可以发布策略以在项目间共享。
防火墙可以根据你使用的驱动程序以各种方式实现。
例如:
——iptables驱动程序使用iptable规则来实现防火墙;
——OpenVSwitch驱动程序使用流表中的流条目来实现防火墙规则;
——Cisco防火墙驱动程序可用于NSX设备。
FWaaS v2的新增功能如下:
FWaaS v1已被弃用,取而代之的是v2。在v2中,防火墙的概念已被防火墙组所取代,这表明防火墙需要两个策略:出口策略和入口策略。防火墙组应用于端口级别,而不是路由器级别,你可以指定要保护的路由器端口。
FWaaS 2中的新功能概括如下:
——默认情况下不支持路由器的3级防火墙,但你可以通过将防火墙组应用于某个路由器中的所有端口来启用它。
——支持路由器端口的3级防火墙。
——支持2级防火墙(即VM端口)。
——提供命令行界面(CLI)。
——支持OpenStack Horizon仪表板。
启用FWaaS v2
要在OpenStack中启用FWaaS v2插件,需要执行以下步骤:
——安装必要的软件依赖关系。你需要安装neutron-fwaas和neutron-fwaas-dashboard包以及特定OpenStack部署所需的任何其他依赖关系。
——在OpenStack配置文件中启用FWaaS v2插件。这通常涉及将以下行添加到neutron.conf文件中:
[fwaas]
driver = neutron_fwaas.services.firewall.drivers.linux.iptables_fwaas.IptablesFwaasDriver
——重新启动OpenStack Neutron服务。你需要重新启动Neutron服务才能使更改生效。
iptables和firewalld都不是真正的防火墙,他们都是用来定义防火墙策略的防火墙管理工具而已,他们只是一种服务,iptables服务会把配置好的防火墙策略交给内核层面的netfilter网络过滤器来处理。而firewalld服务则是把配置好的防火墙策略交给内核层面的nftables包过滤框架来处理。
VPN
sudo apt-get install neutron-vpnaas-agent
sudo service neutron-vpn-agent restart
编辑/etc/neutron/neutron.conf文件并添加以下行:
service_plugins = router,vpnaas
sudo service neutron-server restart
sudo neutron-db-manage --subproject neutron-vpnaas upgrade head
创建VPNaaS服务提供者:
neutron vpn-service-provider-create --name <provider-name> \
--vpn-service-provider <vpn-service-provider>
此命令将创建一个名为<provider-name>
的VPNaaS服务提供者,并将其配置为<vpn-service-provider>
。
neutron vpn-service-list
创建VPN连接:
neutron ipsec-site-connection-create --name <ipsec-connection-name> \
--vpnservice-id <vpn-service-id> \
--ikepolicy-id <ikepolicy-id> \
--ipsecpolicy-id <ipsecpolicy-id> \
--peer-address <peer-address> \
--peer-cidr <peer-cidr> \
--peer-id <peer-id> --psk <psk> \
--mtu <mtu> --dpd <dpd> --initiator <initiator>
此命令将创建一个名为<ipsec-connection-name>
的VPN连接,并配置其所属的VPN服务、IKE策略、IPsec策略、对等地址、对等CIDR、对等ID、预共享密钥、MTU、DPD和发起方。
neutron ipsec-site-connection-list