Моя машина Centos имеет настраиваемую таблицу маршрутизации foo_table
содержащий только маршрут шлюза по умолчанию:
# ip route add default via 10.0.2.1 table foo_table
# ip route show table foo_table
default via 10.0.2.1 dev bond0.2
Правило политики направляет весь трафик из 10.0.2.22, используя эту таблицу:
# ip rule show
0: from all lookup local
32765: from 10.0.2.22 lookup foo_table
32766: from all lookup main
32767: from all lookup default
Когда я отслеживаю маршрут с машины Centos 10.0.2.22 на другую машину в той же локальной подсети, пакет сначала направляется на маршрутизатор, а затем на сервер:
# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
1 10.0.2.1 3.573 ms 3.972 ms 4.219 ms
2 10.0.2.60 1.461 ms 1.494 ms 1.700 ms
Естественно, я бы хотел, чтобы локальный трафик не задействовал без надобности такой маршрутизатор.
в main
таблица маршрутизации, конечно, есть маршрут области связи для локальной подсети:
10.0.2.0/24 dev bond0.2 proto kernel scope link src 10.0.2.22
Я так понимаю, потому что foo_table
консультируется перед main
(согласно ip rule show
), маршрут по умолчанию через 10.0.2.1 в foo_table
вместо этого используется, даже если местом назначения является локальный адрес ссылки.
Означает ли это, что я должен добавить маршрут области действия ссылки в foo_table
также?
# ip route add 10.0.2.0/24 dev bond0.2 scope link table foo_table
# ip route show table foo_table
10.0.2.0/24 dev bond0.2 scope link
default via 10.0.2.1 dev bond0.2
Похоже, что проблема решена, но правильно ли это?
# traceroute -In 10.0.2.60
traceroute to 10.0.2.60 (10.0.2.60), 30 hops max, 60 byte packets
1 10.0.2.60 0.339 ms 0.355 ms 0.399 ms
Правильно ли я понимаю, что происходит? (У меня минимальный опыт маршрутизации.)
Вы знаете, в чем цель foo_table
является? Мне кажется, что его эффект заключается в маршрутизации всего трафика с интерфейса 10.0.2.22 (в том числе в локальную подсеть) через маршрутизатор, что, по вашему мнению, вам не нужно. Какое содержание /etc/iproute2/rt_tables
? Вы также не говорите, какой маршрут по умолчанию находится в main
стол.
Чтобы этого избежать, добавьте маршрут подсети в foo_table
как вы предлагаете, или просто удалите правило:
ip rule del from 10.0.2.22 lookup foo_table
Насколько я знаю, вам не нужно указывать scope link
добавить маршрут подсети к foo_table
, просто
ip route add 10.0.2.0/24 dev bond0.2 table foo_table
поскольку вы все равно указываете префикс, соответствующий ссылке. Возможно, я неправильно понял.
((Кстати, полагаю default
маршрут в основной таблице можно перенести в default
таблица для простоты, но default
по соглашению кажется пустым, возможно, потому что маршрут по умолчанию зависит от настроенного интерфейса.))
Для всех, кто сталкивался с этим, я нашел ответ на аналогичный вопрос на родном сайте: https://unix.stackexchange.com/questions/27850/routing-tables-and-default-routes
В общем, вы увидите два правила (как минимум) в своей таблице маршрутизации для большинства разновидностей * nix.
У вас будет маршрут к вашей локальной сети (в этом примере 10.11.12.0/24):
10.11.12.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
И один, определяющий ваш маршрут по умолчанию.
0.0.0.0 10.11.12.1 0.0.0.0 UG 0 0 0 eth0
Итак, что это эффективно сообщает вашему ядру, так это:
отправлять любые пакеты, идущие в
10.11.12.0/24
out eth0, напрямую, без конкретной отправки их на маршрутизатор по умолчанию (флаги: U = route is UP)отправлять любые пакеты на любой адрес, кроме локальной сети (0.0.0.0 соответствует чему угодно) на шлюз (10.11.12.1) (флаги: U = route is Up, G = gateway).
Если у вас больше интерфейсов, или вы многосетевой, или если у вас настроены определенные сетевые или хост-маршруты, вы можете увидеть больше маршрутов, чем это, но это своего рода минимум, который вы будете видеть на регулярной основе.
Настраивая и вызывая интерфейс, ядро автоматически создаст этот локальный сетевой маршрут.
Вам не нужно вручную добавлять этот маршрут.