VK Private Cloud logo
Помощь
Обновлена 21 августа 2026 г. в 11:12

Сетевые агенты и их пространства имен

Сетевые агенты Neutron реализуют сетевую конфигурацию, которую пользователи создают через Портал самообслуживания или OpenStack CLI. Агенты создают сетевые интерфейсы, обеспечивают их изоляцию, разворачивают DHCP, NAT и другие сервисы.

Обзор сетевых агентов Neutron приведен в таблице 1.

Таблица 1 — Сетевые агенты Neutron

Агент

Расположение

Обслуживаемые порты (device_owner)

Пространство имен

neutron-openvswitch-agent

Управляющие, сетевые и вычислительные узлы

Все

Сетевые агенты и их пространства имен

neutron-dhcp-agent

Сетевой или управляющий узел

network:dhcp

qdhcp-

neutron-l3-agent

Сетевой или управляющий узел

network:router_interface_distributed

qrouter-

network:router_centralized_snat

snat-

network:router_gateway

snat-

Вычислительный узел

network:router_interface_distributed

qrouter-

network:floatingip_agent_gateway

fip-

network:floatingip

qrouter-

neutron-metadata-agent

Сетевой или управляющий, вычислительный узел

Сетевые агенты и их пространства имен

qrouter- (совместно с neutron-l3-agent)

Чтобы получить список всех сетевых агентов в инсталляции:

# openstack network agent list

Общий принцип работы агентов:

  1. Пользователь или администратор VK Private Cloud создает порт.
  2. Neutron создает порт с назначенными ID, IP-адресом, MAC-адресом и прочими настройками.
  3. Настройки поступают на соответствующие агенты: DHCP-настройки — на DHCP-агент, маршрутизация — на L3-агент и т.д. Сервис nova-compute передает в Libvirt порт ВМ.
  4. Целевой агент создает сетевое пространство имен (ip netns) для изоляции настроек от сетевых настроек узла и от других пространств имен.
  5. Целевой агент создает сетевой интерфейс в своем пространстве имен и назначает ему IP-адрес, MAC-адрес, MTU и другие параметры.
  6. Целевой агент запускает необходимые сервисы в пространстве имен: например, DHCP-агент разворачивает dnsmasq, а L3-агент настраивает Iptables.
  7. Open vSwitch Agent подключает созданный интерфейс к мосту br-int и назначает ему VLAN ID.

Open vSwitch Agent

Open vSwitch Agent (neutron-openvswitch-agent) — базовый агент, который связывает Neutron с Open vSwitch на узле. Он обрабатывает запросы между Neutron и Open vSwitch и создает физические интерфейсы под порты в VK Private Cloud.

В работу агента входят два systemd-сервиса:

  • ovs-vswitchd — работает с сетевыми настройками на узле.
  • ovsdb-server — база данных, где хранится конфигурация Open vSwitch (мосты, порты, интерфейсы, параметры).

Эти сервисы располагаются на всех узлах, где работает пользовательская сеть Cloud Network: на всех сетевых (при наличии), управляющих и вычислительных узлах.

DHCP-агент

DHCP-агент (neutron-dhcp-agent) создает DHCP-порты типа network:dhcp и обеспечивает внутренние и внешние виртуальные сети DHCP-сервисом и ограниченным DNS-сервисом.

При создании подсети с включенным DHCP агент создает сетевое пространство имен qdhcp-<ID_СЕТИ> и размещает в нем два основных элемента:

  • Сетевой интерфейс tap<ID_ПОРТА_DHCP> с IP-адресом DHCP-порта и служебным адресом 169.254.169.254.
  • Сервис dnsmasq, который слушает порты DHCP (67) и DNS (53). На каждую сеть запускается отдельный экземпляр dnsmasq.

Примеры интерфейсов:

# ip netns exec qdhcp-<ID_СЕТИ> ip a1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00    inet 127.0.0.1/8 scope host lo       valid_lft forever preferred_lft forever    inet6 ::1/128 scope host       valid_lft forever preferred_lft forever11: tap<ID_ПОРТА_DHCP>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС_ПОРТА_DHCP> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_ПОРТА_DHCP> brd scope global tap<ID_ПОРТА_DHCP>       valid_lft forever preferred_lft forever    inet 169.254.169.254/16 brd 169.254.255.255 scope global tap<ID_ПОРТА_DHCP>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever

Примеры слушаемых портов:

# ip netns exec qdhcp-<ID_СЕТИ> netstat -nltupActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address            Foreign Address         State       PID/Program nametcp        0      0 <IP-АДРЕС_ПОРТА_DHCP>:53 0.0.0.0:*               LISTEN      <PID>/dnsmasqtcp        0      0 169.254.169.254:53       0.0.0.0:*               LISTEN      <PID>/dnsmasqtcp        0      0 0.0.0.0:80               0.0.0.0:*               LISTEN      <PID>/python3tcp6       0      0 <IPv6_АДРЕС>:53          :::*                    LISTEN      <PID>/dnsmasqudp        0      0 <IP-АДРЕС_ПОРТА_DHCP>:53 0.0.0.0:*                           <PID>/dnsmasqudp        0      0 169.254.169.254:53       0.0.0.0:*                           <PID>/dnsmasqudp        0      0 0.0.0.0:67               0.0.0.0:*                           <PID>/dnsmasqudp6       0      0 <IPv6_АДРЕС>:53          :::*                                <PID>/dnsmasq

Пример процесса dnsmasq:

# ps aux | grep <PID>dnsmasq   <PID>  0.0  0.0 245592   672 ?        S    Jan29   0:00 dnsmasq --no-hosts --no-resolv --strict-order --except-interface=lo --pid-file=/var/lib/neutron/dhcp/<ID_СЕТИ>/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/<ID_СЕТИ>/host --addn-hosts=/var/lib/neutron/dhcp/<ID_СЕТИ>/addn_hosts --dhcp-optsfile=/var/lib/neutron/dhcp/<ID_СЕТИ>/opts --dhcp-leasefile=/var/lib/neutron/dhcp/<ID_СЕТИ>/leases --dhcp-match=set:ipxe,175 --bind-interfaces --interface=tap<ID_ПОРТА_DHCP> --dhcp-range=set:tag0,<CIDR_ПОДСЕТИ>,static,604800s --dhcp-option-force=option:mtu,1350 --dhcp-lease-max=65536 --conf-file=/etc/neutron/dnsmasq-neutron.conf --server=<IP-АДРЕС_DNS> --domain=mcs.local.

В работе dnsmasq можно выделить файлы:

  • Файл аренды адресов — содержит выданные по DHCP IP-адреса со сроком аренды:

    # cat /var/lib/neutron/dhcp/<ID_СЕТИ>/leases<ТАЙМСТАМП> <MAC-АДРЕС_ВМ> <IP-АДРЕС_ВМ>   <ИМЯ_ВМ> <ИДЕНТИФИКАТОР_КЛИЕНТА><ТАЙМСТАМП> <ИМЯ_DHCP>     <IP-АДРЕС_ПОРТА_DHCP> <ИМЯ_DHCP> *
  • Файл статической привязки MAC-IP — гарантирует, что одной и той же ВМ всегда выдается один и тот же IP-адрес:

    # cat /var/lib/neutron/dhcp/<ID_СЕТИ>/host<MAC-АДРЕС_ВМ>,<ИМЯ_ВМ>.mcs.local.,<IP-АДРЕС_ВМ>
  • Файл параметров DHCP-ответов — содержит дополнительные настройки, которые передаются ВМ при DHCP-запросе:

    # cat /var/lib/neutron/dhcp/<ID_СЕТИ>/optstag:tag0,option:dns-server,<IP-АДРЕС_DNS>tag:tag0,option:classless-static-route,169.254.169.254/32,<CIDR_ПОДСЕТИ>,<ДИАПАЗОН_IP>tag:tag0,249,169.254.169.254/32,<CIDR_ПОДСЕТИ>,<ДИАПАЗОН_IP>tag:tag0,option:router,<IP-АДРЕС_ШЛЮЗА>

DHCP-агент также работает как локальный DNS-сервер, но его зона ограничена доменом, заданным при создании сети, и ВМ в ней:

# ip netns exec qdhcp-<ID_СЕТИ> nslookup <ИМЯ_ВМ>.mcs.local <IP-АДРЕС_ПОРТА_DHCP>Server:     <IP-АДРЕС_ПОРТА_DHCP>Address:    <IP-АДРЕС_ПОРТА_DHCP>#53Name:    <ИМЯ_ВМ>.mcs.localAddress: <IP-АДРЕС_ВМ>

L3-агент

L3-агент (neutron-l3-agent) организует маршрутизацию и NAT. Располагается на сетевых или управляющих узлах и на вычислительных узлах.

На сетевых или управляющих узлах агент обслуживает:

  • SNAT-порт (network:router_centralized_snat);
  • порт виртуального маршрутизатора Router Gateway во внешнюю сеть (network:router_gateway);
  • порт виртуального маршрутизатора Router Interface во внутреннюю сеть (network:router_interface_distributed).

На вычислительных узлах агент обслуживает:

События, которые вызывают L3-агента для создания или дополнения пространства имен:

Подключение виртуального маршрутизатора к внешней сети

При подключении виртуального маршрутизатора к внешней сети L3-агент создает сетевое пространство имен snat-<ID_МАРШРУТИЗАТОРА> и размещает в нем:

  • Сетевой интерфейс qg-<ID_ПОРТА_ROUTER_GATEWAY> с IP-адресом порта Router Gateway:

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> ip a...15: qg-<ID_ПОРТА_ROUTER_GATEWAY>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС_ПОРТА_ROUTER_GATEWAY> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY> brd scope global qg-<ID_ПОРТА_ROUTER_GATEWAY>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever...
  • Сетевой интерфейс sg-<ID_SNAT-ПОРТА> с IP-адресом SNAT-порта:

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> ip a...17: sg-<ID_SNAT-ПОРТА>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС_SNAT-ПОРТА> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_SNAT-ПОРТА> brd scope global sg-<ID_SNAT-ПОРТА>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever...
  • Таблицу маршрутизации трафика:

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> ip rdefault via <IP-АДРЕС_ШЛЮЗА_ВНЕШНЕЙ_СЕТИ> dev qg-<ID_ПОРТА_ROUTER_GATEWAY><CIDR_ВНЕШНЕЙ_ПОДСЕТИ> dev qg-<ID_ПОРТА_ROUTER_GATEWAY> proto kernel scope link src <ВНЕШНИЙ_IP-АДРЕС_МАРШРУТИЗАТОРА><CIDR_ВНУТРЕННЕЙ_ПОДСЕТИ> dev sg-<ID_SNAT-ПОРТА> proto kernel scope link src <IP-АДРЕС_ПОРТА_ROUTER_INTERFACE>
  • Iptables-правила маркировки трафика (mangle):

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> iptables -t mangle -S-P PREROUTING ACCEPT-P INPUT ACCEPT-P FORWARD ACCEPT-P OUTPUT ACCEPT-P POSTROUTING ACCEPT-N neutron-l3-agent-FORWARD-N neutron-l3-agent-INPUT-N neutron-l3-agent-OUTPUT-N neutron-l3-agent-POSTROUTING-N neutron-l3-agent-PREROUTING-N neutron-l3-agent-float-snat-N neutron-l3-agent-floatingip-N neutron-l3-agent-mark-N neutron-l3-agent-scope-A PREROUTING -j neutron-l3-agent-PREROUTING-A INPUT -j neutron-l3-agent-INPUT-A FORWARD -j neutron-l3-agent-FORWARD-A OUTPUT -j neutron-l3-agent-OUTPUT-A POSTROUTING -j neutron-l3-agent-POSTROUTING-A neutron-l3-agent-POSTROUTING -o qg-<ID_ПОРТА_ROUTER_GATEWAY> -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-mark-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-scope-A neutron-l3-agent-PREROUTING -m connmark ! --mark 0x0/0xffff0000 -j CONNMARK --restore-mark --nfmask 0xffff0000 --ctmask 0xffff0000-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-floatingip-A neutron-l3-agent-float-snat -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000-A neutron-l3-agent-mark -i qg-<ID_ПОРТА_ROUTER_GATEWAY> -j MARK --set-xmark 0x2/0xffff-A neutron-l3-agent-scope -i sg-<ID_SNAT-ПОРТА> -j MARK --set-xmark 0x4000000/0xffff0000-A neutron-l3-agent-scope -i qg-<ID_ПОРТА_ROUTER_GATEWAY> -j MARK --set-xmark 0x4000000/0xffff0000

    Здесь:

    • 0x2/0xffff — маркер для пакетов, пришедших с внешнего интерфейса (qg-). Используется для отличия FIP-трафика от обычного SNAT-трафика.
    • 0x4000000/0xffff0000 — маркер для пакетов с внутренних интерфейсов (sg-, qg-, qr-). Используется для трафика, который должен покинуть внутреннюю сеть через Floating IP-адрес или прямое подключение к внешней сети.
  • Iptables-правила NAT для SNAT-порта, которые обеспечивают исходящий доступ ВМ во внешнюю сеть:

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> iptables -t nat -S...-N neutron-l3-agent-snat-N neutron-postrouting-bottom...-A POSTROUTING -j neutron-postrouting-bottom...-A neutron-l3-agent-snat -o qg-<ID_ПОРТА_ROUTER_GATEWAY> -j SNAT --to-source <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY>-A neutron-l3-agent-snat -m mark ! --mark 0x2/0xffff -m conntrack --ctstate DNAT -j SNAT --to-source <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY>...-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat

    Здесь:

    • -N neutron-l3-agent-snat — цепочка SNAT-правил, которые для всего исходящего во внешнюю сеть трафика ВМ подставляют внешний IP-адрес маршрутизатора:

      • правило -o qg-<ID_ПОРТА_ROUTER_GATEWAY> -j SNAT --to-source <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY> подменяет Source IP на внешний IP-адрес маршрутизатора для пакета, выходящего через интерфейс qg- (внешний интерфейс маршрутизатора);
      • правило -m mark ! --mark 0x2/0xffff -m conntrack --ctstate DNAT -j SNAT --to-source <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY> подменяет Source IP на внешний IP-адрес маршрутизатора для пакета, не помеченного маркером 0x2 (маркер для пакетов с Floating IP-адреса).
    • -N neutron-postrouting-bottom — цепочка правил маршрутизации, которая перенаправляет трафик, проходящий стадию POSTROUTING (после маршрутизации, перед отправкой), в neutron-l3-agent-snat.

  • Iptables-правила NAT для порта Router Gateway:

    # ip netns exec snat-<ID_МАРШРУТИЗАТОРА> iptables -t nat -S...-N neutron-l3-agent-POSTROUTING...-A POSTROUTING -j neutron-l3-agent-POSTROUTING...-A neutron-l3-agent-POSTROUTING ! -i qg-<ID_ПОРТА_ROUTER_GATEWAY> ! -o qg-<ID_ПОРТА_ROUTER_GATEWAY> -m conntrack ! --ctstate DNAT -j ACCEPT

    Здесь -N neutron-l3-agent-POSTROUTING — цепочка правил маршрутизации, которая пропускает трафик между внутренними сетями, подключенными к одному маршрутизатору, без преобразования IP-адресов (NAT). Весь остальной трафик требует преобразования IP-адресов и обрабатывается цепочками SNAT-правил.

Подключение виртуального маршрутизатора к внутренней сети

При подключении виртуального маршрутизатора к внутренней сети L3-агент создает сетевое пространство имен qrouter-<ID_МАРШРУТИЗАТОРА> на сетевом или управляющем узле. В этом пространстве размещены:

  • Сетевой интерфейс qr-<ID_ПОРТА_ROUTER_INTERFACE> с IP-адресом порта Router Interface:

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> ip a...16: qr-<ID_ПОРТА_ROUTER_INTERFACE>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_ПОРТА_ROUTER_INTERFACE> brd scope global qr-<ID_ПОРТА_ROUTER_INTERFACE>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever...
  • Таблица маршрутизации трафика:

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> ip r<CIDR_ВНУТРЕННЕЙ_ПОДСЕТИ> dev qr-<ID_ПОРТА_ROUTER_INTERFACE> proto kernel scope link src <IP-АДРЕС_ШЛЮЗА_ВНУТРЕННЕЙ_СЕТИ>
  • Iptables-правила маркировки трафика (mangle):

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> iptables -t mangle -S-P PREROUTING ACCEPT-P INPUT ACCEPT-P FORWARD ACCEPT-P OUTPUT ACCEPT-P POSTROUTING ACCEPT-N neutron-l3-agent-FORWARD-N neutron-l3-agent-INPUT-N neutron-l3-agent-OUTPUT-N neutron-l3-agent-POSTROUTING-N neutron-l3-agent-PREROUTING-N neutron-l3-agent-float-snat-N neutron-l3-agent-floatingip-N neutron-l3-agent-mark-N neutron-l3-agent-scope-A PREROUTING -j neutron-l3-agent-PREROUTING-A INPUT -j neutron-l3-agent-INPUT-A FORWARD -j neutron-l3-agent-FORWARD-A OUTPUT -j neutron-l3-agent-OUTPUT-A POSTROUTING -j neutron-l3-agent-POSTROUTING-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-mark-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-scope-A neutron-l3-agent-PREROUTING -m connmark ! --mark 0x0/0xffff0000 -j CONNMARK --restore-mark --nfmask 0xffff0000 --ctmask 0xffff0000-A neutron-l3-agent-PREROUTING -j neutron-l3-agent-floatingip-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j MARK --set-xmark 0x1/0xffff-A neutron-l3-agent-float-snat -m connmark --mark 0x0/0xffff0000 -j CONNMARK --save-mark --nfmask 0xffff0000 --ctmask 0xffff0000-A neutron-l3-agent-scope -i qr-<ID_ПОРТА_ROUTER_INTERFACE> -j MARK --set-xmark 0x4000000/0xffff0000

    Здесь 0x4000000/0xffff0000 — маркер для пакетов с внутренних интерфейсов (sg-, qg-, qr-). Используется для трафика, который должен покинуть внутреннюю сеть через Floating IP-адрес или прямое подключение к внешней сети.

  • Iptables-правила фильтрации трафика (FORWARD):

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> iptables -S...-P FORWARD ACCEPT...-N neutron-l3-agent-FORWARD...-N neutron-l3-agent-scope...-A FORWARD -j neutron-l3-agent-FORWARD...-A neutron-l3-agent-FORWARD -j neutron-l3-agent-scope...-A neutron-l3-agent-scope -o qr-<ID_ПОРТА_ROUTER_INTERFACE1> -m mark ! --mark 0x4000000/0xffff0000 -j DROP-A neutron-l3-agent-scope -o qr-<ID_ПОРТА_ROUTER_INTERFACE2> -m mark ! --mark 0x4000000/0xffff0000 -j DROP

    Здесь neutron-l3-agent-scope — цепочка правил фильтрации трафика по маркеру: пропускаются только пакеты с маркером 0x4000000/0xffff0000.

При подключении к маршрутизатору нескольких внутренних подсетей, в пространстве имен накапливаются интерфейсы и маршруты.

Подключение ВМ к внутренней сети с маршрутизатором

При подключении ВМ к внутренней сети с виртуальным маршрутизатором L3-агент создает сетевое пространство имен qrouter-<ID_МАРШРУТИЗАТОРА> на вычислительном узле. Это часть технологии DVR (Distributed Virtual Router) — каждый маршрутизатор имеет интерфейс на каждом узле, где размещена ВМ во внутренней сети, подключенной к этому маршрутизатору. DVR обеспечивает локальную маршрутизацию трафика между ВМ, которые находятся на одном вычислительном узле, но в разных внутренних сетях, подключенных к одному маршрутизатору.

В сетевом пространстве имен qrouter-<ID_МАРШРУТИЗАТОРА> на вычислительном узле размещается сетевой интерфейс qr-<ID_ПОРТА_ROUTER_INTERFACE> с IP-адресом порта Router Interface:

# ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> ip a...15: qr-<ID_ПОРТА_ROUTER_INTERFACE>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_ПОРТА_ROUTER_INTERFACE> brd scope global qr-<ID_ПОРТА_ROUTER_INTERFACE>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever

Конфликтов между одноименными пространствами имен на разных узлах не возникает, потому что Open vSwitch назначает интерфейсам разные VLAN ID:

  • на вычислительном узле:

    # ovs-vsctl show | grep -A 1 qr-<ID_ПОРТА_ROUTER_INTERFACE>Port qr-<ID_ПОРТА_ROUTER_INTERFACE>    tag: 2    Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>        type: internal
  • на сетевом или управляющем узле:

    # ovs-vsctl show | grep -A 1 qr-<ID_ПОРТА_ROUTER_INTERFACE>Port qr-<ID_ПОРТА_ROUTER_INTERFACE>    tag: 4    Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>        type: internal

Привязка Floating IP-адреса к ВМ

При привязке Floating IP-адреса к ВМ:

  1. L3-агент создает сетевое пространство имен fip-<ID_ВНЕШНЕЙ_СЕТИ> на вычислительном узле. В этом пространстве размещены:

    • Сетевой интерфейс fg-<ID_ПОРТА_FIP_AGENT_GW> с IP-адресом порта Floating IP Agent Gateway:

      # ip netns exec fip-<ID_ВНЕШНЕЙ_СЕТИ> ip a...21: fg-<ID_ПОРТА_FIP_AGENT_GW>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UNKNOWN group default qlen 1000    link/ether <MAC-АДРЕС_ПОРТА_FIP_AGENT_GW> brd ff:ff:ff:ff:ff:ff    inet <IP-АДРЕС_FIP_AGENT_GW> brd scope global fg-<ID_ПОРТА_FIP_AGENT_GW>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever
    • Сетевой интерфейс fpr-<ID_МАРШРУТИЗАТОРА> для перемещения пакетов между пространствами имен fip-<ID_ВНЕШНЕЙ_СЕТИ> и qrouter-<ID_МАРШРУТИЗАТОРА> на вычислительном узле:

      # ip netns exec fip-<ID_ВНЕШНЕЙ_СЕТИ> ip a...2: fpr-<ID_МАРШРУТИЗАТОРА>@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UP group default qlen 1000    link/ether <MAC-АДРЕС_FPR> brd ff:ff:ff:ff:ff link-netns qrouter-<ID_МАРШРУТИЗАТОРА>    inet 169.254.88.135/31 scope global fpr-<ID_МАРШРУТИЗАТОРА>       valid_lft forever preferred_lft forever    inet6 fe80::<MAC-АДРЕС>/64 scope link       valid_lft forever preferred_lft forever...
    • Таблица маршрутизации трафика:

      # ip netns exec fip-<ID_ВНЕШНЕЙ_СЕТИ> ip r<CIDR_ВНЕШНЕЙ_ПОДСЕТИ> dev fg-<ID_ПОРТА_FIP_AGENT_GW> proto kernel scope link src <IP-АДРЕС_FIP_AGENT_GW><FLOATING_IP-АДРЕС_ВМ> via 169.254.88.134 dev fpr-<ID_МАРШРУТИЗАТОРА>169.254.88.134/31 dev fpr-<ID_МАРШРУТИЗАТОРА> proto kernel scope link src 169.254.88.135
  2. L3-агент размещает в пространстве имен qrouter-<ID_МАРШРУТИЗАТОРА> на вычислительном узле:

    • Сетевой интерфейс rfp-<ID_МАРШРУТИЗАТОРА> для перемещения пакетов между пространствами имен qrouter-<ID_МАРШРУТИЗАТОРА> на вычислительном узле и fip-<ID_ВНЕШНЕЙ_СЕТИ>:

      # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> ip a...2: rfp-<ID_МАРШРУТИЗАТОРА>@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UP group default qlen 1000link/ether <MAC-АДРЕС_RFP> brd ff:ff:ff:ff:ff link-netns fip-<ID_ВНЕШНЕЙ_СЕТИ>inet 169.254.88.134/31 scope global rfp-<ID_МАРШРУТИЗАТОРА>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_lft forever preferred_lft forever...
    • Iptables-правила NAT для порта ВМ для Floating IP-адреса:

      # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> iptables -t nat -S-P PREROUTING ACCEPT...-P POSTROUTING ACCEPT...-N neutron-l3-agent-POSTROUTING-N neutron-l3-agent-PREROUTING-N neutron-l3-agent-float-snat-N neutron-l3-agent-snat-N neutron-postrouting-bottom-A PREROUTING -j neutron-l3-agent-PREROUTING...-A POSTROUTING -j neutron-l3-agent-POSTROUTING-A POSTROUTING -j neutron-postrouting-bottom-A neutron-l3-agent-POSTROUTING ! -i rfp-<ID_МАРШРУТИЗАТОРА> ! -o rfp-<ID_МАРШРУТИЗАТОРА> -m conntrack ! --ctstate DNAT -j ACCEPT...-A neutron-l3-agent-PREROUTING -d <FLOATING_IP-АДРЕС_ВМ> -i rfp-<ID_МАРШРУТИЗАТОРА> -j DNAT --to-destination <IP-АДРЕС_ВМ>-A neutron-l3-agent-float-snat -s <IP-АДРЕС_ВМ> -j SNAT --to-source <FLOATING_IP-АДРЕС_ВМ>-A neutron-l3-agent-snat -j neutron-l3-agent-float-snat-A neutron-postrouting-bottom -m comment --comment "Perform source NAT on outgoing traffic." -j neutron-l3-agent-snat

      Здесь:

      • -d <FLOATING_IP-АДРЕС_ВМ> -i rfp-<ID_МАРШРУТИЗАТОРА> -j DNAT --to-destination <IP-АДРЕС_ВМ> — правило перенаправления трафика, входящего на Floating IP-адрес. Трафик, пришедший через интерфейс rfp-, будет перенаправлен на внутренний IP-адрес ВМ (DNAT).
      • -s <IP-АДРЕС_ВМ> -j SNAT --to-source <FLOATING_IP-АДРЕС_ВМ> — правило, которое для исходящего от ВМ трафика подменяет Source IP на Floating IP-адрес.

      Эти правила не ограничивают порты — перенаправление работает для всех портов одинаково.

Интерфейсы rfp- и fpr- обеспечивают point-to-point связь между пространствами имен qrouter-<ID_МАРШРУТИЗАТОРА> и fip-<ID_ВНЕШНЕЙ_СЕТИ>. Эта связь нужна, потому что эти пространства находятся на разных VLAN ID:

# ovs-vsctl show | grep -A 1 -e fg-<ID_ПОРТА_FIP_AGENT_GW> -e qr-<ID_ПОРТА_ROUTER_INTERFACE>        Port qr-<ID_ПОРТА_ROUTER_INTERFACE>            tag: 2            Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>                type: internal--        Port fg-<ID_ПОРТА_FIP_AGENT_GW>            tag: 1            Interface fg-<ID_ПОРТА_FIP_AGENT_GW>                type: internal

Путь входящего FIP-трафика: внешняя сеть → fip-<ID_ВНЕШНЕЙ_СЕТИ> (интерфейс fg-) → fpr-/rfp-qrouter-<ID_МАРШРУТИЗАТОРА> (DNAT: внешний IP → внутренний IP ВМ) → ВМ.

Путь исходящего FIP-трафика от ВМ: ВМ → qrouter-<ID_МАРШРУТИЗАТОРА> (SNAT: внутренний IP → Floating IP-адрес) → внешняя сеть. При этом пространство имен fip-<ID_ВНЕШНЕЙ_СЕТИ> в исходящем трафике не участвует — ВМ выходит во внешнюю сеть через qrouter-<ID_МАРШРУТИЗАТОРА>, где IP-адрес источника подменяется не на IP-адрес маршрутизатора, а на Floating IP-адрес.

Metadata-агент

Metadata-агент (neutron-metadata-agent) доставляет на ВМ метаданные, которые используются при ее запуске: SSH-ключи, имя узла, пользовательские скрипты и прочее.

Metadata-агент не создает собственного сетевого пространства имен, а использует пространство qrouter-<ID_МАРШРУТИЗАТОРА>, созданное L3-агентом. В нем Metadata-агент:

  • Добавляет Iptables-правило, которое перенаправляет запросы к 169.254.169.254:80 на порт 127.0.0.1:9697:

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> iptables -t nat -S...-N neutron-l3-agent-PREROUTING...-A PREROUTING -j neutron-l3-agent-PREROUTING...-A neutron-l3-agent-PREROUTING -d 169.254.169.254/32 -i qr-+ -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 9697
  • Запускает proxy-сервис:

    # ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> netstat -nltpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nametcp        0      0 0.0.0.0:9697            0.0.0.0:*               LISTEN      <PID>/python3# ps aux | grep <PID>neutron   <PID>  0.0  0.2 332208 76352 ?        S    Jan29   0:01 /usr/bin/python3 /bin/neutron-ns-metadata-proxy --pid_file=/var/lib/neutron/external/pids/<ID_МАРШРУТИЗАТОРА>.pid --metadata_proxy_socket=/var/lib/neutron/metadata_proxy --router_id=<ID_МАРШРУТИЗАТОРА> --state_path=/var/lib/neutron --metadata_port=9697 --metadata_proxy_user=984 --metadata_proxy_group=983 --use-syslog --syslog-log-facility=LOG_USER

Proxy-сервис neutron-ns-metadata-proxy доставляет запрос на вычислительный узел в сервис nova-api через управляющую сеть и Private HAProxy:

# netstat -nltp | grep :9697tcp        0      0 <IP_УЗЛА1>:9697          0.0.0.0:*               LISTEN      <PID>/haproxytcp        0      0 <IP_УЗЛА2>:9697          0.0.0.0:*               LISTEN      <PID>/haproxytcp        0      0 <IP_УЗЛА3>:9697          0.0.0.0:*               LISTEN      <PID>/haproxy

Metadata-агент также располагается на вычислительных узлах для разгрузки сервисов на сетевом или управляющем узле. Архитектура на вычислительном узле полностью аналогичная:

# ip netns exec qrouter-<ID_МАРШРУТИЗАТОРА> netstat -nltpActive Internet connections (only servers)Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program nametcp        0      0 0.0.0.0:9697            0.0.0.0:*               LISTEN      <PID>/python3
Была ли статья полезна?