From a8a3bf6008957c343b1562b478d1f75e072c91bc Mon Sep 17 00:00:00 2001 From: Bin Hu Date: Mon, 28 Dec 2015 14:08:44 -0800 Subject: [PATCH] JIRA:IPVSIX-29 Change-Id: Ie9d1b6d1f4dc71af75b4e0d7859133f7e38846ed Signed-off-by: Bin Hu --- images/ipv6-poc-1.png | Bin 85313 -> 0 bytes requirements/Requirement-Analysis-Kilo.txt | 141 -------------------- requirements/Requirement-Analysis.txt | 143 --------------------- vrouter/Service_VM_as_vRouter.rst | 44 ------- vrouter/Service_VM_as_vRouter.txt | 44 ------- vrouter/setup_ipv6_vrouter.rst | 122 ------------------ vrouter/setup_ipv6_vrouter.txt | 122 ------------------ vrouter/setup_service_vm.rst | 198 ----------------------------- vrouter/setup_service_vm.txt | 198 ----------------------------- 9 files changed, 1012 deletions(-) delete mode 100644 images/ipv6-poc-1.png delete mode 100644 requirements/Requirement-Analysis-Kilo.txt delete mode 100644 requirements/Requirement-Analysis.txt delete mode 100644 vrouter/Service_VM_as_vRouter.rst delete mode 100644 vrouter/Service_VM_as_vRouter.txt delete mode 100644 vrouter/setup_ipv6_vrouter.rst delete mode 100644 vrouter/setup_ipv6_vrouter.txt delete mode 100644 vrouter/setup_service_vm.rst delete mode 100644 vrouter/setup_service_vm.txt diff --git a/images/ipv6-poc-1.png b/images/ipv6-poc-1.png deleted file mode 100644 index f4fdcf447cd68add03140321f0dfe7e028e787f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85313 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 diff --git a/requirements/Requirement-Analysis-Kilo.txt b/requirements/Requirement-Analysis-Kilo.txt deleted file mode 100644 index d6e5f45..0000000 --- a/requirements/Requirement-Analysis-Kilo.txt +++ /dev/null @@ -1,141 +0,0 @@ -===== Top Down Use Case and Gap Analysis ===== - -Here are some top down use cases of VIM-agnostic IPv6 functionality, including -infrastructure layer and VNF (VM) layer, and its gap analysis with Neutron -in Juno release: - -(1) Use Case / Requirement 1: All topologies work in a multi-tenant environment -Supported in Neutron, Kilo Release: Yes -Notes: The IPv6 design is following the Neutron tenant networks model; dnsmasq -is being used inside DHCP network namespaces, while radvd is being used inside -Neutron routers namespaces to provide full isolation between tenants. -Tenant isolation can be based on VLANs, GRE, or VXLAN encapsulation. In case of -overlays, the transport network (and VTEPs) must be IPv4 based as of today. - -(2) Use Case / Requirement 2: IPv6 VM to VM only -Supported in Neutron, Kilo Release: Yes -Notes: It is possible to assign IPv6-only addresses to VMs. Both switching -(within VMs on the same tenant network) as well as east/west routing (between -different networks of the same tenant) are supported. - -(3) Use Case / Requirement 3: IPv6 external L2 VLAN directly attached to a VM -Supported in Neutron, Kilo Release: Yes -Notes: IPv6 provider network model; RA messages from upstream (external) router -are forwarded into the VMs. - -(4) Use Case / Requirement 4: IPv6 subnet routed via L3 agent to an external -IPv6 network -(a) Both VLAN and overlay (e.g. GRE, VXLAN) subnet attached to VMs; -(b) Must be able to support multiple L3 agents for a given external network to -support scaling (neutron scheduler to assign vRouters to the L3 agents) -Supported in Neutron, Kilo Release: (a) Yes (b) Yes -Notes: Configuration is enhanced in Kilo to allow easier setup of the upstream -gateway, without the user forced to create an IPv6 subnet for the external network. - -(5) Use Case / Requirement 5: Ability for a NIC to support both IPv4 and IPv6 -(dual stack) address; -(a) VM with a single interface associated with a network, which is then -associated with two subnets. -(b) VM with two different interfaces associated with two different networks -and two different subnets. -Supported in Neutron, Kilo Release: (a) Yes (b) Yes -Notes: Dual-stack is supported in Neutron with the addition of "Multiple IPv6 -Prefixes" Blueprint -(https://blueprints.launchpad.net/neutron/+spec/multiple-ipv6-prefixes) - -(6) Use Case / Requirement 6: Support IPv6 Address assignment modes. -(a) SLAAC -(b) DHCPv6 Stateless -(c) DHCPv6 Stateful -Supported in Neutron, Kilo Release: (a) Yes (b) Yes (c) Yes - -(7) Use Case / Requirement 7: Ability to create a port on an IPv6 DHCPv6 -Stateful subnet and assign a specific IPv6 address to the port and have it -taken out of the DHCP address pool. -Supported in Neutron, Kilo Release: Yes - -(8) Use Case / Requirement 8: Ability to create a port with fixed_ip for a -SLAAC/DHCPv6-Stateless Subnet. -Supported in Neutron, Kilo Release: No -Notes: The following patch disables this operation: -https://review.openstack.org/#/c/129144/ - -(9) Use Case / Requirement 9: Support for private IPv6 to external IPv6 -floating IP; Ability to specify floating IPs via Neutron API (REST and CLI) -as well as via Horizon, including combination of IPv6/IPv4 and IPv4/IPv6 -floating IPs if implemented. -Supported in Neutron, Kilo Release: Rejected -Notes: Blueprint proposed in upstream and got rejected. General expectation is -to avoid NAT with IPv6 by assigning GUA to tenant VMs. See -https://review.openstack.org/#/c/139731/ for discussion - -(10) Use Case / Requirement 10: Provide IPv6/IPv4 feature parity in support for -pass-through capabilities (e.g., SR-IOV). -Supported in Neutron, Kilo Release: Roadmap -Notes: The L3 configuration should be transparent for the SR-IOV implementation. -SR-IOV networking support introduced in Juno based on the sriovnicswitch ML2 -driver is expected to work with IPv4 and IPv6 enabled VMs. - -(11) Use Case / Requirement 11: Additional IPv6 extensions, for example: IPSEC, -IPv6 Anycast, Multicast -Supported in Neutron, Kilo Release: No -Notes: It doesn't appear to be considered yet (lack of clear requirements) - -(12) Use Case / Requirement 12: VM access to the meta-data server to obtain -user data, SSH keys, etc. using cloud-init with IPv6 only interfaces. -Supported in Neutron, Kilo Release: No -Notes: This is currently not supported. Config-drive or dual-stack IPv4/IPv6 -can be used as a workaround (so that the IPv4 network is used to obtain -connectivity with the metadata service). See email discussion thread -(http://openstack.10931.n7.nabble.com/Neutron-cloud-init-IPv6-support-td45386.html) - -(13) Use Case / Requirement 13: Full support for IPv6 matching (i.e. IPv6, -ICMPv6, TCP, UDP) in security groups. Ability to control and manage all IPv6 -security group capabilities via Neutron/Nova API (REST and CLI) as well as via -Horizon. -Supported in Neutron, Kilo Release: Yes - -(14) Use Case / Requirement 14: During network/subnet/router create, there -should be an option to allow user to specify the type of address management -they would like. This includes all options including those low priority if -implemented (e.g., toggle on/off router and address prefix advertisements); -It must be supported via Neutron API (REST and CLI) as well as via Horizon. -Supported in Neutron, Kilo Release: Yes -Notes: Two new Subnet attributes were introduced to control IPv6 address -assignment options: -(a) "ipv6-ra-mode" - to determine who sends Router Advertisements, and -(b) "ipv6-address-mode" - to determine how VM obtains IPv6 address, default -gateway, and/or optional information. - -(15) Use Case / Requirement 15: Security groups anti-spoofing: Prevent VM from -using a source IPv6/MAC address which is not assigned to the VM. -Supported in Neutron, Kilo Release: Yes - -(16) Use Case / Requirement 16: Protect tenant and provider network from rough RAs -Supported in Neutron, Kilo Release: Yes -Notes: When using a tenant network, Neutron is going to automatically handle the -filter rules to allow connectivity of RAs to the VMs only from the Neutron -router port; with provider networks, users are required to specify the LLA of -the upstream router during the subnet creation, or otherwise manually edit the -security-groups rules to allow incoming traffic from this specific address. - -(17) Use Case / Requirement 17: Support the ability to assign multiple IPv6 -addresses to an interface; both for Neutron router interfaces and VM interfaces. -Supported in Neutron, Kilo Release: Yes - -(18) Use Case / Requirement 18: Ability for a VM to support a mix of multiple -IPv4 and IPv6 networks, including multiples of the same type. -Supported in Neutron, Kilo Release: Yes - -(19) Use Case / Requirement 19: Support for IPv6 Prefix Delegation. -Supported in Neutron, Kilo Release: Roadmap -Notes: Planned for Liberty - -(20) Use Case / Requirement 20: Distributed Virtual Routing (DVR) support for IPv6 -Supported in Neutron, Kilo Release: No -Notes: Blueprint proposed upstream, pending discussion. - -(21) Use Case / Requirement 21: IPv6 First-Hop Security, IPv6 ND spoofing. -Supported in Neutron, Kilo Release: Roadmap -Notes: Blueprint proposed upstream. Some patches are under review. - diff --git a/requirements/Requirement-Analysis.txt b/requirements/Requirement-Analysis.txt deleted file mode 100644 index 8350eb8..0000000 --- a/requirements/Requirement-Analysis.txt +++ /dev/null @@ -1,143 +0,0 @@ -===== Top Down Use Case and Gap Analysis ===== - -Here are some top down use cases of VIM-agnostic IPv6 functionality, including -infrastructure layer and VNF (VM) layer, and its gap analysis with Neutron -in Juno release: - -(1) Use Case / Requirement 1: All topologies work in a multi-tenant environment -Supported in Neutron, Juno Release: Yes -Notes: The tenant's subnets are based on Neutron, with ML2 plugin and Single -Flat Network topology, dual-stacked. See "DHCPv6" BP -(https://review.openstack.org/#/c/102411) and "IPv6 SLAAC" BP -(http://specs.openstack.org/openstack/neutron-specs/specs/juno/ipv6-radvd-ra.html) - -(2) Use Case / Requirement 2: IPv6 VM to VM only -Supported in Neutron, Juno Release: Yes -Notes: Configuration and IPv6 address assignment - -(3) Use Case / Requirement 3: IPv6 external L2 VLAN directly attached to a VM -Supported in Neutron, Juno Release: Yes -Notes: Via Neutron and external router / border gateway. See "UPStream Provider -Network" BP -(http://specs.openstack.org/openstack/neutron-specs/specs/juno/ipv6-provider-nets-slaac.html) -To-Do: Verify - -(4) Use Case / Requirement 4: IPv6 subnet routed via L3 agent to an external -IPv6 network -(a) Both VLAN and overlay (e.g. GRE, VXLAN) subnet attached to VMs; -(b) Must be able to support multiple L3 agents for a given external network to -support scaling (neutron scheduler to assign vRouters to the L3 agents) -Supported in Neutron, Juno Release: (a) Roadmap (b) Yes -Notes: The IPv6 support in Neutron L3 router isn't ready yet. Watch Kilo BPs -"IPv6 Router BP" (https://review.openstack.org/#/c/142224/) and -"Multiple Ipv6 Prefixes BP" (https://review.openstack.org/#/c/98217). -(b) is supported for scalability. Patches for HA are under review. - -(5) Use Case / Requirement 5: Ability for a VM to support a mix of multiple -IPv4 and IPv6 networks, i.e. across the mix of all the above topologies -including multiples of the same type. -Supported in Neutron, Juno Release: Yes for dual-stack and Roadmap for multiple -IPv4 and IPv6 subnets -Notes: Dual-stack is supported via Single Flat Network topology. Refer to Kilo -Blueprint "Multiple IPv6 Prefixes" -(https://blueprints.launchpad.net/neutron/+spec/multiple-ipv6-prefixes) -for support of multiple IPv4 and IPv6 networks -To-Do: Verify - -(6) Use Case / Requirement 6: Support DHCPv6 stateful -(a) Including the ability for a user to create a port on an IPv6 subnet and -assign a specific IPv6 address to the port and have it taken out of the DHCP -address pool; -(b) Support the ability to assign multiple IPv6 address to an interface -Supported in Neutron, Juno Release: (a) Yes and (b) Work-in-Progress -Notes: Work-in-progress and expected in Juno release. All the IPv6 -configuration modes such as SLAAC, DHCPv6 Stateless and DHCPv6 Stateful are -expected in Juno release. For (a), see -Patch 1 (https://bugs.launchpad.net/neutron/+bug/1367500) and -Patch 2 (https://bugs.launchpad.net/neutron/juno/+bug/1377843). -This is verified by Sridhar. For (b), see BP in Kilo -(https://review.openstack.org/#/c/98217/14). - -(7) Use Case / Requirement 7: Should not prevent the ability to support -non-DHCP statically assigned IPv6 addresses in the same fashion as is supported -for IPv4 -Supported in Neutron, Juno Release: No -Notes: The following patch disables this operation: (https://review.openstack.org/#/c/129144/) - -(8) Use Case / Requirement 8: Support for private IPv6 to external IPv6 -Floating IP -Supported in Neutron, Juno Release: Rejected (No) -Notes: See https://review.openstack.org/#/c/139731/ for discussion - -(9) Use Case / Requirement 9: Provide IPv6/IPv4 feature parity in support for -pass-through capabilities (e.g. SR-IOV support in OpenStack) as these features -are provided in OpenStack -Supported in Neutron, Juno Release: Roadmap -Notes: -(a) Blueprint "Managing InfiniBand SR-IOV" -(https://blueprints.launchpad.net/neutron/+spec/manage-sriov-ib-net-config) is -pending approval, -(b) Blueprint "Traffic Rate Support for SR-IOV NIC" -(https://blueprints.launchpad.net/neutron/+spec/ml2-sriov-rate-limit-extension) -is being drafted, -(c) Blueprint "HA SR-IOV Ports" -(https://blueprints.launchpad.net/neutron/+spec/high-availability-sriov-ports) -has not started yet. - -(10) Use Case / Requirement 10: Additional IPv6 extensions, for example: IPSEC, -IPv6 Anycast, Multicast -Supported in Neutron, Juno Release: No -Notes: It doesn't appear to be considered yet - -(11) Use Case / Requirement 11: Access to the meta-data server to obtain user -data and ssh keys etc -Supported in Neutron, Juno Release: No -Notes: Metadata (and GRE / VXLAN subnet) still requires IPv4. An alternate -mechanism is to use config-drive. See email thread -(http://openstack.10931.n7.nabble.com/Neutron-cloud-init-IPv6-support-td45386.html) - -(12) Use Case / Requirement 12: Full support for IPv6 tcp/udp/icmp IPv6 -security groups (same as we see for IPv4) -Supported in Neutron, Juno Release: Yes -Notes: -(a) Blueprint "Support ICMP type filter by security group" -(https://blueprints.launchpad.net/neutron/+spec/security-group-icmp-type-filter) -has not started yet. -(b) Blueprint "Security group rule for IPv6 RA guard and IPv6 Snooping" -(https://blueprints.launchpad.net/neutron/+spec/security-group-ipv6-ra-guard) -has not started. Whiteboard responses to BP (a) indicates that it is already -supported. -To-Do: for BP(b), the author was looking at the "IPv6 First-Hop Security" -feature - -(13) Use Case / Requirement 13: During network/subnet/router create, there -should be an option to allow user to specify the type of address management -they would like. (a) this includes all options including those low priority if -implemented (e.g. toggle on/off router and address prefix advertisements); -(b) It must be supported via Neutron API (restful and CLI) as well as via -Horizon -Supported in Neutron, Juno Release: Yes for various types of IPv6 subnet and -Roadmap for multiple subnets -Notes: The ability to create various types of IPv6 subnets (i.e., SLAAC / DHCPv6 -Stateless / Stateful) is supported both using Neutron router and external -router. Refer to "various combinations and how to configure Neutron subnets" -(http://specs.openstack.org/openstack/neutron-specs/specs/juno/ipv6-radvd-ra.html#rest-api-impact). -Refer to Blueprints "IPv6 Prefix Delegation" -(https://blueprints.launchpad.net/neutron/+spec/ipv6-prefix-delegation) and -"Multiple IPv6 Prefixes" -(https://blueprints.launchpad.net/neutron/+spec/multiple-ipv6-prefixes) for -support of multiple IPv4 and IPv6 networks - -(14) Use Case / Requirement 14: Ability to specify Floating IPs via Neutron API -(restful and CLI) as well as via Horizon, including combination of IPv6/IPv4 -and IPv4/IPv6 Floating IPs if implemented -Supported in Neutron, Juno Release: No -Notes: IPv6 Floating IPs will not be supported in Kilo. See BP -(https://review.openstack.org/#/c/139731/). Refer to previous item of floating -IPv6 functionality being rejected. - -(15) Use Case / Requirement 15: Ability to control and manage all IPv6 security -group capabilities via Neutron/Nova API (restful and CLI) as well as via Horizon -Supported in Neutron, Juno Release: Yes -Notes: Refer to previous item of IPv6 security group - diff --git a/vrouter/Service_VM_as_vRouter.rst b/vrouter/Service_VM_as_vRouter.rst deleted file mode 100644 index 8592323..0000000 --- a/vrouter/Service_VM_as_vRouter.rst +++ /dev/null @@ -1,44 +0,0 @@ -================================== -Exercising Service VM as a vRouter -================================== - -There are 3 steps to set up a service VM as a vRouter: - -- Step 1: `Get a service VM running`_ - -- Step 2: `Handling Neutron Security Group Feature`_ - -- Step 3: `Set up an IPv6 vRouter on the Service VM`_ - -*************************** -_`Get a Service VM Running` -*************************** - -Please click `Set up Service VM`_ page for instructions to get a service VM running. - -.. _`Set up Service VM`: ./setup_service_vm.html - -****************************************** -_`Handling Neutron Security Group Feature` -****************************************** - ------------------------------- -Disable Security Group Feature ------------------------------- - -If Open Stack is integrated and running with Open Daylight, we need to completely disable Security Group feature in Open Stack because Open Daylight doesn’t support it. - ----------------------------------------------------------- -Use Neutron ML2 Port Security Extension (Kilo and Liberty) ----------------------------------------------------------- - -For Open Stack Kilo or Liberty with ML2 OVS only (without Open Daylight), we need to use Port Security Extension of Neutron and disable Anti-spoofing Rule on the service VM. - -******************************************* -_`Set up an IPv6 vRouter on the Service VM` -******************************************* - -Please click `Set up IPv6 vRouter`_ page for instructions to set up an IPv6 vRouter on a Service VM. - -.. _`Set up IPv6 vRouter`: ./setup_ipv6_vrouter.html - diff --git a/vrouter/Service_VM_as_vRouter.txt b/vrouter/Service_VM_as_vRouter.txt deleted file mode 100644 index 8592323..0000000 --- a/vrouter/Service_VM_as_vRouter.txt +++ /dev/null @@ -1,44 +0,0 @@ -================================== -Exercising Service VM as a vRouter -================================== - -There are 3 steps to set up a service VM as a vRouter: - -- Step 1: `Get a service VM running`_ - -- Step 2: `Handling Neutron Security Group Feature`_ - -- Step 3: `Set up an IPv6 vRouter on the Service VM`_ - -*************************** -_`Get a Service VM Running` -*************************** - -Please click `Set up Service VM`_ page for instructions to get a service VM running. - -.. _`Set up Service VM`: ./setup_service_vm.html - -****************************************** -_`Handling Neutron Security Group Feature` -****************************************** - ------------------------------- -Disable Security Group Feature ------------------------------- - -If Open Stack is integrated and running with Open Daylight, we need to completely disable Security Group feature in Open Stack because Open Daylight doesn’t support it. - ----------------------------------------------------------- -Use Neutron ML2 Port Security Extension (Kilo and Liberty) ----------------------------------------------------------- - -For Open Stack Kilo or Liberty with ML2 OVS only (without Open Daylight), we need to use Port Security Extension of Neutron and disable Anti-spoofing Rule on the service VM. - -******************************************* -_`Set up an IPv6 vRouter on the Service VM` -******************************************* - -Please click `Set up IPv6 vRouter`_ page for instructions to set up an IPv6 vRouter on a Service VM. - -.. _`Set up IPv6 vRouter`: ./setup_ipv6_vrouter.html - diff --git a/vrouter/setup_ipv6_vrouter.rst b/vrouter/setup_ipv6_vrouter.rst deleted file mode 100644 index 06d2de8..0000000 --- a/vrouter/setup_ipv6_vrouter.rst +++ /dev/null @@ -1,122 +0,0 @@ -====================================== -Set up an IPv6 vRouter on a Service VM -====================================== - -| Here you will find the steps involved in creating a ServiceVM that acts as an IPv6 vRouter. In this example, we will be using a CentOS7 image as vRouter (we should be able to use other OS as well) and devstack for OpenStack installation. We need to enable Port Security Extension as the extension_drivers in ML2 configuration file. - -| Following is a sample configuration of devstack local.conf file. - -| **# [[local|localrc]]** -| `DATA_DIR=$DEST/data` -| `SCREEN_LOGDIR=$DATA_DIR/logs` -| `LOGFILE=$SCREEN_LOGDIR/stack.sh.log` -| `ADMIN_PASSWORD=password` -| `MYSQL_PASSWORD=password` -| `RABBIT_PASSWORD=password` -| `SERVICE_PASSWORD=password` -| `SERVICE_TOKEN=token` -| `disable_service n-net tempest h-eng h-api h-api-cfn h-api-cw` -| `enable_service q-svc q-dhcp q-meta q-agt q-l3 n-novnc` -| **# [[post-config|/$Q_PLUGIN_CONF_FILE]]** -| **# [ml2]** -| `extension_drivers=port_security` - -| After successful installation of OpenStack with the above configuration, we shall create the necessary neutron networks/subnets/ports etc. -| `cd devstack` -| `./stack.sh` - -| # Source the tenant credentials. -| `source openrc admin demo` -| # Create a Neutron router which provides external connectivity. -| `neutron router-create router1` -| # Create an external network using the appropriate values based on the data-center physical network setup. -| `neutron net-create --provider:network_type --provider:physical_network --provider:segmentation_id --router:external ext-net` -| # Configure ipv6_gateway= in the Neutron L3 agent configuration file. -| # Associate the ext-net to the neutron router. -| `neutron router-gateway-set router1 ext-net` -| # Create an IPv6 internal network. -| `neutron net-create ipv6-internal-network` -| # Create an IPv6 subnet in the internal network. -| `neutron subnet-create --name ipv6-int-subnet --ip-version 6 --ipv6-ra-mode slaac --ipv6-address-mode slaac ipv6-internal-network 2001:db8:0:1::/64` -| # Associate the internal subnet to a neutron router. -| `neutron router-interface-add router1 ipv6-int-subnet` - -| Now we shall create an isolated network which is the internal network of vRouter. -| # Create an isolated router for the tenant internal network. -| `neutron router-create router2` -| # Create a Neutron Internal Network. -| `neutron net-create tenant-internal-network` -| # Create an IPv4 subnet in the internal network. -| `neutron subnet-create --name ipv4-int-subnet tenant-internal-network 10.0.0.1/24` -| # Associate the router2 to IPv4 subnet created above. -| `neutron router-interface-add ` - -| Mapping this configuration to `PoC-1`_. - -.. _`PoC-1`: /ipv6/images/ipv6-poc-1.png - -- `ipv6-internal-network and ext-net is the Red colored network.` -- `tenant-internal-network is the Green colored network.` - -| Lets create two neutron ports one from ext-net and the other from tenant-internal-network for the vRouter VM -| `neutron port-create ipv6-internal-network --port-security-enabled=False --name enp0s3-port` -| `neutron port-create tenant-internal-network --port-security-enabled=False --name enp0s8-port` - -| Download the Centos7 image which is used as vRouter. -| `glance image-create --name 'Centos7' --disk-format qcow2 --container-format bare --is-public true --copy-from http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2` - -| Create a keypair. -| `nova keypair-add vRouterKey > ~/vRouterKey` - -| Spawn the Centos7 image with two nics (i.e., enp0s3-port and enp0s8-port) -| `nova boot --image –flavor m1.small --nic port-id=$(neutron port-show -f value -F id enp0s3-port) –nic --nic port-id=$(neutron port-show -f value -F id enp0s8-port) --key-name vRouterKey CentOSvRouter` - -| Verify that CentOSvRouter boots up successfully and keypair is injected. -| `nova list` -| `nova console-log CentOSvRouter` - -| After the image boots up successfully, from the router1 namespace, ssh to vRouter using the keypair. -| `sudo ip netns` -| `sudo ip netns exec bash` -| `ssh -i ~/vRouterKey centos@` - -| As a one time job, before we can create the snapshot, execute the steps (i.e., SLAAC setup) mentioned at the following link. -| `https://wiki.opnfv.org/ipv6_opnfv_project/vm_as_router` - -| In order to verify that the setup is working, lets create some cirros VMs on the "tenant-internal-network" (i.e., vRouter internal network). -| `nova boot --image --flavor m1.tiny --nic net-id= VM1` -| `nova boot --image --flavor m1.tiny --nic net-id= VM2` - -| Confirm that both the VMs have successfully booted up. -| `nova list` -| `nova console-log VM1` -| `nova console-log VM2` - -| Add the necessary security group ingress rules. -| `source openrc demo demo` -| # SSH access to the VMs -| `neutron security-group-rule-create --direction ingress --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 10.0.0.0/24 default` -| # Permit IPv6 Router Advts from the vRouter internal interface to the VMs. -| `neutron security-group-rule-create --direction ingress --ethertype IPv6 --protocol icmpv6 --port-range-min 134 --remote-ip-prefix fe80::/64 default` - -| SSH to the cirros VMs to check the IPv6 forwarding use-case. -| `sudo ip netns` -| `sudo ip netns exec bash` -| `ssh cirros@` - -| Note: default password of cirros image would be "cubswin:)" - -| Verify that Cirros image has an IPv6 address assigned via SLAAC with a prefix of "2001:db8:0:2::/64" -| `ip address` -| # verify that default route points to the LLA of enp0s8 interface of vRouter. -| `ip -6 route` - -| Try pinging to the internal router interface of router1 (i.e., 2001:db8:0:1::1/64) -| `ping6 2001:db8:0:1::1/64` - -| If all goes well, ping6 should succeed which shows that vRouter is forwarding the IPv6 traffic of instances on the tenant-internal-network. - -| At this state, we can create a snapshot of the CentOSvRouter and use it in any other similar OpenStack setup. -| `nova image-create ` -| `nova image-list #You will find the snapshot you just created above.` - diff --git a/vrouter/setup_ipv6_vrouter.txt b/vrouter/setup_ipv6_vrouter.txt deleted file mode 100644 index 06d2de8..0000000 --- a/vrouter/setup_ipv6_vrouter.txt +++ /dev/null @@ -1,122 +0,0 @@ -====================================== -Set up an IPv6 vRouter on a Service VM -====================================== - -| Here you will find the steps involved in creating a ServiceVM that acts as an IPv6 vRouter. In this example, we will be using a CentOS7 image as vRouter (we should be able to use other OS as well) and devstack for OpenStack installation. We need to enable Port Security Extension as the extension_drivers in ML2 configuration file. - -| Following is a sample configuration of devstack local.conf file. - -| **# [[local|localrc]]** -| `DATA_DIR=$DEST/data` -| `SCREEN_LOGDIR=$DATA_DIR/logs` -| `LOGFILE=$SCREEN_LOGDIR/stack.sh.log` -| `ADMIN_PASSWORD=password` -| `MYSQL_PASSWORD=password` -| `RABBIT_PASSWORD=password` -| `SERVICE_PASSWORD=password` -| `SERVICE_TOKEN=token` -| `disable_service n-net tempest h-eng h-api h-api-cfn h-api-cw` -| `enable_service q-svc q-dhcp q-meta q-agt q-l3 n-novnc` -| **# [[post-config|/$Q_PLUGIN_CONF_FILE]]** -| **# [ml2]** -| `extension_drivers=port_security` - -| After successful installation of OpenStack with the above configuration, we shall create the necessary neutron networks/subnets/ports etc. -| `cd devstack` -| `./stack.sh` - -| # Source the tenant credentials. -| `source openrc admin demo` -| # Create a Neutron router which provides external connectivity. -| `neutron router-create router1` -| # Create an external network using the appropriate values based on the data-center physical network setup. -| `neutron net-create --provider:network_type --provider:physical_network --provider:segmentation_id --router:external ext-net` -| # Configure ipv6_gateway= in the Neutron L3 agent configuration file. -| # Associate the ext-net to the neutron router. -| `neutron router-gateway-set router1 ext-net` -| # Create an IPv6 internal network. -| `neutron net-create ipv6-internal-network` -| # Create an IPv6 subnet in the internal network. -| `neutron subnet-create --name ipv6-int-subnet --ip-version 6 --ipv6-ra-mode slaac --ipv6-address-mode slaac ipv6-internal-network 2001:db8:0:1::/64` -| # Associate the internal subnet to a neutron router. -| `neutron router-interface-add router1 ipv6-int-subnet` - -| Now we shall create an isolated network which is the internal network of vRouter. -| # Create an isolated router for the tenant internal network. -| `neutron router-create router2` -| # Create a Neutron Internal Network. -| `neutron net-create tenant-internal-network` -| # Create an IPv4 subnet in the internal network. -| `neutron subnet-create --name ipv4-int-subnet tenant-internal-network 10.0.0.1/24` -| # Associate the router2 to IPv4 subnet created above. -| `neutron router-interface-add ` - -| Mapping this configuration to `PoC-1`_. - -.. _`PoC-1`: /ipv6/images/ipv6-poc-1.png - -- `ipv6-internal-network and ext-net is the Red colored network.` -- `tenant-internal-network is the Green colored network.` - -| Lets create two neutron ports one from ext-net and the other from tenant-internal-network for the vRouter VM -| `neutron port-create ipv6-internal-network --port-security-enabled=False --name enp0s3-port` -| `neutron port-create tenant-internal-network --port-security-enabled=False --name enp0s8-port` - -| Download the Centos7 image which is used as vRouter. -| `glance image-create --name 'Centos7' --disk-format qcow2 --container-format bare --is-public true --copy-from http://cloud.centos.org/centos/7/images/CentOS-7-x86_64-GenericCloud.qcow2` - -| Create a keypair. -| `nova keypair-add vRouterKey > ~/vRouterKey` - -| Spawn the Centos7 image with two nics (i.e., enp0s3-port and enp0s8-port) -| `nova boot --image –flavor m1.small --nic port-id=$(neutron port-show -f value -F id enp0s3-port) –nic --nic port-id=$(neutron port-show -f value -F id enp0s8-port) --key-name vRouterKey CentOSvRouter` - -| Verify that CentOSvRouter boots up successfully and keypair is injected. -| `nova list` -| `nova console-log CentOSvRouter` - -| After the image boots up successfully, from the router1 namespace, ssh to vRouter using the keypair. -| `sudo ip netns` -| `sudo ip netns exec bash` -| `ssh -i ~/vRouterKey centos@` - -| As a one time job, before we can create the snapshot, execute the steps (i.e., SLAAC setup) mentioned at the following link. -| `https://wiki.opnfv.org/ipv6_opnfv_project/vm_as_router` - -| In order to verify that the setup is working, lets create some cirros VMs on the "tenant-internal-network" (i.e., vRouter internal network). -| `nova boot --image --flavor m1.tiny --nic net-id= VM1` -| `nova boot --image --flavor m1.tiny --nic net-id= VM2` - -| Confirm that both the VMs have successfully booted up. -| `nova list` -| `nova console-log VM1` -| `nova console-log VM2` - -| Add the necessary security group ingress rules. -| `source openrc demo demo` -| # SSH access to the VMs -| `neutron security-group-rule-create --direction ingress --protocol tcp --port-range-min 22 --port-range-max 22 --remote-ip-prefix 10.0.0.0/24 default` -| # Permit IPv6 Router Advts from the vRouter internal interface to the VMs. -| `neutron security-group-rule-create --direction ingress --ethertype IPv6 --protocol icmpv6 --port-range-min 134 --remote-ip-prefix fe80::/64 default` - -| SSH to the cirros VMs to check the IPv6 forwarding use-case. -| `sudo ip netns` -| `sudo ip netns exec bash` -| `ssh cirros@` - -| Note: default password of cirros image would be "cubswin:)" - -| Verify that Cirros image has an IPv6 address assigned via SLAAC with a prefix of "2001:db8:0:2::/64" -| `ip address` -| # verify that default route points to the LLA of enp0s8 interface of vRouter. -| `ip -6 route` - -| Try pinging to the internal router interface of router1 (i.e., 2001:db8:0:1::1/64) -| `ping6 2001:db8:0:1::1/64` - -| If all goes well, ping6 should succeed which shows that vRouter is forwarding the IPv6 traffic of instances on the tenant-internal-network. - -| At this state, we can create a snapshot of the CentOSvRouter and use it in any other similar OpenStack setup. -| `nova image-create ` -| `nova image-list #You will find the snapshot you just created above.` - diff --git a/vrouter/setup_service_vm.rst b/vrouter/setup_service_vm.rst deleted file mode 100644 index a9c0a87..0000000 --- a/vrouter/setup_service_vm.rst +++ /dev/null @@ -1,198 +0,0 @@ -================================================ -Set up a Service VM Running as a vRouter (SLAAC) -================================================ - -| # Current network setup for IPv6 router VM on local virtualbox setup -| # /etc/sysconfig/network-scripts/ifcfg-enp0s3 -| # Network interface enp0s3 is IPv4 for public internet access -| TYPE="Ethernet" -| BOOTPROTO="dhcp" -| DEFROUTE="yes" -| PEERDNS="yes" -| PEERROUTES="yes" -| IPV4_FAILURE_FATAL="no" -| IPV6INIT="yes" -| IPV6_AUTOCONF="yes" -| IPV6_DEFROUTE="yes" -| IPV6_PEERDNS="yes" -| IPV6_PEERROUTES="yes" -| IPV6_FAILURE_FATAL="no" -| NAME="enp0s3" -| UUID="32bad876-680a-4f78-a364-726eae21bfcf" -| DEVICE="enp0s3" -| ONBOOT="yes" - -| # /etc/sysconfig/network-scripts/ifcfg-enp0s8 -| # Network interface enp0s8 is IPv6 internal interface to provide IPv6 to internal hosts -| BOOTPROTO=static -| IPV6INIT=yes -| IPV6ADDR="2001:db8:0:2::1/64" -| NAME=enp0s8 -| UUID=e931a806-2f76-425d-b035-d37813b81df5 -| DEVICE=enp0s8 -| ONBOOT=yes -| NM_CONTROLLED=no - -| # Disable NetworkManager -| systemctl disable NetworkManager - -| # Install dhcp.x86_64, dhcp-common.x86_64, radvd.x86_64 if not already installed -| yum install dhcp-common -| yum install dhcp -| yum install radvd - -| # /etc/sysctl.conf Set sysctl to enable IPv6 forwarding -| net.ipv6.conf.all.forwarding=1 -| net.ipv6.conf.enp0s3.accept_ra=2 -| net.ipv6.conf.enp0s3.accept_ra_defrtr=1 -| net.ipv6.conf.enp0s3.router_solicitations=1 - -| # /etc/radvd.conf -| interface enp0s8 -| { -| # This is the primary "on switch" for RADVD -| AdvSendAdvert on; -| # -| # These settings determine how often advertisements will be sent every X-Y. -| # X and Y are in seconds. -| # With these settings you will be sending a advert every 60 seconds -| # -| MinRtrAdvInterval 60; -| MaxRtrAdvInterval 180; -| # -| # Disable Mobile IPv6 support -| # -| AdvHomeAgentFlag off; -| # -| # Here we set our managed flags -| # -| AdvManagedFlag on; -| AdvOtherConfigFlag on; -| # -| # Enter our IPv6 prefix and CIDR -| # -| prefix 2001:db8:0:2::/64 -| { -| AdvOnLink on; -| # On link tells the host that the default router is on the same "link" as it is -| AdvAutonomous on; -| AdvRouterAddr off; -| }; -| }; - -# Enable radvd service -systemctl enable radvd - -# In /etc/sysconfig/network add -IPV6FORWARDING=yes - -================================================================= -Set up a Service VM Running as a vRouter (DHCPv6 Stateful Server) -================================================================= - -| # Current network setup for IPv6 router VM on local virtualbox setup -| # /etc/sysconfig/network-scripts/ifcfg-enp0s3 -| # Network interface enp0s3 is IPv4 for public internet access -| TYPE="Ethernet" -| BOOTPROTO="dhcp" -| DEFROUTE="yes" -| PEERDNS="yes" -| PEERROUTES="yes" -| IPV4_FAILURE_FATAL="no" -| IPV6INIT="yes" -| IPV6_AUTOCONF="yes" -| IPV6_DEFROUTE="yes" -| IPV6_PEERDNS="yes" -| IPV6_PEERROUTES="yes" -| IPV6_FAILURE_FATAL="no" -| NAME="enp0s3" -| UUID="32bad876-680a-4f78-a364-726eae21bfcf" -| DEVICE="enp0s3" -| ONBOOT="yes" - -| # /etc/sysconfig/network-scripts/ifcfg-enp0s8 -| # Network interface enp0s8 is IPv6 internal interface to provide IPv6 to internal hosts -| BOOTPROTO=static -| IPV6INIT=yes -| IPV6ADDR="2001:db8:0:2::1/64" -| NAME=enp0s8 -| UUID=e931a806-2f76-425d-b035-d37813b81df5 -| DEVICE=enp0s8 -| ONBOOT=yes -| NM_CONTROLLED=no - -| # Disable NetworkManager -| systemctl disable NetworkManager - -| # Install dhcp.x86_64, dhcp-common.x86_64, radvd.x86_64 if not already installed -| yum install dhcp-common -| yum install dhcp -| yum install radvd - -| # /etc/sysctl.conf Set sysctl to enable IPv6 forwarding -| net.ipv6.conf.all.forwarding=1 -| net.ipv6.conf.enp0s3.accept_ra=2 -| net.ipv6.conf.enp0s3.accept_ra_defrtr=1 -| net.ipv6.conf.enp0s3.router_solicitations=1 - -| # /etc/dhcp/dhcpd6.conf -| # DHCP for IPv6 Server Configuration file. - -| # Enable RFC 5007 support (same than for DHCPv4) - allow leasequery; - -| # IPv6 address valid lifetime -| # (at the end the address is no longer usable by the client) -| # (set to 30 days, the usual IPv6 default) -| default-lease-time 2592000; - -| # IPv6 address preferred lifetime -| # (at the end the address is deprecated, i.e., the client should use -| # other addresses for new connections) -| # (set to 7 days, the usual IPv6 default) -| preferred-lifetime 604800; - -| # T1, the delay before Renew -| # (default is 1/2 preferred lifetime) -| # (set to 1 hour) -| option dhcp-renewal-time 3600; - -| # T2, the delay before Rebind (if Renews failed) -| # (default is 3/4 preferred lifetime) -| # (set to 2 hours) -| option dhcp-rebinding-time 7200; - -| # The path of the lease file -| dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases"; - -| # Set preference to 255 (maximum) in order to avoid waiting for -| # additional servers when there is only one -| option dhcp6.preference 255; - -| # Server side command to enable rapid-commit (2 packet exchange) -| option dhcp6.rapid-commit; - -| # The delay before information-request refresh -| # (minimum is 10 minutes, maximum one day, default is to not refresh) -| # (set to 6 hours) - option dhcp6.info-refresh-time 21600; - -| # Set this to `interim` when doing ddns updates -| ddns-update-style interim; -| -| subnet6 2001:db8:0:2::/64 { -| option dhcp6.name-servers 2001:db8:0:2::1; -| option dhcp6.domain-search "opnfv.local"; -| ddns-hostname = concat(binary-to-ascii(10, 8, "-", leased-address), ".wired"); -| ddns-domainname = "opnfv.local"; -| # Our address range 1000 through 1fff -| range6 2001:db8:0:2::1000 2001:db8:0:2::1fff; -| } -| -| # In /etc/sysconfig/network add -| IPV6FORWARDING=yes - -For reference, refer to `How to set up RADVd DHCPv6 and DNS on CentOS 6`_. - -.. _`How to set up RADVd DHCPv6 and DNS on CentOS 6`: http://www.percula.info/archives/196 - diff --git a/vrouter/setup_service_vm.txt b/vrouter/setup_service_vm.txt deleted file mode 100644 index a9c0a87..0000000 --- a/vrouter/setup_service_vm.txt +++ /dev/null @@ -1,198 +0,0 @@ -================================================ -Set up a Service VM Running as a vRouter (SLAAC) -================================================ - -| # Current network setup for IPv6 router VM on local virtualbox setup -| # /etc/sysconfig/network-scripts/ifcfg-enp0s3 -| # Network interface enp0s3 is IPv4 for public internet access -| TYPE="Ethernet" -| BOOTPROTO="dhcp" -| DEFROUTE="yes" -| PEERDNS="yes" -| PEERROUTES="yes" -| IPV4_FAILURE_FATAL="no" -| IPV6INIT="yes" -| IPV6_AUTOCONF="yes" -| IPV6_DEFROUTE="yes" -| IPV6_PEERDNS="yes" -| IPV6_PEERROUTES="yes" -| IPV6_FAILURE_FATAL="no" -| NAME="enp0s3" -| UUID="32bad876-680a-4f78-a364-726eae21bfcf" -| DEVICE="enp0s3" -| ONBOOT="yes" - -| # /etc/sysconfig/network-scripts/ifcfg-enp0s8 -| # Network interface enp0s8 is IPv6 internal interface to provide IPv6 to internal hosts -| BOOTPROTO=static -| IPV6INIT=yes -| IPV6ADDR="2001:db8:0:2::1/64" -| NAME=enp0s8 -| UUID=e931a806-2f76-425d-b035-d37813b81df5 -| DEVICE=enp0s8 -| ONBOOT=yes -| NM_CONTROLLED=no - -| # Disable NetworkManager -| systemctl disable NetworkManager - -| # Install dhcp.x86_64, dhcp-common.x86_64, radvd.x86_64 if not already installed -| yum install dhcp-common -| yum install dhcp -| yum install radvd - -| # /etc/sysctl.conf Set sysctl to enable IPv6 forwarding -| net.ipv6.conf.all.forwarding=1 -| net.ipv6.conf.enp0s3.accept_ra=2 -| net.ipv6.conf.enp0s3.accept_ra_defrtr=1 -| net.ipv6.conf.enp0s3.router_solicitations=1 - -| # /etc/radvd.conf -| interface enp0s8 -| { -| # This is the primary "on switch" for RADVD -| AdvSendAdvert on; -| # -| # These settings determine how often advertisements will be sent every X-Y. -| # X and Y are in seconds. -| # With these settings you will be sending a advert every 60 seconds -| # -| MinRtrAdvInterval 60; -| MaxRtrAdvInterval 180; -| # -| # Disable Mobile IPv6 support -| # -| AdvHomeAgentFlag off; -| # -| # Here we set our managed flags -| # -| AdvManagedFlag on; -| AdvOtherConfigFlag on; -| # -| # Enter our IPv6 prefix and CIDR -| # -| prefix 2001:db8:0:2::/64 -| { -| AdvOnLink on; -| # On link tells the host that the default router is on the same "link" as it is -| AdvAutonomous on; -| AdvRouterAddr off; -| }; -| }; - -# Enable radvd service -systemctl enable radvd - -# In /etc/sysconfig/network add -IPV6FORWARDING=yes - -================================================================= -Set up a Service VM Running as a vRouter (DHCPv6 Stateful Server) -================================================================= - -| # Current network setup for IPv6 router VM on local virtualbox setup -| # /etc/sysconfig/network-scripts/ifcfg-enp0s3 -| # Network interface enp0s3 is IPv4 for public internet access -| TYPE="Ethernet" -| BOOTPROTO="dhcp" -| DEFROUTE="yes" -| PEERDNS="yes" -| PEERROUTES="yes" -| IPV4_FAILURE_FATAL="no" -| IPV6INIT="yes" -| IPV6_AUTOCONF="yes" -| IPV6_DEFROUTE="yes" -| IPV6_PEERDNS="yes" -| IPV6_PEERROUTES="yes" -| IPV6_FAILURE_FATAL="no" -| NAME="enp0s3" -| UUID="32bad876-680a-4f78-a364-726eae21bfcf" -| DEVICE="enp0s3" -| ONBOOT="yes" - -| # /etc/sysconfig/network-scripts/ifcfg-enp0s8 -| # Network interface enp0s8 is IPv6 internal interface to provide IPv6 to internal hosts -| BOOTPROTO=static -| IPV6INIT=yes -| IPV6ADDR="2001:db8:0:2::1/64" -| NAME=enp0s8 -| UUID=e931a806-2f76-425d-b035-d37813b81df5 -| DEVICE=enp0s8 -| ONBOOT=yes -| NM_CONTROLLED=no - -| # Disable NetworkManager -| systemctl disable NetworkManager - -| # Install dhcp.x86_64, dhcp-common.x86_64, radvd.x86_64 if not already installed -| yum install dhcp-common -| yum install dhcp -| yum install radvd - -| # /etc/sysctl.conf Set sysctl to enable IPv6 forwarding -| net.ipv6.conf.all.forwarding=1 -| net.ipv6.conf.enp0s3.accept_ra=2 -| net.ipv6.conf.enp0s3.accept_ra_defrtr=1 -| net.ipv6.conf.enp0s3.router_solicitations=1 - -| # /etc/dhcp/dhcpd6.conf -| # DHCP for IPv6 Server Configuration file. - -| # Enable RFC 5007 support (same than for DHCPv4) - allow leasequery; - -| # IPv6 address valid lifetime -| # (at the end the address is no longer usable by the client) -| # (set to 30 days, the usual IPv6 default) -| default-lease-time 2592000; - -| # IPv6 address preferred lifetime -| # (at the end the address is deprecated, i.e., the client should use -| # other addresses for new connections) -| # (set to 7 days, the usual IPv6 default) -| preferred-lifetime 604800; - -| # T1, the delay before Renew -| # (default is 1/2 preferred lifetime) -| # (set to 1 hour) -| option dhcp-renewal-time 3600; - -| # T2, the delay before Rebind (if Renews failed) -| # (default is 3/4 preferred lifetime) -| # (set to 2 hours) -| option dhcp-rebinding-time 7200; - -| # The path of the lease file -| dhcpv6-lease-file-name "/var/lib/dhcpd/dhcpd6.leases"; - -| # Set preference to 255 (maximum) in order to avoid waiting for -| # additional servers when there is only one -| option dhcp6.preference 255; - -| # Server side command to enable rapid-commit (2 packet exchange) -| option dhcp6.rapid-commit; - -| # The delay before information-request refresh -| # (minimum is 10 minutes, maximum one day, default is to not refresh) -| # (set to 6 hours) - option dhcp6.info-refresh-time 21600; - -| # Set this to `interim` when doing ddns updates -| ddns-update-style interim; -| -| subnet6 2001:db8:0:2::/64 { -| option dhcp6.name-servers 2001:db8:0:2::1; -| option dhcp6.domain-search "opnfv.local"; -| ddns-hostname = concat(binary-to-ascii(10, 8, "-", leased-address), ".wired"); -| ddns-domainname = "opnfv.local"; -| # Our address range 1000 through 1fff -| range6 2001:db8:0:2::1000 2001:db8:0:2::1fff; -| } -| -| # In /etc/sysconfig/network add -| IPV6FORWARDING=yes - -For reference, refer to `How to set up RADVd DHCPv6 and DNS on CentOS 6`_. - -.. _`How to set up RADVd DHCPv6 and DNS on CentOS 6`: http://www.percula.info/archives/196 - -- 2.16.6