Как отправлять многоадресные пакеты через специальный интерфейс в Linux - PullRequest
6 голосов
/ 23 июля 2011

Перепробовав все возможные способы, не смог обойти эту проблему. У меня есть машина с двумя интерфейсами eth0 и eth2. Я хочу, чтобы все пакеты ff38: 40: 2001: dead: beef: cafe :: / 96 отправлялись на eth2. Я попробовал все следующее, но когда я делаю ping6 ff38: 40: 2001: dead: beef: cafe :: 1, пакеты всегда идут на eth0. Вещи, которые я пробовал и не работал (то есть, пакет все еще выходит на eth0).

$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 gw 2003::100 dev eth2
$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 dev eth2
$> route add --inet6 ff38:40:2001:dead:beef:cafe::/96 metric 1 gw 2003::100 dev eth2

Моя таблица маршрутизации

[root@dev ~]# route --inet6  |grep eth0
fe80::/64                                   *                                       U     256    0        0 eth0
ff00::/8                                    *                                       U     256    0        0 eth0

[root@dev ~]# route --inet6  |grep eth2
2003::/64                                   *                                       U     256    68       0 eth2
fe80::/64                                   *                                       U     256    0        0 eth2
ff38:40:2001:dead:beef:cafe::/96            2003::100                               UG    1      0        0 eth2
*/0                                         fe80::c671:feff:fe14:e482               UGDA  1024   0        0 eth2
ff00::/8                                    *                                       U     256    0        0 eth2

Тем не менее, ping6 ff38: 40: 2001: dead: beef: cafe :: 1 -I eth2 работает просто отлично. Более того, я вижу эту проблему только на компьютерах с Linux (MAC в порядке).

[root@dev ~]# ping6 ff38:40:2001:dead:beef:cafe::1 -I eth2
PING ff38:40:2001:dead:beef:cafe::1(ff38:40:2001:dead:beef:cafe:0:1) from cal eth2: 56 data bytes
64 bytes from 2012::1: icmp_seq=0 ttl=253 time=19.1 ms
64 bytes from 2012::1: icmp_seq=1 ttl=253 time=2.16 ms
64 bytes from 2012::1: icmp_seq=2 ttl=253 time=2.14 ms
64 bytes from 2012::1: icmp_seq=3 ttl=253 time=2.26 ms
64 bytes from 2012::1: icmp_seq=4 ttl=253 time=2.08 ms
64 bytes from 2012::1: icmp_seq=5 ttl=253 time=2.15 ms

root@dev ~]# uname -a
Linux 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

Возможно, проблема связана с тем, что для eth0 существует ff00 :: / 8. Как мне отменить этот маршрут. Я также не могу удалить маршрут ff00 :: / 8.

Ответы [ 2 ]

13 голосов
/ 31 октября 2012

Я не совсем уверен, что мое решение верное, но я могу хотя бы пролить немного света на происходящее.

Фон

На самом деле в Linux есть несколько таблиц маршрутизации, и они ищутся по одной в определенном порядке приоритетов, пока не будет найдена таблица с соответствующим маршрутом. При желании вы можете искать в некоторых таблицах маршрутизации на основе адреса источника или протокола; см. справочную страницу ip-rule(8).

Проблема в том, что «локальная» таблица маршрутизации имеет приоритет 0, максимально возможный. «Локальная» таблица заполняется ядром автоматически и содержит «очевидный» интерфейс и широковещательные маршруты. Для IPv6 под Linux это, очевидно, включает весь многоадресный блок.

Проблема

Я собираюсь использовать инструмент iproute2 , а не более традиционный route, потому что он покажет мне все, что мне нужно знать.

На моем компьютере с Linux:

$ ip -6 route show table local
local ::1 via :: dev lo  proto none  metric 0 
local fe80::213:a9ff:fe91:5bcb via :: dev lo  proto none  metric 0 
local fe80::250:b6ff:fe44:37d1 via :: dev lo  proto none  metric 0 
ff00::/8 dev eth0  metric 256 
ff00::/8 dev eth1  metric 256

$ ip -6 route show table main
fe80::/64 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth1  proto kernel  metric 256 
ff15::/16 dev eth1  metric 1024
ff00::/8 dev eth1  metric 1024 

$ ip -6 rule show
0:      from all lookup local 
32766:  from all lookup main 

... И мои многоадресные пакеты для ff15 :: 1 (5 == site-local,> link-local) заканчиваются на eth0, потому что "локальная" таблица маршрутизации соответствует первой и переопределяет "главную" таблицу, хотя «главная» таблица имеет более конкретный маршрут. Такое поведение переопределения является правильным в большей схеме маршрутизации политики, но выбор автоматического добавления ff00 :: / 8 в локальную таблицу вызывает у меня сомнения.

Мое решение

У меня недостаточно опыта, чтобы понять, хорошая ли это идея, но:

# ip -6 route add ff15::/16 dev eth1 table local

и теперь мои пакеты ff15 :: 1 маршрутизируются через eth1.

Это в некоторой степени согласуется с семантикой локальной таблицы в том смысле, что она направляется непосредственно через устройство. Это не совсем правильно (учитывая автоматическое управление и «вам не нужно смотреть на эту таблицу»), но это лучшее решение, которое я нашел.

0 голосов
/ 13 марта 2019

Multicast по своей сути является локальной ссылкой «широковещание». Таким образом, вы должны всегда указывать зону или сетевой интерфейс, в который она отправлена. Там нет маршрутизации. Если у вас есть несколько интерфейсов, вы должны отправить его на несколько интерфейсов. Способ сделать это: ping (6) ip% zone. Теперь в этой же сети может быть маршрутизатор, который принимает пакеты и может переадресовывать их в другую зону, если какой-то узел в другой зоне подписан на этот адрес, и TTL пакета> 1. Не задействованы таблицы маршрутизации. в многоадресной маршрутизации, за исключением многоадресных маршрутизаторов.

Поскольку этот первоначальный вопрос был с 2012 года, примерно в это время пространство ядра пользователя было исправлено, чтобы запретить отправку многоадресного пакета без идентификатора зоны. Таким образом, ping6 в исходном вопросе даже не сработает.

Ситуация для IPv4 является ужасной, поскольку сложно привязать к определенному интерфейсу для исходящей многоадресной рассылки, если только программное обеспечение не было правильно реализовано.

...