diff --git a/defaults/main.yml b/defaults/main.yml index b0eaf423..f1ea5a5b 100644 --- a/defaults/main.yml +++ b/defaults/main.yml @@ -209,8 +209,6 @@ octavia_loadbalancer_topology: SINGLE octavia_glance_image_tag: octavia-amphora-image # add here the id of the image owner to avoid faked images being used octavia_amp_image_owner_id: -# Name of the Octavia management network -octavia_neutron_management_network_name: mgmt # Name of the Octavia security group octavia_security_group_name: octavia_sec_grp # Restrict access to only authorized hosts @@ -262,8 +260,78 @@ octavia_enable_anti_affinity: False # for amphora creation #octavia_amp_availability_zone: +# Name of the Octavia management network in Neutron +octavia_neutron_management_network_name: lbaas-mgmt +# Name of the provider net in the system +octavia_provider_network_name: lbaas +# This sets it to the container managment network based on how you setup +# the provider net +octavia_container_network_name: "{{ octavia_provider_network_name }}_address" +octavia_provider_network: "{{ provider_networks|map(attribute='network')|selectattr('net_name','defined')|selectattr('net_name', 'equalto', octavia_provider_network_name)|list|first }}" octavia_hm_group: "octavia-health-manager" -octavia_hm_hosts: "{% for host in groups[octavia_hm_group] %}{{ hostvars[host]['ansible_host'] }}{% if not loop.last %},{% endif %}{% endfor %}" +# Note: We use some heuritsics here but if you do anyhting special make sure to use the +# ip addresses on the right network. This will use the container newtorking to figure out the ip +octavia_hm_hosts: "{% for host in groups[octavia_hm_group] %}{{ hostvars[host]['container_networks'][octavia_container_network_name]['address'] }}{% if not loop.last %},{% endif %}{% endfor %}" +# Set this to the right container port aka the eth you connect to the octavia +# management network +octavia_container_interface: "{{ octavia_provider_network.container_interface }}" +# Set this to true to drop the iptables rules +octavia_ip_tables_fw: True +# The iptable rules +octavia_iptables_rules: + - # Allow icmp + chain: INPUT + protocol: icmp + ctstate: NEW + icmp_type: 8 + jump: ACCEPT + - # Allow existing connections: + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + ctstate: RELATED,ESTABLISHED + jump: ACCEPT + - # Allow heartbeat: + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + protocol: udp + destination_port: "{{ octavia_health_manager_port }}" + jump: ACCEPT + - # Reject INPUT: + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + reject_with: icmp-port-unreachable + - # Reject FORWARD: + chain: FORWARD + in_interface: "{{ octavia_container_interface }}" + reject_with: icmp-port-unreachable + - # Allow icmp6 + chain: INPUT + protocol: icmpv6 + jump: ACCEPT + ip_version: ipv6 + - # Allow existing connections + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + ctstate: RELATED,ESTABLISHED + jump: ACCEPT + ip_version: ipv6 + - # Allow heartbeat + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + protocol: udp + destination_port: "{{ octavia_health_manager_port }}" + jump: ACCEPT + ip_version: ipv6 + - # Reject INPUT + chain: INPUT + in_interface: "{{ octavia_container_interface }}" + reject_with: icmp6-port-unreachable + ip_version: ipv6 + - # Reject FORWARD + chain: FORWARD + in_interface: "{{ octavia_container_interface }}" + reject_with: icmp6-port-unreachable + ip_version: ipv6 # Set up the drivers octavia_amphora_driver: amphora_haproxy_rest_driver @@ -273,9 +341,4 @@ octavia_network_driver: allowed_address_pairs_driver ## Tunable overrides octavia_octavia_conf_overrides: {} octavia_api_paste_ini_overrides: {} -octavia_policy_overrides: {} - - - - - +octavia_policy_overrides: {} \ No newline at end of file diff --git a/doc/source/configure-octavia.rst b/doc/source/configure-octavia.rst index c5245276..fb0b6912 100644 --- a/doc/source/configure-octavia.rst +++ b/doc/source/configure-octavia.rst @@ -25,27 +25,63 @@ Setup a neutron network for use by octavia ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Octavia needs connectivity between the control plane and the -load balancing VMs. For this purpose a provide rnetwork should be -created which bridges containers (if the control plane is installed -in a container) or hosts with vms. Refer to the appropriate documentation +load balancing VMs. For this purpose a provider network should be +created which bridges the octavia containers (if the control plane is installed +in a container) or hosts with VMs. Refer to the appropriate documentation and consult the tests in this project. In a general case, neutron networking can be a simple flat network. However in a complex case, this can be whatever -you need and want. Ensure you adjust the deployment accordingly. The following -is an example how to set it up in neutron: +you need and want. Ensure you adjust the deployment accordingly. An example +entry into ``openstack_user_config.yml`` is shown below: + +.. code-block:: yaml + + - network: + container_bridge: "br-lbaas" + container_type: "veth" + container_interface: "eth14" + host_bind_override: "eth14" + ip_from_q: "octavia" + type: "flat" + net_name: "octavia" + group_binds: + - neutron_linuxbridge_agent + - octavia-worker + - octavia-housekeeping + - octavia-health-manager + +Make sure to modify the other entries in this file as well. + +There are a couple of variables which need to be adjusted if you don't use +``lbaas`` for the provider network name and ``lbaas-mgmt`` for the neutron +name. Furthermore, the system tries to infer certain values based on the +inventory which might not always work and hence might need to be explicitly +declared. Review the file ``defaults\main.yml`` for more information. + +The following is an example how to set up a provider network in neutron: .. code-block:: bash - neutron net-create mgmt-net --shared \ + neutron net-create lbaas-mgmt --shared \ --provider:network_type flat \ - --provider:physical_network mgmt + --provider:physical_network lbaas - neutron subnet-create mgmt-net 172.19.0.0/22 --name mgmt-subnet + neutron subnet-create mgmt-net 172.19.0.0/22 --name lbaas-subnet --ip-version=4 \ --allocation-pool start=172.19.1.100,end=172.19.1.200 \ --enable-dhcp \ --dns-nameservers list=true 8.8.4.4 8.8.8.8 +Special attention needs to be applied to the ``--allocation-pool`` to not have +ips which overlap with ips assigned to hosts or containers (see the ``used_ips`` +variable in ``openstack_user_config.yml``) + +.. note:: + The system will deploy an iptables firewall if ``octavia_ip_tables_fw`` is set + to ``True`` (the default). This adds additional protection to the control plane + in the rare instance a load balancing vm is compromised. Please review carefully + the rules and adjust them for your installation. Please be aware that logging + of dropped packages is not enabled and you will need to add those rules manually. Building Octavia images ~~~~~~~~~~~~~~~~~~~~~~~ @@ -182,3 +218,4 @@ The variable ``octavia_spare_amphora_pool_size`` controls the size of the pool. The system will try to prebuild this number so using too big a number will consumes a lot of unnecessary resources. + diff --git a/releasenotes/notes/add-iptables-5ff8c4317e2e8498.yaml b/releasenotes/notes/add-iptables-5ff8c4317e2e8498.yaml new file mode 100644 index 00000000..4ea4242b --- /dev/null +++ b/releasenotes/notes/add-iptables-5ff8c4317e2e8498.yaml @@ -0,0 +1,8 @@ +--- +features: + - Simplifies configuration of lbaas-mgmt network. + + - Adds iptables rules to block taffic from the octavia managment network to + the octavia container for both ipv4 and ipv6. + + diff --git a/tasks/main.yml b/tasks/main.yml index 651bcb5c..5c995215 100644 --- a/tasks/main.yml +++ b/tasks/main.yml @@ -55,6 +55,7 @@ - octavia_neutron_management_network_name is defined tags: - octavia-install + - octavia-config - include: octavia_security_group.yml tags: @@ -65,6 +66,7 @@ - octavia_nova_flavor_uuid is not defined tags: - octavia-install + - octavia-config - include: octavia_post_install.yml tags: diff --git a/tasks/octavia_post_install.yml b/tasks/octavia_post_install.yml index 68a85972..35aa29a9 100644 --- a/tasks/octavia_post_install.yml +++ b/tasks/octavia_post_install.yml @@ -13,6 +13,27 @@ # See the License for the specific language governing permissions and # limitations under the License. +# iptables module doesn't see empty string as a null value so this is the only +# way to get a configurable rule definition in right now +- name: iptables rules + iptables: "{{ item }}" + with_items: "{{ octavia_iptables_rules }}" + when: octavia_ip_tables_fw|bool == true + +# This is totally odd: If you run the commands via run-parts (as the script +# in the distro does) they return 1; but do their job. If you run them +# directly they work. Ignoring errors for now -- +- name: save iptables rules (Ubuntu 16.04) + command: netfilter-persistent save + ignore_errors: yes + when: ansible_distribution == 'Ubuntu' and ansible_distribution_version == '16.04' + +- name: save iptables rules (CentOS & RHEL) + command: service iptables save + args: + warn: False # since we use save service module doesn't apply + when: ansible_distribution == 'CentOS' or ansible_distribution == 'Red Hat Enterprise Linux' + - name: Create certs directory file: path=/etc/octavia/certs/ state=directory @@ -58,7 +79,4 @@ # config_overrides: "{{ octavia_policy_overrides }}" # config_type: "json" notify: - - Restart octavia services - - - + - Restart octavia services \ No newline at end of file diff --git a/tests/host_vars/localhost.yml b/tests/host_vars/localhost.yml index 61721f78..e546b378 100644 --- a/tests/host_vars/localhost.yml +++ b/tests/host_vars/localhost.yml @@ -19,9 +19,6 @@ ansible_python_interpreter: "/usr/bin/python2" bridges: - name: "br-mgmt" ip_addr: "10.1.1.1" - # Use container mgmt as Octavia mgmt net - # set up veth pair to connect with Neutron - veth_peer: "eth14" - name: "br-vxlan" ip_addr: "10.1.2.1" - name: "br-vlan" @@ -29,3 +26,6 @@ bridges: veth_peer: "eth12" - name: "br-storage" ip_addr: "10.1.5.1" + - name: "br-lbaas" + ip_addr: "10.1.7.1" + veth_peer: "eth14" \ No newline at end of file diff --git a/tests/host_vars/octavia1.yml b/tests/host_vars/octavia1.yml index 4392f62e..6cf6fbfb 100644 --- a/tests/host_vars/octavia1.yml +++ b/tests/host_vars/octavia1.yml @@ -16,8 +16,7 @@ ansible_host: 10.1.1.104 ansible_become: True ansible_user: root -ipmi_address: 10.1.4.104 -container_name: "{{ inventory_hostname }}" +lbaas_address: 10.1.7.104 container_networks: management_address: address: "{{ ansible_host }}" @@ -25,3 +24,9 @@ container_networks: interface: "eth1" netmask: "255.255.255.0" type: "veth" + lbaas_address: + address: "{{ lbaas_address }}" + bridge: "br-lbaas" + interface: "eth14" + netmask: "255.255.255.0" + type: "veth" diff --git a/tests/os_octavia-overrides.yml b/tests/os_octavia-overrides.yml index 52492566..64ab6105 100644 --- a/tests/os_octavia-overrides.yml +++ b/tests/os_octavia-overrides.yml @@ -66,8 +66,11 @@ nova_console_type: novnc neutron_provider_networks: network_types: "vxlan,flat" network_vxlan_ranges: "1:1000" - network_flat_networks: "flat,mgmt" - network_mappings: "flat:eth12,mgmt:eth14" + network_flat_networks: "flat,lbaas" + network_mappings: "flat:eth12,lbaas:eth14" + +#couldn't find provider_networks inventory var? +octavia_container_interface: "eth14" # Must be set to a normal MTU neutron_network_device_mtu: 1500 @@ -80,7 +83,7 @@ neutron_metadata: True octavia_pip_package_state: latest octavia_package_state: latest -octavia_neutron_management_network_name: mgmt +octavia_neutron_management_network_name: lbaas-mgmt octavia_git_install_branch: stable/ocata diff --git a/tests/test-configure-octavia.yml b/tests/test-configure-octavia.yml index 371840e5..a994447c 100644 --- a/tests/test-configure-octavia.yml +++ b/tests/test-configure-octavia.yml @@ -87,15 +87,15 @@ openrc_path: /root/openrc net_name: "{{ octavia_neutron_management_network_name }}" provider_network_type: flat - provider_physical_network: mgmt + provider_physical_network: lbaas insecure: "{{ keystone_service_internaluri_insecure }}" - name: Ensure mgmt subnet exists neutron: command: create_subnet openrc_path: /root/openrc net_name: "{{ octavia_neutron_management_network_name }}" - subnet_name: "mgmt-subnet" - cidr: "10.1.1.0/24" + subnet_name: "lbaas-mgmt-subnet" + cidr: "10.1.7.0/24" insecure: "{{ keystone_service_internaluri_insecure }}" vars_files: diff --git a/vars/ubuntu-16.04.yml b/vars/ubuntu-16.04.yml index 75f6a628..916f57a9 100644 --- a/vars/ubuntu-16.04.yml +++ b/vars/ubuntu-16.04.yml @@ -17,4 +17,5 @@ cache_timeout: 600 octavia_distro_packages: - - haproxy + - iptables-persistent + - netfilter-persistent