Невозможно изменить исходный 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