IP маршрут добирается, распознает адрес, как передано одному из узлов

# 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 
2
задан 17 July 2014 в 20:39
2 ответа

Если вы посмотрите на 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 поддерживается кернелом, то он должен работать. Но я не тестировал его, так что не знаю об этом.

.
4
ответ дан 3 December 2019 в 09:36

Из man-страницы для ip-маршрута, в разделе "ip route get":

Обратите внимание, что эта операция не эквивалентна ip route show. показывает существующие маршруты. получает их разрешение и создает новые клоны, если необходимый. По сути, получение эквивалентно отправке пакета с собой. этот путь

Вы можете показать маршруты anycast с помощью команды ip route show type anycast.

.
1
ответ дан 3 December 2019 в 09:36

Теги

Похожие вопросы