Port资源模型,如下表所示:
![](https://i-blog.csdnimg.cn/blog_migrate/5919191c215cc60be3a9fdf0b8780051.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6371cf3fec9fab9fa88ac81bba7d0836.png)
Port是一个逻辑模型,但是同时我们也可以理解为其代表一个虚拟网口。所以,一个虚拟机需要绑定Port,一个路由器也需要绑定Port。既然是一个虚拟网口,那么理所当然,它就具备两个基本属性:IP地址和MAC地址。
一 IP地址
Port模型中,表示IP地址的是一个数组(fixed_ip),表明这个Port可以有多个IP地址。在这个数组中,每一个元组由两个字段组成:ip_address、subnet_id。我们可以看一个例子:
“fixed_ips”:[
{
“ip_address”:”10.0.0.1”
“subnet_id”:”fhdjs-fdjs-fdsdf-fds--fd”
}
{
“ip_address”:”10.0.0.1”
“subnet_id”:”shdjs-fdjs-fdsdf-fds--fd”
}
],
为什么Port的IP地址还需要跟subnet_id关联呢?这是因为,在Neutron模型中,IP地址不能孤立存在,它必须属于一个Subnet,这也间接地意味着,Port也必须关联一个Subnet。这同时也意味着,Port的IP地址不能随便取值,它必须在其关联的Subnet的地址范围内。
Port不仅需要间接关联一个Subnet,还必须直接属于一个Network,这是靠Port模型中的字段network_id(string类型)来表达。当一个Port属于一个Network的时候,如果这个Network有N个Subnet,理论上说,这个Port也可以有N个IP地址,每个IP地址属于其中一个Subnet。
Network、Subnet、Port这三者之间的关系,如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/54d04961211c3c2bff96dc2ca7eaecc8.png)
在图中,Port与Subnet之间的关系是m:n,但是为了表达清楚,特意画了两根线。这个图表明,一个Network可以有多个Subnet,一个Subnet只能归属一个Network。同时一个Network可以有多个Port,而一个Port可以与其所在Network中的所有Subnet相关联。当然,一个Subnet也可以有多个Port。
二 MAC
一个Port可以有多个IP地址,但是一般情况下,一个Port只有一个MAC地址,这体现在mac_address这个字段,它的含义是:port的MAC地址。
三 allowed_address_pairs
这个字段是一个数组,先举个例子:
{
“port”:{
“allowed_address_pairs”:[
{
“ip_address”:”10.0.0.1”
“max_address”:”re-34-65-34-65-34”
}
{
“ip_address”:”10.1.0.1”
“max_address”:”re-34-65-34-65-34”
}
]
}
}
allowed_address_pairs的使用场景有不少,其中一个比较典型的场景是Antispoofing。该技术是一种识别和删除有错误源地址的数据包技术。
四 其他
Port是如此重要,但是也不能凭空存在,它必须得绑定到一个实体上才有意义。Port有两个字段与实体绑定相关。其中一个是device_id,标识谁使用了这个Port,比如一个路由器。另外一个字段是device_owner,它标识使用这个Port的实体类型。比如一个虚拟机绑定了这个端口,那么这个实体类型就是compute:nova。