# ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0 src 5.6.7.8
и вопрос состоит в том, как он знает, что адрес является передачей любому из узлов? (который, по-видимому, верен).
ОБНОВЛЕННЫЙ:
Существующий как маршрут передачи любому из узлов:
root@hv2 ~ # ip route get 1.2.3.4
anycast 1.2.3.4 dev eth0 src 5.6.7.8
cache
но не видимый в списке:
root@hv2 ~ # ip route list|grep 1.2.3.4|wc -l
0
но возможно удалить его, и, чем он назад к нормальному (нет anycast
больше):
root@hv2 ~ # ip route del anycast 1.2.3.4 dev eth0
root@hv2 ~ # ip route get 1.2.3.4
1.2.3.4 via 5.6.7.8 dev eth0 src 9.10.11.12
cache
Если вы посмотрите на iproute2 gitweb, то увидите, что он показывает статус бита RTN_ANYCAST
, установленного в структуре маршрутизации ядра. Если вы сделаете перекрёстную ссылку на источник ядра (rtnetlink.h), то увидите следующий комментарий:
RTN_ANYCAST, /* Accept locally as broadcast,
but send as unicast */
Если вы посмотрите страницу руководства, то увидите, что статус anycast адреса определяется конфигурацией (в частности, добавление ключевого слова anycast
, когда вы указываете добавляемый адрес). Согласно man 8 ip
:
IFADDR := PREFIX | ADDR peer PREFIX [ broadcast ADDR ] [ anycast ADDR ]
[ label STRING ] [ scope SCOPE-ID ]
...
anycast - _not implemented_ the destinations are anycast
addresses assigned to this host. They are mainly equivalent to
local with one difference: such addresses are invalid when used
as the source address of any packet.
В первой части руководства говорится, что когда вы указываете адрес, вы можете указать стеку, что это адрес anycast. Не проверяя исходный код кернела, я полагаю, что при добавлении адреса anycast, бит anycast передаётся в соответствующую запись таблицы маршрутизации, которая будет создана при добавлении адреса.
Я не уверен, что часть "не реализован" полностью корректна, так как выглядит так, будто iproute2 действительно передаёт флаги anycast в системные вызовы. Так что похоже, что если anycast поддерживается кернелом, то он должен работать. Но я не тестировал его, так что не знаю об этом.
. Из man-страницы для ip-маршрута
, в разделе "ip route get":
Обратите внимание, что эта операция не эквивалентна ip route show. показывает существующие маршруты. получает их разрешение и создает новые клоны, если необходимый. По сути, получение эквивалентно отправке пакета с собой. этот путь
Вы можете показать маршруты anycast с помощью команды ip route show type anycast
.