Сетевые агенты и их пространства имен
Сетевые агенты Neutron реализуют сетевую конфигурацию, которую пользователи создают через Портал самообслуживания или OpenStack CLI. Агенты создают сетевые интерфейсы, обеспечивают их изоляцию, разворачивают DHCP, NAT и другие сервисы.
Обзор сетевых агентов Neutron приведен в таблице 1.
Агент | Расположение | Обслуживаемые порты ( | Пространство имен |
|---|---|---|---|
| Управляющие, сетевые и вычислительные узлы | Все | |
| Сетевой или управляющий узел |
|
|
| Сетевой или управляющий узел |
|
|
|
| ||
|
| ||
Вычислительный узел |
|
| |
|
| ||
|
| ||
| Сетевой или управляющий, вычислительный узел |
|
Чтобы получить список всех сетевых агентов в инсталляции:
# openstack network agent list
Общий принцип работы агентов:
- Пользователь или администратор VK Private Cloud создает порт.
- Neutron создает порт с назначенными ID, IP-адресом, MAC-адресом и прочими настройками.
- Настройки поступают на соответствующие агенты: DHCP-настройки — на DHCP-агент, маршрутизация — на L3-агент и т.д. Сервис
nova-computeпередает в Libvirt порт ВМ. - Целевой агент создает сетевое пространство имен (
ip netns) для изоляции настроек от сетевых настроек узла и от других пространств имен. - Целевой агент создает сетевой интерфейс в своем пространстве имен и назначает ему IP-адрес, MAC-адрес, MTU и другие параметры.
- Целевой агент запускает необходимые сервисы в пространстве имен: например, DHCP-агент разворачивает
dnsmasq, а L3-агент настраивает Iptables. - Open vSwitch Agent подключает созданный интерфейс к мосту
br-intи назначает ему VLAN ID.
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-агент (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 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope hostvalid_lft forever preferred_lft forever11: tap<ID_ПОРТА_DHCP>: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1350 qdisc noqueue state UNKNOWN group default qlen 1000link/ether <MAC-АДРЕС_ПОРТА_DHCP> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_ПОРТА_DHCP> brd scope global tap<ID_ПОРТА_DHCP>valid_lft forever preferred_lft foreverinet 169.254.169.254/16 brd 169.254.255.255 scope global tap<ID_ПОРТА_DHCP>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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-агент (neutron-l3-agent) организует маршрутизацию и NAT. Располагается на сетевых или управляющих узлах и на вычислительных узлах.
На сетевых или управляющих узлах агент обслуживает:
- SNAT-порт (
network:router_centralized_snat); - порт виртуального маршрутизатора Router Gateway во внешнюю сеть (
network:router_gateway); - порт виртуального маршрутизатора Router Interface во внутреннюю сеть (
network:router_interface_distributed).
На вычислительных узлах агент обслуживает:
- порт Floating IP Agent Gateway (
network:floatingip_agent_gateway); - порт ВМ для Floating IP-адреса (
network:floatingip); - порт виртуального маршрутизатора Router Interface во внутреннюю сеть (
network:router_interface_distributed) через технологию DVR.
События, которые вызывают L3-агента для создания или дополнения пространства имен:
- подключение виртуального маршрутизатора к внешней сети;
- подключение виртуального маршрутизатора к внутренней сети;
- подключение ВМ к внутренней сети с маршрутизатором;
- привязка Floating IP-адреса к ВМ.
При подключении виртуального маршрутизатора к внешней сети 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 1000link/ether <MAC-АДРЕС_ПОРТА_ROUTER_GATEWAY> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_ПОРТА_ROUTER_GATEWAY> brd scope global qg-<ID_ПОРТА_ROUTER_GATEWAY>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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 1000link/ether <MAC-АДРЕС_SNAT-ПОРТА> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_SNAT-ПОРТА> brd scope global sg-<ID_SNAT-ПОРТА>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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 1000link/ether <MAC-АДРЕС> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_ПОРТА_ROUTER_INTERFACE> brd scope global qr-<ID_ПОРТА_ROUTER_INTERFACE>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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 1000link/ether <MAC-АДРЕС> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_ПОРТА_ROUTER_INTERFACE> brd scope global qr-<ID_ПОРТА_ROUTER_INTERFACE>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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: 2Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>type: internal -
на сетевом или управляющем узле:
# ovs-vsctl show | grep -A 1 qr-<ID_ПОРТА_ROUTER_INTERFACE>Port qr-<ID_ПОРТА_ROUTER_INTERFACE>tag: 4Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>type: internal
При привязке Floating IP-адреса к ВМ:
-
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 1000link/ether <MAC-АДРЕС_ПОРТА_FIP_AGENT_GW> brd ff:ff:ff:ff:ff:ffinet <IP-АДРЕС_FIP_AGENT_GW> brd scope global fg-<ID_ПОРТА_FIP_AGENT_GW>valid_lft forever preferred_lft foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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 1000link/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 foreverinet6 fe80::<MAC-АДРЕС>/64 scope linkvalid_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
-
-
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: 2Interface qr-<ID_ПОРТА_ROUTER_INTERFACE>type: internal--Port fg-<ID_ПОРТА_FIP_AGENT_GW>tag: 1Interface 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-агент (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