fragen stichworte

Unicast bis Multicast über iptables

Hinweis: Es gibt zwar jetzt eine akzeptierte Antwort, diese ist jedoch nur ein Teil. Überprüfen Sie die endgültige iptables-Regel unten.

Ich empfange einen Unicast-RTP-Stream an einer Schnittstelle und möchte diesen über Multicast an eine zweite Schnittstelle senden. Bei dem fraglichen System handelt es sich um einen Embedded-Prozessor, der unter Linux läuft, aber ich finde es genauso schwierig, ihn auf meinem Ubuntu 10.10-Host einzurichten. Die einfache, naheliegende Antwort, die auf http://lists.netfilter.org/pipermail/netfilter/2002-October/038890.html und anderen Quellen basiert, scheint zu sein:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]

Weitere Untersuchungen führten zu dieser Paarung:

iptables -t nat -A PREROUTING -i [unicast-interface] -p udp --dport [unicast-incoming-port] -j DNAT --to-destination [multicast-addr]:[multicast-port]
iptables -A FORWARD -i [unicast-interface] -o [multicast-interface] -p udp --dport [unicast-incoming-port] -j ACCEPT

Obwohl die Regeln in der Liste angezeigt werden und tcpdump die eingehenden Unicast-Pakete anzeigt, zeigte Wireshark auf einem separaten Computer keine Pakete, die ausgegeben wurden.

Ich habe mir angeschaut. Wie kann ich Unicast in DNAT mit iptables übertragen? aber das scheint mit den Besonderheiten des Rundfunkfalls zu tun zu haben.

Hinweis: Es wurden keine anderen iptables-Regeln festgelegt. Ich habe mit iptables -L (und -tnat -L) und iptables --flush noch einmal geprüft.

(Ich erkenne, dass es andere Optionen gibt, wie socat - aber bevor ich zu ihnen wechsle, möchte ich sicherstellen, dass mir nichts fehlt.)

Bearbeiten: Ich habe ip_forward aktiviert.

~ # sysctl -a 2>&1 |grep ip_forward
net.ipv4.ip_forward = 1

Bearbeiten: Es sieht so aus, als würde die Anzahl der Pakete in meiner NAT-Tabelle (iptables -t nat -L -v -n) erhöht, aber nicht in der Haupt-/Filtertabelle (iptables -L -v -n)

Bearbeiten: Nachdem ich die Dinge probiert habe, war ich nicht erfolgreich. Ich habe gesehen, dass einige Leute einen ähnlichen Prozess erhalten, um mit Cisco zu arbeiten, wie auf dieser Website: http://www.penrod.cc/?p=527

Es schien, dass dies zu zu einem Zeitpunkt funktionierte, aber ich konnte es seitdem nicht funktionieren, entweder auf dem ursprünglichen Embedded-Host oder auf einer Linux-Workstation.

Bearbeiten: Wie sich herausstellt, ist dieses Problem erneut aufgetreten.

Endgültige Lösung, die vollständig funktioniert hat:

Smcroute abrufen (statischer Multicast-Routendämon wird ausgeführt). Wenn Sie sich in einem eingebetteten System befinden, müssen Sie möglicherweise smcroute -d

verwenden
smcroute -a [unicast-interface] [source-ip] [multicast-addr] [multicast-interface]
iptables -t nat -A PREROUTING -p UDP -d [unicast-interface-ip] -j NETMAP --to [multicast-addr]

Zum Beispiel:

smcroute -a eth0 192.168.0.101 239.1.1.1 eth0
iptables -t nat -A PREROUTING -p UDP -d 192.168.0.1 -j NETMAP --to 239.1.1.1

Beachten Sie, dass Sie die iptables-Regel möglicherweise verfeinern müssen, um sicherzustellen, dass Sie keine Pakete fangen, die Sie nicht beabsichtigen. Dies ist nur ein vereinfachtes Beispiel.

antworten

Haben Sie die IP-Weiterleitung im Kernel aktiviert?

# sysctl -a 2>&1 | grep ip_forward
net.ipv4.ip_forward=1

Sie benötigen ihn, um den Verkehr von einer Schnittstelle zu einer anderen zu leiten (a.k.a. die FORWARD-Tabellenregeln).

Bearbeiten:

Es gibt andere sysctl-Einstellungen, von denen ich vermute, dass sie miteinander zusammenhängen:

net.ipv4.conf.all.mc_forwarding

und pro Schnittstelle und für IPv6.

Das "mc" klingt wirklich nach Multicast, aber ich habe keine Kernel-Dokumente zur Hand, um 100% sicher zu sein.

Versuchen Sie die Einstellung auf 1, wenn dies nicht immer funktioniert, können Sie den Standardwert 0 wiederherstellen.

Bearbeiten:

von netzwerk/ip-sysctl.txt:

conf/all/mc_forwarding must also be set to TRUE to enable multicast routing

Sie müssen die Routing-Tabelle so manipulieren, dass nach dem NAT-Senden des Pakets die richtige Schnittstelle gesendet wird.

ip route add to $MULTICAST_ADDR dev $MULTICAST_IFACE

Dies kann zu Problemen führen, wenn Sie Multicasts über die eingehende Schnittstelle versenden. Daher müssen Sie die Pakete

markieren
iptables -t mangle <rules to match the packets you want to multicast> -j MARK --mark <your favorite number>
ip rule add order 10 fwmark <that favorite number> lookup table <another favorite number>
ip route add to <multicast> dev <iface> table <2nd fav number>

Schließlich müssen Sie feststellen, dass conntrack die zurückgegebenen Pakete nicht finden kann. Sie müssen Ihren eigenen Weg gehen:

iptables -t nat -A POSTROUTING -d <multicast> -o <iface> -j SNAT <router's IP>:<a port>
iptables -t nat -A PREROUTING -i <router's IP> -p udp --dport <a port> -j DNAT <orig sender>:<orig port>

Dort können Sie das tun, was Sie wollen. Ich hoffe, meine (eingeschränkte) Erklärung kann Sie auf den richtigen Weg bringen.

Es scheint, dass Sie einen speziellen Daemon verwenden müssen - siehe igmpproxy oder mrouted -, da iptables eingehende Pakete einfach in eine Kombination von Adressen/Ports übersetzen und weiterleiten Angebot.

Dieses Kernelmodul erstellt einen neuen Netfilter-Hook in der Prerouting-Kette, um die Unicast-Pakete zu stehlen, und sendet es als Multicast-Paket basierend auf der durch "utomu"

festgelegten Regel

für Beispiel: Eingehende Unicast-Sitzungsschnittstelle ist "eth0" und ausgehende Multicast-Sitzungsschnittstelle ist "eth1". Stellen Sie dann

ein

echo "eth0">/proc/sys/net/utom/in_ifname

echo "eth1">/proc/sys/net/utom/out_ifname

Angenommen, die IP-Adresse der Unicast-Quelle ist "192.168.56.5" und soll in "225.1.2.3" umgewandelt werden. Setzen Sie dann die Regel auf

utomu -m 225.1.2.3 -a 192.168.56.5 -s 1194 -d 1194

Es werden auch der Quellport und der Zielport geändert.

Source @ https://github.com/ravi-eticala/unicast-to-multicast