Как отправить широковещательные пакеты через интерфейс specfic в Linux -- linux поле с участием routing поле с участием ipv6 поле с участием multicast пол Связанный проблема

How to send multicast packets via a specfic interface in Linux


8
vote

проблема

русский
<Р> Перепробовав все возможные способы, не мог найти работу вокруг этой проблемы. У меня есть машина с двумя интерфейсами eth0 и eth2. Я хочу, чтобы все ff38: 40: 2001: мертвая: говядина: кафе :: / 96 пакетов, чтобы пойти на eth2. Я пробовал все следующие, но когда я ping6 ff38: 40: 2001: мертвое: говядина: кафе :: 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: мертвая: говядина: кафе :: 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   
<Р> Возможно, проблема связана с тем, что есть FF00 :: / 8 для eth0. Как отменить этот маршрут. Я не могу удалить FF00 :: / 8 маршрута, а также.
Английский оригинал

Having tried all possible ways couldn't find a work around for this problem. I have a machine with two interfaces eth0 and eth2. I want all ff38:40:2001:dead:beef:cafe::/96 packets to go on eth2. I tried all the following but when I do ping6 ff38:40:2001:dead:beef:cafe::1 the packets always goes on eth0. Things I have tried and have not worked (i.e., packet still goes out on 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 

My routing table is

[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 

However, ping6 ff38:40:2001:dead:beef:cafe::1 -I eth2 work just fine. Moreover, I see this problem only on Linux machines (MAC is fine).

[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 

Perhaps the problem has to do with the fact that there is a ff00::/8 for eth0. How do I overrule that route. I am not able to delete ff00::/8 route as well.

</div
           
   
   

Список ответов

15
 
vote
vote
Лучший ответ
 

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

фон

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

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

проблема

Я собираюсь использовать инструмент IPROTE2 , а не тем, что более традиционный <код> 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 == сайт - локальный, & gt; link-local) в конечном итоге в ETH0, потому что «локальная» таблица маршрутизации соответствует сначала и переопределяет «главный» таблица Несмотря на то, что «главный» стол имеет более конкретный маршрут. Это переопределенное поведение верно в большей схеме маршрутизации политики, но выбор автоматического добавления FF00 :: / 8 на локальную таблицу сомнительна.

Мое решение

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

 <код> # ip -6 route add ff15::/16 dev eth1 table local   

А теперь мой FF15 :: 1 пакеты направляются через eth1.

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

 

I'm not entirely convinced my solution is correct, but I can at least shed a little more light on what is going on.

Background

Linux actually has multiple routing tables, and they are searched one at a time in a specific priority order until a table with a matching route is found. You can optionally search some of the routing tables based on source address or protocol; see the ip-rule(8) man page.

The trouble is the "local" routing table, which has priority 0, the highest possible. The "local" table is populated automatically by the kernel and holds "obvious" interface and broadcast routes. For IPv6 under Linux, this apparently includes the entire multicast block.

The Problem

I'm going to be using the iproute2 tool rather than the more traditional route, because it will show me everything I need to know.

On my Linux box:

$ 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  

...And my multicast packets for ff15::1 (5==site-local, >link-local) end up on eth0, because the "local" routing table matches first and overrides the "main" table, even though the "main" table has a more specific route. This overriding behavior is correct in the greater scheme of policy routing, but the choice of auto-adding ff00::/8 to the local table is questionable to me.

My Solution

I don't have enough experience to know if this is a good idea, but:

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

and now my ff15::1 packets are routed through eth1.

This agrees somewhat with the semantics of the local table, in that it's routed directly through a device. It doesn't feel exactly right (considering automatic management and "you shouldn't have to look at this table"), but it's the best solution I've found.

</div
 
 
   
   
1
 
vote

Multicast по своей природе является локальной связью «трансляция». Как таковой вы должен всегда указывает на зону или сетевой интерфейс, к которому он отправляется. Там нет маршрутизации. Если у вас несколько интерфейсов, вы должны отправить его на несколько интерфейсов. Способ сделать это: Ping (6) IP% зона. Теперь в той же сети может быть маршрутизатор, который получает пакеты и может пересылать его в другую зону, если какой-то узел в другой зоне подписался на этот адрес, а TTL пакета IS & GT; 1. Там нет таблиц маршрутизации, участвующих в многоадресной рассылки, за исключением многоадресных маршрутизаторов.

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

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

 

Multicast is inherently a local link "broadcast". As such you must always indicate the zone or network interface it is sent to. There is no routing. If you have multiple interfaces, you should send it out to multiple interfaces. The way to do it is: ping(6) ip%zone . Now on that same network might be a router that receives the packets and might forward it to another zone, iff some node on the other zone has subscribed to that address, and the TTL of the packet is > 1. There are no routing tables involved in multicast routing, except on multicast routers.

Since this original question was from 2012, around that time user kernel space was fixed to make it illegal to send a multicast packet without a zone identifier. So the ping6 in the original question would not even work.

The situation for IPv4 is dire, since it is hard to bind to a specific interface for the outgoing multicast, unless the software used was correctly implemented.

</div
 
 

Связанный проблема

1954  Как изменить выходной цвет echo в Linux  ( How to change the output color of echo in linux ) 
Я пытаюсь распечатать текст в терминале, используя команду echo. Я хочу распечатать текст в красном цвете. Как я могу это сделать? ...

0  Python / django - Начало Apache с mod_wsgi  ( Python django starting apache with mod wsgi ) 
пытается запустить mod_wsgi. Получение опорной ошибки связанной с FMOD. <код> [root@host]# mod_wsgi-express start-server wsgi.py --port=80 > --user www...

90  Linux Процесс состояний  ( Linux process states ) 
в Linux, что происходит с состоянием процесса, когда ему нужно читать блоки с диска? Это заблокировано? Если это так, как выберите другой процесс, выбранный д...

10  Данные в SIGINFO заслуживают доверия?  ( Is the data in siginfo trustworthy ) 
Я обнаружил, что на Linux, сделав свой собственный звонок в rt_sigqueue syscall, я могу поставить все, что мне нравится в <код> si_uid и <код> si_pid / Код...

7  Утилита графического патча  ( Graphical patch utility ) 
У меня есть патч ядра для слегка другой версии ядра, то тот, который я пытаюсь исправить. Излишне говорить, что патч частично терпит неудачу. Я, безусловно, м...

0  пс -ef + fourfield от PS -ef вывода  ( Ps ef fourfield from ps ef output ) 
<Р> Я должен объяснить о четырех местах (4 или 0) ПС -ef команды, в чем смысл этого числа THX Яэль <Р> корень 27116 27112 4 15:25 PTS / 0 00:00:00 Grep -qsRw ...

1  Форматирование вывода в Python  ( Formatting output in python ) 
Это мой код: <код> import commands mount = commands.getoutput('mount -v') lines = mount.splitlines() points = map(lambda line: line.split()[2], lines) perm...

14  Прошивка на основе Linux, как реализовать хороший способ обновления?  ( Linux based firmware how to implement a good way to update ) 
Я разрабатываю прибор на основе Linux, используя Alix 2D13. У меня разработал скрипт, который заботится о создании файла изображения, создавая разделы, уста...

9  Компиляция FFMPEG 2.3 с Android NDK R10  ( Compiling ffmpeg 2 3 with android ndk r10 ) 
Я хочу компилировать FFMPEG 2.3 с Android NDK R10, следуя в этом руководстве: http://www.roman10.net/how-to-build-ffmpeg-for-android/ После получения неск...

1  Почему мой код не может создавать простое устройство ввода с помощью UINPUT?  ( Why my code is not able to create simple input device using uinput ) 
Я пытаюсь научиться использовать / dev / uinput в Linux и скопировал простой код из kernel.org/doc/html/v4.12/input/uinput.html который ниже: <код> xmln...

1  Ошибка установки Ta-lib  ( Ta lib install error ) 
Я пытаюсь установить Ta-lib на Debian Jessie, используя PIP. Однако я сталкиваюсь с следующей ошибкой: <код> #include "ta-lib/ta_defs.h" ...

0  Nginx Server не перезапускается  ( Nginx server not restarting ) 
Я использую эту это Изображение экземпляра из Google Рынок облачной платформы. Этот экземпляр из Jetware #jetware . Сервер настроен с балансировщиком н...

0  Конвертировать GNOME-HELP (YELP) XML в статический HTML с XSLT  ( Convert gnome help yelp xml to static html with xslt ) 
Некоторые из приложений GNOME на Linux используют браузер справки под названием <код> yelp . Например, Gnome-Calculator, <Код> gcalctool , имеет свои файлы сп...

20  Переименование набора файлов до 001, 002, ... на Linux  ( Renaming a set of files to 001 002 on linux ) 
Я изначально имел набор изображений формы Image_001.jpg, image_002.jpg, ... Я прошел через них и удалил несколько. Теперь я хотел бы переименовать оставшиес...

1  Функция оболочки и истории Unix  ( Unix shell and history feature ) 
Как добавить функцию истории в оболочке Unix, чтобы пользователю получить доступ к последнему введенным Команда, пользователь сможет получить доступ до 10 ком...