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

Должен ли я создавать многоадресный маршрут на RHEL / CentOS для слепого отправителя?

Система CentOS 5, похоже, не выходит из коробки с маршрутом для многоадресного трафика. Что это делает Похоже, что нужно использовать маршрут по умолчанию, если он настроен. Другими словами, таблица маршрутизации такая:

# netstat -rn
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.42.128.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0
0.0.0.0         10.42.128.1     0.0.0.0         UG        0 0          0 eth0

будет работать с моим клиентским приложением многоадресной рассылки на основе Java (или приведенным ниже тестовым примером), которое предполагает возможность отправки на локальный адрес многоадресной рассылки.

Эта установка работает. Если у меня нет маршрута по умолчанию, например

Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
10.42.128.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U         0 0          0 eth0

мое приложение Java завершится ошибкой при попытке отправки. Я могу исправить это, добавив многоадресный маршрут:

# route add -net 224.0.0.0/4 via eth0

И делать это постоянно:

# echo 224.0.0.0/4 via eth0 >>/etc/sysconfig/network-scripts/route-eth0

Должен ли я все равно создавать этот маршрут? Есть ли какой-нибудь вред в том, чтобы позволить маршруту по умолчанию обрабатывать многоадресный трафик, кроме того факта, что он перестанет работать, если маршрут по умолчанию исчезнет?


Вот небольшой тестовый пример, который можно запустить, выполнив javac Sender.java; java Sender. Он отправляет 0-байтовый пакет UDP на локальный адрес сайта 239.192.0.1. Если у меня нет маршрута по умолчанию, он не сработает с

Exception in thread "main" java.io.IOException: Network is unreachable
        at java.net.PlainDatagramSocketImpl.send(Native Method)
        at java.net.DatagramSocket.send(DatagramSocket.java:629)
        at Sender.main(MulticastSender.java:7)

Однако, если присутствует маршрут по умолчанию (или маршрут многоадресной рассылки, о котором я упоминал выше), он успешно отправит пакет на 239.192.0.1.

Sender.java

import java.net.*;

class Sender {
    public static void main(String[] args) throws Throwable {
        MulticastSocket socket = new MulticastSocket();
        InetAddress groupAddress = InetAddress.getByName("239.192.0.1");
        socket.send(new DatagramPacket(new byte[0], 0, groupAddress, 9999));
    }
}

Чтобы разобраться в этом, я создал виртуальную сеть между двумя системами. Ответ на вопрос, нужен ли маршрут 224.0.0.0/4, зависит от приложения и конфигурации сети.

Эти ответы действительны для моего приложения, которое является слепым отправителем. Он не присоединяется ни к одной многоадресной группе, потому что он не заинтересован в получении трафика - он только отправляет его в другие системы, присоединенные к группе, в которую он отправляет. Таким образом, я не оценивал требования для присоединения к какой-либо конкретной группе многоадресной рассылки.

Сценарии следующие:

  1. Приложение устанавливает сокет на определенный интерфейс перед отправкой (например, с помощью Java setNetworkInterface метод). Это не требует покрытия таблиц маршрутизации сети 224.0.0.0/4. Многоадресные пакеты будут передаваться через связанный интерфейс.

  2. Приложение не устанавливает сокет на определенный интерфейс перед отправкой, и существует маршрут по умолчанию. Многоадресные пакеты будут передаваться через интерфейс, указанный в маршруте по умолчанию.

  3. Приложение не устанавливает сокет на конкретный интерфейс перед отправкой, и маршрут по умолчанию не существует, но есть покрытие адреса группы многоадресной рассылки в таблице маршрутизации. Многоадресные пакеты будут передаваться по интерфейсу, указанному маршрутом, который покрывает групповой адрес многоадресной рассылки.

  4. Приложение не устанавливает сокет на определенный интерфейс перед отправкой, и не существует маршрута, который бы охватывал адрес группы многоадресной рассылки. Приложение выйдет из строя, если «нет маршрута к хосту».

  5. Бонусный сценарий: приложение не устанавливает сокет на определенный интерфейс, и как маршрут по умолчанию на одном интерфейсе, так и маршрут многоадресной рассылки на другой интерфейс существует, последний покрывает адрес группы многоадресной рассылки. По последнему интерфейсу будут передаваться многоадресные пакеты.

Кажется, ответ состоит в том, что многоадресный маршрут действительно необходим, если приложение не выбирает интерфейс для передачи. Он также вытесняет маршрут по умолчанию, что в ретроспективе имеет смысл. Похоже, что используется только интерфейсная часть маршрутов.

Обычно вам не нужен многоадресный маршрут. Не нужно.

Что значит netstat -gn шоу? Соединения должны выходить из интерфейса с наименьшим номером eth0 по умолчанию.

См. Шаги, которые я отметил по адресу: Многоадресная рассылка, похоже, не работает на RHEL 5.5

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

Видеть:

http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration

В противном случае маршрут по умолчанию будет работать правильно.