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

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

  • Сеть: 192.168.3.0/255.255.255.0
  • Шлюз: 192.168.3.1
  • node1 (Ubuntu Server 12.04 x64) Статический IP: 192.168.3.34
  • node2 (Ubuntu Server 12.04 x64) Статический IP: 192.168.3.35

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

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

  • resource1 -> порт udp 16500
  • resource2 -> порт udp 16501

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

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 не связаны друг с другом, и в кластере должен быть только один активный экземпляр каждого из них (либо на узле 1, либо на узле 2).

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

  • res1-ipin -> 192.168.3.130
  • res2-ipin -> 192.168.3.131

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

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:

  • [ОБЩЕСТВЕННЫЙ IP]:16500 -> 192.168.3.130:16500
  • [ОБЩЕСТВЕННЫЙ IP]:16501 -> 192.168.3.130:16501

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

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

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

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

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

  • resource1 работает на node1 -> исходящий IP-адрес и порт 192.168.3.34:16500
  • resource2 работает на node2 -> исходящий IP-адрес и порт 192.168.3.35:16501

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

Я попытался настроить 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-адресов не поможет.

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

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

2 ответа

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

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
Другие вопросы по тегам