Neutron 对虚拟三层网络的实现是通过其 L3 Agent (neutron-l3-agent)
该 Agent 利用 Linux IP 栈、route 和 iptables 来实现内网内不同网络内的虚机之间的网络流量,以及虚机和外网之间网络流量的路由和转发
为了在同一个Linux 系统上支持可能的 IP 地址空间重叠,它使用了 Linux network namespace 来提供隔离的转发上下文
基础知识
Linux network namespace
概念及操作
在二层网络上,VLAN 可以将一个物理交换机分割成几个独立的虚拟交换机
在三层网络上,Linux network namespace(netns) 可以将一个物理三层网络分割成几个独立的虚拟三层网络
Network namespace (netns)从 Linux 2.6.24 版本开始添加,直到 2.6.29 添加完成。每个 netns 拥有独立的 (virtual)network devices, IP addresses, IP routing tables, /proc/net directory, ports 等等。新创建的 netns 默认只包含 loopback device。除了这个设备,每个 network device,不管是物理的还是虚拟的网卡还是网桥等,都只能存在于一个 netns。而且,连接物理硬件的物理设备只能存在于 root netns。其它普通的网络设备可以被创建和添加到某个 netns
namespace 间的通信
- 一种简单的方式是使用 Linux veth pair 来实现两个 network namespace 之间的通信
- 当有两个以上的 network namespace 之间需要通信时,需要使用一个虚机交换机,和两个 veth pair
传统的方式是 Linux bridge,也可以使用 Open vSwitch - 再一种方式是使用 Open vSwitch 和 OVS internal ports
veth (virtual Ethernet interfaces) 设备:这是一种成对出现的特殊网络设备,它们象一根管道一样连接在一起
VETH 设备总是成对出现,送到一端请求发送的数据总是从另一端以请求接受的形式出现
创建并配置正确后,向其一端输入数据,VETH 会改变数据的方向并将其送入内核网络核心,完成数据的注入。在另一端能读到此数据
iptables
netfilter/iptables 基本概念
netfilter/iptables(简称为iptables)组成 Linux 平台下的包过滤防火墙
iptables 是一个 linux 用户空间(userspace)模块,位于/sbin/iptables,用户可以使用它来操作防火墙表中的规则
真正实现防火墙功能的是 netfilter,它是一个 linux 内核模块,做实际的包过滤
netfilter 使用表(table)和 链(chain)来组织网络包的处理规则(rule)
iptables
iptables 是一个 CLI 类型的 Linux 用户空间工具,它使得系统管理员能够配置netfile 表(tables)中的链和规则
NAT的实现
可以使用 iptables nat 表来实现网络地址转换(NAT)。NAT 包括 SNAT (源地址转换)和 DNAT (目的地址转换)。两者的区别在于做地址转换是在路由前还是路由后
SNAT:路由 - 转换 - 发出
数据经过时, 源地址发生改变,目的地址不变
- 封包先经过 PREROUTING,检查目的 IP 是不是本网段的地址。是的话,走路径A。
- 如果不是,则开始查询路由表,查找到相应路由条目后(查找路由的过程在 PREROUTING 和 FORWARD 之间),经过 FORWARD 链进行转发,再通过 postrouting 时进行NAT转换
DNAT:转换 - 路由- 发出
DNAT 的功能正好和 SNAT 相反,源地址不变,目的地址发生改变
DNAT 可以用作 PNAT,可以将一个 IP 的端口转换成另一个IP的另外一个端口号,经常用于内网服务器映射到公网,用来隐藏服务器的真实地址
- 在 DNAT 中,NAT 是在 PREROUTING 上做的。在数据进入主机后,路由选择过程是在 PREROUTING 和 FORWARD 之间的,所以应该先做地址转换之后,再进行路由选择,而后经过 FORWARD,最后从 POSTROUTING 出去
- 要做 DNAT,需要添加 PREROUTING 规则,使用 “-j DNAT --to-destination”
route(Linux路由表)
Linux 系统的 route 命令用于显示和操作 IP 路由表,它的主要作用是创建一个静态路由来指定一个主机或者一个网络通过一个网络接口,如eth0
路由器的辅助(Secondary) IP
路由器有个 Secondary IP 的概念,这个特性可以创建逻辑子网,也就是说在一个物理网口上连接两个子网,比如这个网口接到一台交换机上,如 果这个网口没有配置Secondary IP的话,那么这台交换机只能连接一个网段的主机,比如 192.168.1.1/24,但是,如果它配置了Secondary IP,那么就可以连接两个网段的主机,比如 192.168.1.1/24 和 10.0.0.1/24
Gratuitous ARP
Gratuitous ARP不同于一般的ARP请求,它并非期待得到IP对应的MAC地址,而是当主机启动的时候,将发送一个Gratuitous arp请求,即请求自己的IP地址的MAC地址
- Change of L2 address:通告自己改变了 MAC 地址
- Duplicate address detection:重复 MAC 地址检测
- Virtual IP:用于一组服务器做 failover 时通知周围的机器新生效的 IP 地址的 MAC
Neutron L3 Agent 的实现原理
每个 L3 Agent 运行在一个 network namespace 中,每个 namespace 由 qrouter-<router-UUID>命名,比如 qrouter-e506f8fe-3260-4880-bd06-32246225aeae
网络节点如果不支持 Linux namespace 的话,只能运行一个 Virtual Router
Neutron L3 Agent 负责路由(routing)、浮动 IP 分配(floatingip allocation), 地址转换(SNAT/DNAT)和 Security Group 管理
Router 作为浮动 IP 地址的ARP Proxy
虚机的浮动 IP 其实不是真实网卡的 IP 地址,而是一个虚拟地址
路由(Routing)
一个 Virtual Router 连接几个 subnet 就会有几个 virtual interface
每个 interface 的地址是该 subnet 的 gateway 地址
虚机的 IP 栈在发现数据包的目的虚机的 IP 地址不在自己网段的话,会将其发到 Router 上对应其 subnet 的 Virtual Interface
然后,Virtual Router 根据配置的路由规则和目的IP地址,将包转发到目的端口发出
源地址转换 SNAT
用于从内部网络发起的目的是外部网络的连接
目的地址转换 DNAT
要使外网内的机器能访问虚机,需要设置虚机的浮动IP