Я пытаюсь создать два избыточных балансировщика нагрузки с прямым выходом (используя IPVS или NGINX), но сначала я пытаюсь заставить плавающий виртуальный IP-адрес VRRP / mac работать должным образом, прежде чем двигаться дальше по процессу.
У меня есть стандартная виртуальная машина Ubuntu 16.04 на VMware vSphere 6 с последними обновлениями. ВМ находится в группе портов DvSwitch с включенным неразборчивым режимом, изменением MAC-адреса и поддельной передачей. Виртуальная машина использует VMXNET3 для сетевой карты. Я использую стандартный keepalived в репо.
keepalived/xenial-updates,now 1:1.2.19-1ubuntu0.1 amd64 [installed]
Я пытаюсь использовать следующую конфигурацию для поддержки активности ...
root@lb1:~# cat /etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface ens192
virtual_router_id 150
priority 150
use_vmac vrrp150
vmac_xmit_base
advert_int 1
virtual_ipaddress {
10.0.4.55
}
}
При первоначальной настройке на эхо-запросы к интерфейсу macvlan (vrrp150) ARP отвечает MAC родительского интерфейса (что плохо по нескольким причинам). Я попытался использовать множество различных комбинаций настроек net.ipv4.conf, выложенных в Интернете, все они, похоже, полностью нарушают ARP для интерфейса macvlan. Насколько мне известно, iptables и ufw полностью отключены, а tcpdump показывает следующее ...
root@lb1:~# tcpdump -s0 -i vrrp150
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on vrrp150, link-type EN10MB (Ethernet), capture size 262144 bytes
10:05:19.271979 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:20.215301 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:21.215474 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:22.219300 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:23.215514 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:24.223971 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
10:05:25.224262 ARP, Request who-has 10.0.4.55 tell 10.0.4.31, length 46
Таким образом, запросы ARP действительно попадают в правильный интерфейс. Я попытался использовать неразборчивый режим на физическом интерфейсе, но это не имеет значения (и запросы ARP все равно попадают туда).
Как я могу заставить виртуальный интерфейс macvlan keepalived правильно отвечать на ARP с виртуальным MAC-адресом, чтобы можно было перенаправлять трафик? Я пытаюсь получить ту же комбинацию виртуального IP / MAC, которая будет использоваться между MASTER> BACKUP во время переходов, чтобы таблицы ARP не влияли на какие-либо брандмауэры восходящего потока (GARP не является надежным / не соблюдается, а переключение при отказе должно быть быстрым и максимально плавным) .
Я решил свою проблему ... для любопытных, вот подробности.
Во-первых, не забудьте внимательно проверить свои sysctls, так как в Ubuntu некоторые из них включены по умолчанию, а именно проверки RP.
sysctl -a | grep net.ipv4.conf.*
Вы можете быть удивлены тем, что здесь найдете.
В Ubuntu 16.04 установите следующее в /etc/sysctl.conf ...
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.ens192.rp_filter = 0
net.ipv4.conf.vrrp150.rp_filter = 0
Поскольку в sysctl установлены значения RP по умолчанию, вам нужно будет сделать это на уровне «все», а также на каждом интерфейсе (как показано здесь).
Выполните следующие действия, чтобы активировать его вживую (или просто перезагрузите).
sysctl -p
Во-вторых, убедитесь, что настройки DvSwitch верны (опять же, как указано выше, в группе портов должен быть включен неразборчивый режим, изменение MAC-адреса и поддельные передачи). Это не обязательно должна быть та же группа портов, что и у остальных ваших виртуальных машин, даже если они находятся в той же VLAN. Это помогает поддерживать максимальную безопасность на других ваших виртуальных машинах, предоставляя дополнительный трафик только тем виртуальным машинам, которые в нем абсолютно нуждаются.
Если они находятся на одном хосте, даже если они находятся в разных группах портов виртуальных машин на DvSwitch, этот трафик будет коммутироваться локально на vSwitch внутри хоста, никогда не выходя из порта восходящей связи.
Для истинных параноиков вы можете запустить совершенно другой DvSwitch с другими восходящими каналами (если у вас их много) и отдельной VLAN для них (обрезанной на физическом коммутаторе). Это гарантирует, что они полностью контейнеризированы и не увидят никакого другого трафика, кроме трафика, который они должны видеть.
Если вы используете многоадресную рассылку по умолчанию с keepalived и имеете несколько портов восходящей связи на DvSwitch, которым они назначены (что является наилучшей практикой), обязательно установите ...
Advanced Settings > Net > Net.ReversePathFwdCheckPromisc to 1 on each host
для предотвращения зацикливания многоадресного трафика обратно на хост (аналогично https://doc.pfsense.org/index.php/CARP_Configuration_Troubleshooting).
Это можно не указывать при использовании unicast_peer
в вашей конфигурации keepalived.