Назад | Перейти на главную страницу

ip route get распознает адрес как anycast

# 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 ключевое слово при указании добавляемого адреса). В соответствии с 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 передается в соответствующую запись в таблице маршрутизации, которая будет создана при добавлении адреса.

Я не уверен, что часть «не реализована» полностью верна, потому что похоже, что iproute2 действительно передает флаги anycast в системные вызовы. Похоже, что если ядро ​​поддерживает anycast, оно должно работать. Но я его не тестировал, поэтому не знаю об этом.

На странице руководства для ip-routeв разделе "ip route get":

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

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