Neutron/VPNaaS/HowToInstall
目录
安装
为了在 devstack (http://devstack.org) 单节点设置中使用 Neutron-VPNaaS,您需要在 local.conf 中设置以下内容 (新:添加了 neutron-vpnaas 插件)。
[[local|localrc]] enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas disable_service n-net enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta # Optional, to enable tempest configuration as part of devstack enable_service tempest # IPSec driver to use. Optional, defaults to OpenSwan. IPSEC_PACKAGE="openswan"
快速测试脚本
http://paste.openstack.org/raw/44702/
此快速测试脚本创建两个站点,每个站点包含一个路由器、一个网络和一个连接到公共网络的子网。然后,通过 VPN 连接这两个站点。
使用两个 DevStack 节点进行测试
您可以使用通过公共“公共”网络连接的两个 DevStack 节点来测试 VPNaaS。第二个节点可以配置与第一个节点相同的公共网络,但它将使用不同的网关 IP(因此路由器 IP)。在此示例中,我们假设我们有两个 DevStack 节点(东部和西部),每个节点都在硬件上运行(如果您愿意,也可以使用多个 VM 客户机执行相同的操作)。(注意:您也可以使用一个 devstack 创建类似的拓扑,使用两个虚拟路由器)
示例拓扑
可以使用专用的物理端口用于“公共”网络连接(例如 eth2),并通过物理交换机互连。您需要在每个 DevStack 节点上将端口添加到 OVS 桥接(例如 sudo ovs-vsctl add-port br-ex eth2)。
(10.1.0.0/24 - DevStack East)
|
| 10.1.0.1
[Neutron Router]
| 172.24.4.226
|
| 172.24.4.225
[Internet GW]
|
|
[Internet GW]
| 172.24.4.232
|
| 172.24.4.233
[Neutron Router]
| 10.2.0.1
|
(10.2.0.0/24 DevStack West)
DevStack 配置
对于东部,您可以将这些行附加到 localrc,这将为您提供一个 10.1.0.0/24 的私有网络和一个 172.24.4.0/24 的公共网络
PUBLIC_SUBNET_NAME=yoursubnet PRIVATE_SUBNET_NAME=mysubnet FIXED_RANGE=10.1.0.0/24 NETWORK_GATEWAY=10.1.0.1 PUBLIC_NETWORK_GATEWAY=172.24.4.225 Q_FLOATING_ALLOCATION_POOL=start=172.24.4.226,end=172.24.4.231
对于西部,您可以将这些行添加到 localrc 以使用不同的本地网络、公共网关(以及隐式路由器)IP
PUBLIC_SUBNET_NAME=yoursubnet PRIVATE_SUBNET_NAME=mysubnet FIXED_RANGE=10.2.0.0/24 NETWORK_GATEWAY=10.2.0.1 PUBLIC_NETWORK_GATEWAY=172.24.4.232 Q_FLOATING_ALLOCATION_POOL=start=172.24.4.233,end=172.24.4.238
VPNaaS 配置
在东部和西部运行 DevStack 并且确认了连接(确保您可以从一个路由器/网关 ping 另一个路由器/网关),您可以执行这些 VPNaaS CLI 命令。
在东部
neutron vpn-ikepolicy-create ikepolicy1 neutron vpn-ipsecpolicy-create ipsecpolicy1 neutron vpn-service-create --name myvpn --description "My vpn service" router1 mysubnet
neutron ipsec-site-connection-create --name vpnconnection1 --vpnservice-id myvpn --ikepolicy-id ikepolicy1 --ipsecpolicy-id ipsecpolicy1 --peer-address 172.24.4.233 --peer-id 172.24.4.233 --peer-cidr 10.2.0.0/24 --psk secret
在西部
neutron vpn-ikepolicy-create ikepolicy1 neutron vpn-ipsecpolicy-create ipsecpolicy1 neutron vpn-service-create --name myvpn --description "My vpn service" router1 mysubnet
neutron ipsec-site-connection-create --name vpnconnection1 --vpnservice-id myvpn --ikepolicy-id ikepolicy1 --ipsecpolicy-id ipsecpolicy1 --peer-address 172.24.4.226 --peer-id 172.24.4.226 --peer-cidr 10.1.0.0/24 --psk secret
注意:请确保设置安全组(为 vpn 子网打开 icmp 等)
验证
您可以在每个节点上启动 VM,然后从 VM ping 远端路由器的公共 IP。在其中一个节点上运行 tcpdump 时,您会看到 ping 显示为加密数据包 (ESP)。请注意,BOOTP、IGMP 以及两个节点之间的保活数据包未加密(两个外部 IP 地址之间的 ping 也未加密)。
Kilo 更新
对于 Kilo,localrc 内容已移动到 local.conf。使用 (VirtualBox) VM 作为主机,其中 eth0 设置为 NAT,eth1 设置为内部网络,local.conf 中使用了以下配置
OVS_PHYSICAL_BRIDGE=br-ex PUBLIC_INTERFACE=eth1
堆叠完成后,创建 VM 进行测试,使用 VPN IPSec 命令在节点之间建立连接,并添加安全组规则以允许 ICMP 和 SSH。
使用单个 DevStack 和两个路由器配置 VPNaaS
关于如何设置测试环境的简单说明,在该环境中可以使用参考实现(OpenSwan)建立 VPNaaS IPSec 连接。此示例使用在笔记本电脑上运行的 VIrtualBox 来提供运行 DevStack 的 VM。它假定 Kilo 版本(Juno 之后)。
这里的想法是使用 DevStack 创建单个 OpenStack 云,两个路由器(一个自动创建),两个私有网络(一个自动创建)-10.1.0.0/24 和 10.2.0.0/24,每个私有网络中的一个 VM,并使用公共网络(172.24.4.0/24)在两个私有网络之间建立 VPN 连接。
准备工作
创建一个 VM(例如 7 GB RAM、2 个 CPU),运行 Ubuntu 14.04,具有 NAT I/F 以访问 Internet。克隆最新的 DevStack 仓库(本示例使用 Kilo-1)。
DevStack 配置
对于此示例,使用了以下 local.conf
localrc GIT_BASE=https://github.com DEST=/opt/stack disable_service n-net enable_service q-svc enable_service q-agt enable_service q-dhcp enable_service q-l3 enable_service q-meta enable_service neutron enable_plugin neutron-vpnaas https://git.openstack.org/openstack/neutron-vpnaas FIXED_RANGE=10.1.0.0/24 FIXED_NETWORK_SIZE=256 NETWORK_GATEWAY=10.1.0.1 PRIVATE_SUBNET_NAME=privateA PUBLIC_SUBNET_NAME=public-subnet FLOATING_RANGE=172.24.4.0/24 PUBLIC_NETWORK_GATEWAY=172.24.4.10 Q_FLOATING_ALLOCATION_POOL="start=172.24.4.11,end=172.24.4.29" LIBVIRT_TYPE=qemu IMAGE_URLS="http://cloud-images.ubuntu.com/releases/14.04.1/release/ubuntu-14.04-server-cloudimg-amd64.tar.gz,http://download.cirros-cloud.net/0.3.3/cirros-0.3.3-x86_64-uec.tar.gz" SCREEN_LOGDIR=/opt/stack/screen-logs SYSLOG=True LOGFILE=~/devstack/stack.sh.log ADMIN_PASSWORD=password MYSQL_PASSWORD=password RABBIT_PASSWORD=password SERVICE_PASSWORD=password SERVICE_TOKEN=tokentoken Q_USE_DEBUG_COMMAND=True # RECLONE=No RECLONE=yes OFFLINE=False
使用 ./stack.sh 启动云并确保其成功完成。堆叠完成后,您可以将 RECLONE 更改为 No。
云配置
堆叠完成后,您将拥有一个私有网络(10.1.0.0/24)和一个路由器(router1)。为了准备建立 VPN 连接,需要创建一个第二个网络、子网和路由器,并在每个私有网络中启动一个 VM。
# Create second net, subnet, router source ~/devstack/openrc admin demo neutron net-create privateB neutron subnet-create --name subB privateB 10.2.0.0/24 --gateway 10.2.0.1 neutron router-create router2 neutron router-interface-add router2 subB neutron router-gateway-set router2 public # Start up a VM in the privateA subnet. PRIVATE_NET=`neutron net-list | grep 'private ' | cut -f 2 -d' '` nova boot --flavor 1 --image cirros-0.3.3-x86_64-uec --nic net-id=$PRIVATE_NET peter # Start up a VM in the privateB subnet PRIVATE_NETB=`neutron net-list | grep privateB | cut -f 2 -d' '` nova boot --flavor 1 --image cirros-0.3.3-x86_64-uec --nic net-id=$PRIVATE_NETB paul
此时,您可以验证是否具有基本连接。请注意,DevStack 将创建一个静态路由,允许您从 privateB 网络 ping 路由器 1 的私有 I/F IP。如果需要,您可以删除该路由。
IPSec 站点到站点连接创建
以下命令将创建 IPSec 连接
# Create VPN connections neutron vpn-ikepolicy-create ikepolicy neutron vpn-ipsecpolicy-create ipsecpolicy neutron vpn-service-create --name myvpn --description "My vpn service" router1 privateA neutron ipsec-site-connection-create --name vpnconnection1 --vpnservice-id myvpn \ --ikepolicy-id ikepolicy --ipsecpolicy-id ipsecpolicy --peer-address 172.24.4.13 \ --peer-id 172.24.4.13 --peer-cidr 10.2.0.0/24 --psk secret neutron vpn-service-create --name myvpnB --description "My vpn serviceB" router2 subB neutron ipsec-site-connection-create --name vpnconnection2 --vpnservice-id myvpnB \ --ikepolicy-id ikepolicy --ipsecpolicy-id ipsecpolicy --peer-address 172.24.4.11 \ --peer-id 172.24.4.11 --peer-cidr 10.1.0.0/24 --psk secret
此时(一旦连接变为活动状态 - 这可能需要最多 30 秒),您应该能够从 privateA 网络中的 VM ping 到 privateB 网络中的 VM。如果您使用其中一个路由器的命名空间中的 qg-# 接口进行 tcpdump,您将看到加密数据包。如果您删除其中一个连接,您会看到 ping 失败(如果一切正常:)。
多个本地子网
在 Mitaka 的早期,IPSec 站点到站点连接将支持多个本地子网,除了当前支持的多个对等 CIDR。多个本地子网功能是通过不在创建 VPN 服务时指定本地子网来触发的。通过在 VPN 服务创建中提供子网,可以保持与单个本地子网的向后兼容性。
为了支持多个本地子网,提供了一个新的功能(在 Liberty 中),称为“Endpoint Groups”。每个 Endpoint Group 将定义一种特定类型的一个或多个端点,可用于指定 IPSec 连接的本地和对等端点。Endpoint Groups 将“连接什么”与 VPN 服务的“如何连接”分开,并且可以在未来用于不同类型的 VPN。一个例子
# Create VPN connections neutron vpn-ikepolicy-create ikepolicy neutron vpn-ipsecpolicy-create ipsecpolicy neutron vpn-service-create --name myvpnC --description "My vpn service" router1
为了准备 IPSec 站点到站点,您将为本地子网创建一个 Endpoint Group,并为对等 CIDR 创建一个 Endpoint Group,如下所示
neutron vpn-endpoint-group-create --name my-locals --type subnet --value privateA --value privateA2 neutron vpn-endpoint-group-create --name my-peers --type cidr --value 10.2.0.0/24 --value 20.2.0.0/24
其中 privateA 和 privateA2 是两个本地(私有)子网,10.2.0.0/24 和 20.2.0.0/24 是两个表示将由连接使用的对等(私有)子网的 CIDR。然后,在创建 IPSec 站点到站点连接时,将指定这些 Endpoint Group ID,而不是 peer-cidrs 属性
neutron ipsec-site-connection-create --name vpnconnection3 --vpnservice-id myvpnC \ --ikepolicy-id ikepolicy --ipsecpolicy-id ipsecpolicy --peer-address 172.24.4.11 \ --peer-id 172.24.4.11 --local-ep-group my-locals --peer-ep-group my-peers --psk secret
笔记
- 验证逻辑确保 Endpoint Group 和对等 CIDR 不会混合使用。
- Endpoint Group 类型为 subnet、cidr、network、router 和 vlan。但是,仅实现了 subnet 和 cidr(用于 IPSec 使用)。
- 组中的端点必须是相同类型,尽管可以混合 IP 版本。
- 对于 IPSec 连接,验证当前强制本地端点为子网,对等端点为 CIDR。
- IPSec 连接验证要求本地端点为子网,对等端点为 CIDR。
- 迁移将转换任何现有 VPN 服务和连接的信息到 Endpoint Group。
- 原始 API 将保持向后兼容性。
Horizon 支持
- 检出 Test 分支
Horizon 支持已合并。
- 启用 Horizon 中的 VPN 部分
请注意,如果启用了 q-vpn,则会自动启用 Horizon VPN 支持。
开放/opt/stack/horizon/openstack_dashboard/local/local_settings.py
并替换
OPENSTACK_NEUTRON_NETWORK = {
'enable_vpn': False,
}
为
OPENSTACK_NEUTRON_NETWORK = {
'enable_vpn': True,
}
- 重启 Apache 以开始使用
- 测试用户场景