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)