跳转到: 导航, 搜索

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 以开始使用
  • 测试用户场景

https://wiki.openstack.org/wiki/Neutron/VPNaaS/UI