Skip to content

Neutron - Service Réseau

Introduction

Neutron fournit le "Network as a Service" pour OpenStack. Il gère les réseaux virtuels, sous-réseaux, routeurs, et règles de sécurité. C'est l'un des services les plus complexes car il doit gérer l'isolation multi-tenant tout en fournissant la connectivité.

Prérequis

Points à apprendre

Architecture Neutron

graph TB
    subgraph Controller["CONTROLLER NODE"]
        neutron_api["Neutron API<br/>(9696)"]
        ml2["ML2 Plugin"]
        l3_central["L3 Agent<br/>(si central)"]
        dhcp["DHCP Agent"]
        metadata_ctrl["Metadata Agent"]
    end

    subgraph Compute["COMPUTE NODE"]
        ovs_agent["OVS Agent"]
        l3_dvr["L3 Agent<br/>(si DVR)"]
        metadata_dvr["Metadata Proxy<br/>(DVR)"]

        subgraph OVS["Open vSwitch"]
            br_int["br-int"]
            br_tun["br-tun<br/>(VXLAN)"]
            br_ex["br-ex<br/>(external)"]

            br_int <--> br_tun
            br_tun <--> br_ex
        end
    end

    Controller --> Compute

Types de réseaux

Type Description Isolation
Flat Réseau sans VLAN, accès direct Aucune
VLAN Isolation par VLAN ID L2
VXLAN Overlay réseau (tunnels) L2 over L3
GRE Tunnels GRE (legacy) L2 over L3
Geneve Évolution de VXLAN L2 over L3

Provider vs Tenant Networks

graph LR
    subgraph Provider["PROVIDER NETWORK<br/>(Créé par admin, accès direct)"]
        vm_p["VM"]
        vlan["VLAN 100"]
        phys["Réseau physique externe"]

        vm_p --> vlan --> phys
    end
graph LR
    subgraph Tenant["TENANT NETWORK<br/>(Créé par utilisateur, isolé)"]
        subgraph Private["Réseau privé (VXLAN/VLAN)"]
            vm1["VM 1"]
            vm2["VM 2"]
        end

        router["Routeur virtuel<br/>(SNAT)"]
        provider_net["Provider Network<br/>(floating)"]
        ext["External"]

        vm1 --> router
        vm2 --> router
        router --> provider_net --> ext
    end

Gestion des réseaux

Créer un réseau provider

# Réseau flat (accès direct sans VLAN)
openstack network create --share --external \
  --provider-network-type flat \
  --provider-physical-network physnet1 \
  external

# Réseau VLAN
openstack network create --share --external \
  --provider-network-type vlan \
  --provider-physical-network physnet1 \
  --provider-segment 100 \
  vlan100-external

# Sous-réseau
openstack subnet create external-subnet \
  --network external \
  --subnet-range 192.168.1.0/24 \
  --gateway 192.168.1.1 \
  --allocation-pool start=192.168.1.100,end=192.168.1.200 \
  --dns-nameserver 8.8.8.8 \
  --no-dhcp

Créer un réseau tenant

# Réseau privé (VXLAN par défaut)
openstack network create private

# Sous-réseau avec DHCP
openstack subnet create private-subnet \
  --network private \
  --subnet-range 10.0.0.0/24 \
  --gateway 10.0.0.1 \
  --dns-nameserver 8.8.8.8

# Créer un routeur
openstack router create main-router

# Connecter au réseau externe
openstack router set --external-gateway external main-router

# Connecter au réseau privé
openstack router add subnet main-router private-subnet

Security Groups

# Créer un security group
openstack security group create web-servers \
  --description "Web servers security group"

# Règles entrantes
openstack security group rule create web-servers \
  --protocol tcp --dst-port 22 \
  --remote-ip 10.0.0.0/8 \
  --description "SSH from internal"

openstack security group rule create web-servers \
  --protocol tcp --dst-port 80 \
  --remote-ip 0.0.0.0/0 \
  --description "HTTP from anywhere"

openstack security group rule create web-servers \
  --protocol tcp --dst-port 443 \
  --remote-ip 0.0.0.0/0 \
  --description "HTTPS from anywhere"

# ICMP
openstack security group rule create web-servers \
  --protocol icmp \
  --description "ICMP ping"

# Règle référençant un autre security group
openstack security group rule create web-servers \
  --protocol tcp --dst-port 3306 \
  --remote-group db-servers \
  --description "MySQL from db-servers group"

# Lister règles
openstack security group rule list web-servers

Floating IPs

# Créer une floating IP
openstack floating ip create external

# Associer à une instance
openstack server add floating ip myvm 192.168.1.100

# Ou lors de la création
FIP=$(openstack floating ip create external -f value -c floating_ip_address)
openstack server add floating ip myvm $FIP

# Dissocier
openstack server remove floating ip myvm 192.168.1.100

# Supprimer
openstack floating ip delete 192.168.1.100

Ports

# Créer un port avec IP fixe
openstack port create --network private \
  --fixed-ip subnet=private-subnet,ip-address=10.0.0.50 \
  --security-group web-servers \
  my-fixed-port

# Créer instance avec ce port
openstack server create myvm \
  --flavor m1.small \
  --image "Ubuntu 24.04" \
  --port my-fixed-port

# Port avec MAC spécifique
openstack port create --network private \
  --mac-address fa:16:3e:aa:bb:cc \
  custom-mac-port

# Désactiver port security (pour routeur/firewall VM)
openstack port set --no-security-group --disable-port-security my-port

# Allowed address pairs (pour VRRP, keepalived)
openstack port set --allowed-address ip-address=10.0.0.100 my-port

QoS (Quality of Service)

# Créer une politique QoS
openstack network qos policy create bandwidth-limit

# Règle de limitation bande passante
openstack network qos rule create \
  --type bandwidth-limit \
  --max-kbps 10000 \
  --max-burst-kbits 1000 \
  bandwidth-limit

# Appliquer à un port
openstack port set --qos-policy bandwidth-limit my-port

# Appliquer à un réseau
openstack network set --qos-policy bandwidth-limit private

DVR (Distributed Virtual Router)

graph LR
    subgraph NoDVR["SANS DVR (Centralisé)"]
        c1_nodvr["Compute 1<br/>VM"]
        c2_nodvr["Compute 2<br/>VM"]
        ctrl["Controller<br/>L3 Agent"]
        ext_nodvr["External"]

        c1_nodvr -->|East-West| ctrl
        c2_nodvr --> ctrl
        ctrl -->|SNAT| ext_nodvr
    end
graph TB
    subgraph DVR["AVEC DVR (Distribué)"]
        c1_dvr["Compute 1<br/>VM + L3"]
        c2_dvr["Compute 2<br/>VM + L3"]
        ext_dvr["External"]

        c1_dvr -->|Direct via floating IP| ext_dvr
        c1_dvr <-->|East-West direct| c2_dvr
    end

OVN (Open Virtual Network)

Alternative moderne à OVS Agent, recommandée pour les nouveaux déploiements.

# /etc/neutron/neutron.conf
[DEFAULT]
core_plugin = ml2
service_plugins = ovn-router

# /etc/neutron/plugins/ml2/ml2_conf.ini
[ml2]
mechanism_drivers = ovn
type_drivers = local,flat,vlan,geneve
tenant_network_types = geneve

[ovn]
ovn_nb_connection = tcp:10.0.0.10:6641
ovn_sb_connection = tcp:10.0.0.10:6642

Load Balancer (Octavia)

# Créer un load balancer
openstack loadbalancer create --name web-lb \
  --vip-subnet-id private-subnet

# Créer un listener
openstack loadbalancer listener create --name http-listener \
  --protocol HTTP --protocol-port 80 \
  --loadbalancer web-lb

# Créer un pool
openstack loadbalancer pool create --name web-pool \
  --protocol HTTP --lb-algorithm ROUND_ROBIN \
  --listener http-listener

# Ajouter des membres
openstack loadbalancer member create --name web-1 \
  --address 10.0.0.10 --protocol-port 80 \
  web-pool

openstack loadbalancer member create --name web-2 \
  --address 10.0.0.11 --protocol-port 80 \
  web-pool

# Health monitor
openstack loadbalancer healthmonitor create --name http-health \
  --type HTTP --delay 5 --timeout 3 --max-retries 3 \
  --url-path /health \
  web-pool

# Floating IP sur le LB
openstack floating ip set --port $(openstack loadbalancer show web-lb -f value -c vip_port_id) FLOATING_IP

Troubleshooting réseau

# Voir les ports d'une instance
openstack port list --server myvm

# Détails d'un port
openstack port show PORT_ID

# Namespaces Neutron
ip netns list
# qrouter-XXX : routeurs
# qdhcp-XXX : serveurs DHCP

# Dans un namespace
ip netns exec qrouter-XXX ip addr
ip netns exec qrouter-XXX iptables -t nat -L

# OVS flows
ovs-vsctl show
ovs-ofctl dump-flows br-int

# Logs agents
tail -f /var/log/neutron/neutron-openvswitch-agent.log
tail -f /var/log/neutron/neutron-l3-agent.log

Exemples pratiques

Architecture réseau multi-tier

#!/bin/bash
# Création architecture 3-tier (web, app, db)

# Réseaux
openstack network create web-tier
openstack network create app-tier
openstack network create db-tier

# Sous-réseaux
openstack subnet create web-subnet \
  --network web-tier --subnet-range 10.0.1.0/24 --gateway 10.0.1.1
openstack subnet create app-subnet \
  --network app-tier --subnet-range 10.0.2.0/24 --gateway 10.0.2.1
openstack subnet create db-subnet \
  --network db-tier --subnet-range 10.0.3.0/24 --gateway 10.0.3.1

# Routeur central
openstack router create central-router
openstack router set --external-gateway external central-router
openstack router add subnet central-router web-subnet
openstack router add subnet central-router app-subnet
openstack router add subnet central-router db-subnet

# Security groups
# Web tier : 80, 443 depuis internet
openstack security group create web-sg
openstack security group rule create web-sg --protocol tcp --dst-port 80
openstack security group rule create web-sg --protocol tcp --dst-port 443

# App tier : depuis web tier uniquement
openstack security group create app-sg
openstack security group rule create app-sg \
  --protocol tcp --dst-port 8080 --remote-ip 10.0.1.0/24

# DB tier : depuis app tier uniquement
openstack security group create db-sg
openstack security group rule create db-sg \
  --protocol tcp --dst-port 3306 --remote-ip 10.0.2.0/24

Ressources

Checkpoint

  • Je comprends la différence entre provider et tenant networks
  • Je peux créer des réseaux, sous-réseaux et routeurs
  • Je maîtrise les security groups et leurs règles
  • Je sais gérer les floating IPs
  • Je comprends le fonctionnement de DVR
  • Je peux diagnostiquer les problèmes réseau (namespaces, OVS)