Neutron网络、子网和路由器

现在,我们已经准备好开始创建网络。以下系列命令将创建网络、子网、路由器、安全组规则、实例和浮动IP。完成后,将有四种不同类型的网络可供使用。


外部网络

以下步骤创建外部网络。请注意,两个网络都使用“router:external = true”,它们都是“network_type = flat”,但是每个网络都在不同的physical_network上,第二个网络具有“–shared”属性:

 

. ~/keystonerc_admin
neutron net-create external1  --router:external=True  --provider:network_type=flat  --provider:physical_network=physnet1
 
neutron subnet-create --name external1-subnet --disable-dhcp external1 172.16.0.0/26 --allocation-pool start=172.16.0.2,end=172.16.0.62
 
neutron net-create external2-shared --shared --router:external=True --provider:network_type=flat --provider:physical_network=physnet2   
 
neutron subnet-create external2-shared --name external2-shared-subnet --allocation-pool\
 start=172.16.0.66,end=172.16.0.126  --gateway 172.16.0.65 172.16.0.64/26

租户网络和路由器

租户网络是你可以创建自己的私有rfc 1918地址空间的地方。租户可以配置网络、子网和路由器的任何组合来满足他们的需求。他们可以定义自己的广播域,并通过浮动IP地址确定外部可访问的实例。

以下步骤创建一个私有或“租户”网络和子网。它还创建一个路由器将其附加到外部网络external1。注意,我们正在切换到这些网络的“演示”项目:

 

. ~/keystonerc_demo
neutron net-create private1-demo
 
neutron subnet-create private1-demo 10.0.1.0/24 --name private1-demo-subnet

 

请注意,此网络带有以下默认项:

 

neutron net-show -c 'router:external' -c shared private1-demo
+-----------------+-------+
| Field           | Value |
+-----------------+-------+
| router:external | False |
| shared          | False |
+-----------------+-------+
 
neutron router-create router1-demo
 
neutron router-gateway-set router1-demo external1
 
neutron router-interface-add router1-demo private1-demo-subnet

 

路由器网关应该可ping通,执行此命令并ping其返回的网关IP:

 

neutron router-list -c external_gateway_info | grep -o "172.16.0.[0-9]*"

安全组规则、虚拟实例和浮动IP

在创建虚拟实例之前,要在默认安全组中打开ICMP和SSH的端口,以便可以连接到它们:

 

. ~/keystonerc_demo
neutron security-group-rule-create --direction ingress \
   --ethertype IPv4 --protocol tcp --port-range-min 22 \
   --port-range-max 22 default
 
neutron security-group-rule-create --direction ingress \
   --ethertype IPv4 --protocol icmp default
 
nova boot --flavor m1.tiny --image cirros --nic\
 net-id=$(neutron net-show private1-demo -c id -f value) demo01-private1
 
nova floating-ip-create external1
 
nova floating-ip-associate demo01-private1 $(neutron floatingip-list -c floating_ip_address -f value)
 
nova list  #the floating IP should be pingable and you should be able to ssh to this instance through it.

 

你刚刚做了什么? 你在私有租户网络上创建了外部网络和具有以下特点实例:

出站访问——此实例可以通过其路由器(router1-demo)访问external1网络。 其源地址将被SNAT(源网络地址转换)为其浮动IP地址的源地址。这一转换发生在路由器namespace中。 但是,如果该实例没有浮动IP,那么它仍然具有external1网络访问权限。在这种情况下,路由器将源地址SNAT为它自己的公网IP地址的源地址。

入站访问——该实例通过浮动IP地址被外界所了解,路由器1演示将响应ARP请求。 该IP被DNAT(目的网络地址转换)为路由器namespace中的本地IP地址的目的地址。

注意:要看到这些NATing规则,从路由器namespace中转储它们:

 

. ~/keystonerc_demo
ip netns exec qrouter-$(neutron router-show router1-demo -c id -f value) iptables -S -t nat

 

租户网络访问:此实例与private1演示网络上的任何其他实例位于相同的广播域中。 因为vxlan overlay网络抽象底层的物理网络,所以这个广播域扩展到托管这些实例的计算节点。

 

从Horizon控制台查看网络拓扑

 

. ~/keystonerc_admin
echo $OS_AUTH_URL
echo $OS_USERNAME
echo $OS_PASSWORD

 

将浏览器指向上面的URL。 用OS_USERNAME和OS_PASSWORD从〜/ keystonerc_admin登录。 从“Project”选项卡中选择“demo”项目(你需要添加管理员作为演示项目的成员)。然后选择“Network/Network Topology扑”,你将看到创建的网络;一定要尝试这两个视图——拓扑和图形。在尝试了解正在做的事情时,请保留这两个视图。

 

共享租户网络

可以使用“–shared”属性创建租户网络,允许其他租户将自己的实例附加到该网络。默认情况下,只有管理员可以创建一个共享的租户网络,但其他租户也可以使用RBAC来实现( 请参阅基于角色的网络访问控制Network/Network Topology)。当两个或多个项目具有受益于相同广播域的实例时,这种类型的网络可能是有用的,并因此绕过了共享浮动IP地址的需求。

 

. ~/keystonerc_admin
nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 #allow icmp through default security group
 
nova secgroup-add-rule default tcp 22 22 0.0.0.0/0 #allow ssh through default security group
 
neutron net-create --shared --router:external=false admin1-shared
 
neutron subnet-create admin1-shared 10.0.9.0/24 --name admin1-shared-subnet

 

现在,在管理员项目中,在共享租户网络上创建一个实例:

 

nova boot --flavor m1.tiny --image cirros --nic\
 net-id=$(neutron net-show admin1-shared -c id -f value) admin01-admin1-shared

 

现在,在演示项目中,在共享租户网络上创建一个实例:

 

. ~/keystonerc_demo
nova boot --flavor m1.tiny --image cirros --nic\
 net-id=$(neutron net-show admin1-shared -c id -f value) demo02-admin1-shared

 

你刚刚做了什么? 如果你使用Horizon中的instance / console选项登录到这些实例之一,你会注意到它们位于同一子网上,即使它们在不同的项目中。这种类型的网络可以用于在项目之间共享实例;要这样做的唯一的另一个办法是使用浮动IP。默认情况下,任何租户都可以看到并加入共享网络(admin1共享)。 请注意,除非添加路由器并将网关设置为external1,没有来自此网络的外部网络访问。

 

共享外部网络

在共享的外部网络中,租户可以将其实例直接连接到外部网络,并获取自动分配的浮动IP地址。我们将使用上面已经创建的external2共享网络。

 

. ~/keystonerc_demo
nova boot --flavor m1.tiny --image cirros --nic net-name=external2-shared demo03-external2-shared
 
nova console-log demo03-external2-shared

 

你可能会从控制台日志输出中注意到实例无法连通元数据服务:

 

checking http://169.254.169.254/2009-04-04/instance-id
failed 1/20: up 3.03. request failed
failed 2/20: up 8.09. request failed
failed 3/20: up 11.09. request failed
etc…

 

你可能可以ping实例,但是如果希望在external2共享的实例能够访问元数据服务,那么在/etc/neutron/dhcp_agent.ini中设置:

 

crudini --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True
 
systemctl restart neutron-dhcp-agent

 

这是必要的,因为你没有通过路由器(这通常是元数据服务访问来的地方)连接到此网络。现在重启该实例并再次检查控制台日志:

 

nova reboot demo03-external2-shared
 
nova console-log dem03-external2-shared

 

现在你应该在日志中看到这个:

 

checking http://169.254.169.254/2009-04-04/instance-id
successful after 1/20 tries: up 2.04. iid=i-000000ef

 

你刚才做了什么?通过在此共享外部网络上创建一个实例,你可以绕过使用路由器进行外部访问的需要。此外,默认情况下,你将获得浮动IP的等效物最后,广播域是外部子网。所以,这个子网上的任何一个实例(不用管哪个租户)都在同一个广播域,这与我们以前看过的共享租户网络的特征是一样的。如果租户通过仅在其私有网络上的浮动IP来访问实例,那么他们使用共享的外部网络可能会更好

 

使用正确的网络属性进行正确的工作

通过了解这四种类型的网络的特点,你将在利用Neutron的灵活性方面取得良好的开端。例如,浮动IP可以成为稀缺的IPv4资源。作为解决方法,你可以依靠NAT,或使用共享私有网络来免除痛苦。通过了解用例,你可以为自己和/或客户选择正确的网络类型。

 

 

编译:Jonathan Zhang

作者Chris Fields

来源:https://opensource.com/article/17/4/openstack-neutron-networks

投稿邮箱:openstackcn@sina.cn