# 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
.