вторник, 9 июля 2013 г.

send_arp, arping и быстрая миграция ip-адреса (IPv4)

Для того чтобы быстро мигрировать IP-адрес с сервера на сервер нужно сообщить коммутатору о необходимости изменения arp-таблицы. Наиболее простой способ без прямого взаимодействия с коммутатором (т.е. законнектиться по ssh на коммутатор и почистить ручками arp) - воспользоваться утилитами send_arp или arping. В Debian и Ubuntu пакеты называются соответственно fake и arping. С помощью них можно достаточно просто формировать и отравлять arp-запросы. arping является более простой утилитой нежели send_arp, в то время как вторая является более низкоуровневой утилитой для точного формирования arp-пакета. Для работы я предпочёл именно send_arp, т.к. она предоставляет больший контроль и не делает лишних операций.
Сама процедура миграции IP-адреса выглядит следующим образом:
  1. убираем IP-адрес на первом сервере (ip addr del x.x.x.x/yy dev ethX)
  2. поднимаем IP-адрес на втором сервере (ip addr add x.x.x.x/yy dev ethX)
  3. со второго сервера отправляем несколько специально сформированных arp-запросов
Собственно вот так выглядит команда для отправки arp-запроса с помощью send_arp:
# IP=x.x.x.x
# send_arp $IP `cat /sys/class/net/ethX/address` $IP `cat /sys/class/net/ethX/broadcast`

Суть команды: отправляем широковещательные arp-запросы самому себе (src ip = dest ip)

Для надёжности лучше отправить несколько запросов.

Ежели ваш выбор пал на arping, то выглядеть команда будет так:
# arping -U

P.S. В составе pacemaker также есть утилита send_arp, но она лежит вне $PATH, имеет другой синтаксис и используется в ресурс-агентах, каким-либо образом управляющих IP-адресами (например, ocf::heartbeat:IPaddr2)

P.P.S. Для IPv6 используются т.н. анонсы, но как правильно их отправлять - пока не разобрался (есть утилита ndsend, но она находится в пакете vzctl, который как-то совсем нет желания ставить на сервер), буду рад если напишут в комментариях :)