Назад | Перейти на главную страницу

Невозможно изменить исходный IP-адрес (на плавающий IP-адрес) для исходящих пакетов udp

Мне не удается заставить кластер работать с помощью кардиостимулятора и corosync. Вот моя конфигурация оборудования:

Эта сеть защищена брандмауэром.

У меня есть два ресурса, которые общаются с внешними устройствами через UDP:

Команда кардиостимулятора, которую я использовал:

crm configure primitive res1-srv upstart:resource1 \
op monitor interval=10s timeout=120 on-fail="restart" \
meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true

crm configure primitive res2-srv upstart:resource2 \
op monitor interval=10s timeout=120 on-fail="restart" \
meta is-managed="true" failure-timeout=300 migration-threshold=5 allow-migrate=true

resource1 и resource2 не связаны друг с другом, и должен быть только один активный экземпляр каждого из них в кластере (либо на node1, либо на node2).

Я создал 2 плавающих IP-адреса, по одному для каждого процесса:

Я сделал это с помощью:

crm configure primitive res1-ipin ocf:heartbeat:IPaddr2 \
params ip="192.168.3.130" cidr_netmask="24" op monitor interval="10s" meta is-managed="true"

crm configure primitive res2-ipin ocf:heartbeat:IPaddr2 \
params ip="192.168.3.131" cidr_netmask="24" op monitor interval="10s" meta is-managed="true"

На межсетевом экране администратор настроил 2 правила NAT:

Я сделал группу для каждого из них:

crm configure group resource1 res1-ipin res1-srv
crm configure group resource2 res2-ipin res2-srv

Таким образом, я могу разместить каждый ресурс в разных узлах. Кардиостимулятор без проблем управляет этими ресурсами.

Входящие udp пакеты работают отлично, оба ресурса их обрабатывают без проблем.

Однако исходящие пакеты udp не проходят брандмауэр, потому что исходный IP-адрес является статическим для узла. Вот пример:

Оба они заблокированы межсетевым экраном. И у меня нет прав на настройку новых правил в брандмауэре (я не могу попросить администратора настроить их, он утверждает, что брандмауэр не позволяет этого).

Я попытался настроить NAT на каждом узле с помощью iptables:

iptables -t nat -A POSTROUTING -p udp --sport 16500 -j SNAT --to-source 192.168.3.130:16500
iptables -t nat -A POSTROUTING -p udp --sport 16501 -j SNAT --to-source 192.168.3.131:16501

Когда я это сделал, ресурсы resource1 и resource2 записывают в свои журналы, что они не могут отправить пакет:

Client ERROR *** Terminal nro:XXX writing 1Operation not permitted

Я не знаю что делать Я также попытался добавить ресурс ocf: heartbeat: IPsrcaddr, но он вылетел:

IPsrcaddr[6200]: ERROR: command 'ip route replace 192.168.3.0/24 dev eth0 src 192.168.3.130' failed

Я понимаю, что использование двух плавающих IP-адресов бесполезно.

Если кто-нибудь может указать мне, что я делаю не так, буду очень признателен.

заранее спасибо

Попробуй это.

vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr

удалять

NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^  ]*'`

и замените его на

NETWORK=`ip route list dev $INTERFACE scope link match $ipaddress|grep -o '^[^ ]*'|head -1`

В IPsrcaddr агент ресурсов должен работать для этого. Настроить IPsrcaddr ресурсы, как показано ниже:

# crm configure
crm(live)configure# primitive res1_srcaddr IPsrcaddr \
    params ipaddress=192.168.3.130
crm(live)configure# primitive res2_srcaddr IPsrcaddr \
    params ipaddress=192.168.3.131

Затем перейдите в свой редактор и добавьте новые ресурсы IPsrcaddr в соответствующие группы ПОСЛЕ ресурсов IPaddr2:

crm(live)configure# edit
...snip...
group resource1 res1-ipin res1_srcaddr res1-srv
group resource2 res2-ipin res2_srcaddr res2-srv
...snip...
crm(live)configure# verify
crm(live)configure# commit

Если вы все еще видите ошибку, относящуюся к IPsrcaddr, вы можете попробовать запустить команду вручную, чтобы лучше понять, почему она не работает.

Вы даже можете попробовать изменить IPsrcaddr агент ресурсов, который лучше подходит для ваших узлов; это относительно простой агент ресурсов:

# vi /usr/lib/ocf/resource.d/heartbeat/IPsrcaddr