SMCROUTE(8) | System Manager's Manual (smm) | SMCROUTE(8) |
smcroute
—
SMCRoute, a static multicast router
smcrouted |
[-nNhsv ] [-c
SEC] [-d
SEC] [-e
CMD] [-f
FILE] [-I
NAME] [-l
LVL] [-p
USER:GROUP] [-P
FILE] [-t
ID] |
smcroutectl |
[-dtv ] [-I
NAME] [COMMAND] |
smcroutectl |
⟨help | flush | kill | restart | version⟩ |
smcroutectl |
⟨show⟩ [groups | routes] |
smcroutectl |
⟨add | rem⟩ ⟨IFNAME⟩ [SOURCE] GROUP[/LEN] IFNAME [IFNAME ...] |
smcroutectl |
⟨join | leave⟩ ⟨IFNAME⟩ [SOURCE] GROUP |
smcroute
is both a daemon and command line
tool to manipulate the multicast routing table of a UNIX kernel. It supports
both IPv4 and IPv6 multicast routing. smcroute
can
be used as an alternative to dynamic multicast routers like
mrouted
or pimd
in
situations where static multicast routes should be maintained and/or no
proper IGMP or MLD signaling exists.
Multicast routes exist in the UNIX kernel as long as a multicast
routing daemon is running. On Linux, multiple multicast routers can be used
simultaneously with different multicast routing tables. To run
smcrouted
and, mrouted
at
the same time, set the former to use a routing table other than the default
(0).
smcrouted
modifies the kernel routing
table and needs either full superuser rights, or
CAP_NET_ADMIN
on Linux. This also applies to
smcroutectl
.
Be careful when creating multicast routes. You can easily flood your networks by inadvertently creating routing loops. Either direct loops listing an inbound interface also as an outbound, or indirect loops by going through other routers.
The following smcrouted
commands are
available:
-n
-N
smcrouted
enables multicast routing on
all available, and multicast capable, interfaces in the system. These
interfaces are enumerated as VIFs, virtual interfaces, of which most UNIX
systems have a very limited amount, usually 32. This daemon option inverts
the behavior so no interfaces are enabled by default. Useful on systems
with many interfaces, where multicast routing only makes use of a few.
The config file setting phyint IFNAME enable is required to enable the required interfaces.
-f
FILE-c
SECThis option is intended for systems with topology changes, i.e., when inbound multicast may change both interface and source IP address. E.g. in a setup with at least two VRRP routers. If there is no way of detecting such a topology change this option makes sure to periodically flush all dynamically learned multicast routes so that traffic may resume. Flushing of a specific route only occurs if it was unused during the last flush interval, i.e. there was no traffic matching it. This avoids toggling between different inbound interfaces if traffic arrives on several interfaces simultaneously. In this case, the first selected inbound interface is retained until traffic on it ceases.
Default is 60 sec, set to 0 to disable. See also the
smcroutectl
flush command,
which can be called manually on topology changes.
-d
SECThis command line option, although useful in some use-cases, is fragile. It is almost always better to rely on an init or process supervisor that handles dependencies properly, like finit(8), which can wait for interfaces to come up and files to be created before starting a service.
-e
CMDsmcrouted
has loaded/reloaded all static multicast
routes from the configuration file, or when a source-less (ANY) rule has
been installed.-I
NAME-I
foo would make
smcrouted
look for
/etc/foo.conf
, write its PID to
/var/run/foo.pid
and create an IPC socket for
smcroutectl
in
/var/run/foo.sock
.
For smcroutectl
the same option can be
used to select the proper smcrouted
instance to
send IPC to.
This option is required for both daemon and client when
running multiple smcrouted
instances, using
multiple routing tables, on Linux.
-l
LEVEL-p
USER [:GROUP]smcrouted
is built with libcap support.-P
FILE-I
NAME. Regardless, setting this option overrides all
others, but it is recommended to use the ident option instead.-s
-t
IDip mrule add iif eth0 lookup 123 ip mrule add oif eth0 lookup 123
Note:
Only available on Linux.
-v
The -e
CMD option is
useful if you want to trigger other processes to start when
smcrouted
has completed installing dynamic multicast
routes from (*,G) rules in /etc/smcroute.conf, or
when a source-less (ANY) route, a.k.a (*,G) multicast rule, from
/etc/smcroute.conf. is matched and installed. For
instance, calling conntrack on Linux to flush firewall
connection tracking when NAT:ing multicast.
The script CMD is called with an argument
reload or install to let the
script know if it is called on SIGHUP/startup, or when a (*,G) rule is
matched and installed. In the latter case smcrouted
also sets two environment variables: source
, and
group
. Beware that these environment variables are
unconditionally overwritten by smcrouted
and can
thus not be used to pass information to the script from outside of
smcrouted
.
The IFNAME argument in the below
smcroutectl
commands is the interface name, or an
interface wildcard of the form eth+, which matches
eth0, eth10, etc. Wildcards are
available for inbound interfaces. The following commands are available:
add
IFNAME [SOURCE] GROUP[/LEN]
OUTIFNAME [OUTIFNAME ...]To add a (*,G) route, either leave SOURCE out completely or set it to 0.0.0.0, and if you want to specify a range, set GROUP/LEN, e.g. 225.0.0.0/24.
remove
IFNAME [SOURCE]
GROUPflush
-c
SEC works in the daemon,
this client command initiates an immediate flush of all dynamically set
(*,G) routes. Useful when a topology change has been detected and need to
be propagated to smcrouted.
join
IFNAME [SOURCE]
GROUPleave
IFNAME [SOURCE]
GROUPhelp [cmd]
kill
restart
show [groups|routes]
-d
option to get details
for each multicast route.version
A multicast route is defined by an input interface IFNAME, the sender's unicast IP address SOURCE, which is optional, the multicast group GROUP and a list of, at least one, output interface IFNAME [IFNAME ...].
The sender's address and the multicast group must both be either IPv4 or IPv6 addresses.
The output interfaces are not needed when removing routes using
the remove
command. The first three parameters are
sufficient to identify the source of the multicast route.
The intended purpose of smcroute
is to aid
in situations where dynamic multicast routing does not work properly.
However, a dynamic multicast routing protocol is in nearly all cases the
preferred solution. The reason for this is their ability to translate
Layer-3 signaling to Layer-2 and vice versa (IGMP or MLD).
smcrouted
is capable of simple group join
and leave by sending commands to the kernel. The kernel then handles sending
Layer-2 IGMP/MLD join and leave frames as needed. This can be used for
testing but is also useful sometimes to open up multicast from the sender if
located on a LAN with switches equipped with IGMP/MLD Snooping. Such devices
will prevent forwarding of multicast unless an IGMP/MLD capable router or
multicast client is located on the same physical port as you run
smcrouted
on. However, this feature of
smcrouted
is only intended as a workaround, and only
20 groups can be joined this way (kernel limit). For bigger installations it
is strongly recommended to instead address the root cause, e.g. enable
multicast router ports on intermediate switches, or try the embedded
multicast router discovery feature of smcrouted
.
To emulate a multicast client using
smcroute
you use the join
and leave
commands to issue join and leave commands
for a given multicast group on a given interface
IFNAME. The GROUP may be given
in an IPv4 or IPv6 address format.
The command is passed to the daemon that passes it to the kernel. The kernel then tries to join the multicast group GROUP on interface IFNAME by starting IGMP, or MLD for IPv6 group address, signaling on the given interface. This signaling may be received by routers/switches connected on that network supporting IGMP/MLD multicast signaling and, in turn, start forwarding the requested multicast stream eventually reach your desired interface.
Note:
when running multiple
smcrouted
instances, one per routing table on Linux,
it is required to use the -I
NAME option to both daemon and client. This because
the name of the IPC socket used for communicating is composed from the
identity.
smcrouted
supports reading and setting up
multicast routes from a config file. The default location is
/etc/smcroute.conf, but this can be overridden using
the -f
FILE command line
option.
The IFNAME argument below is the interface name, or an interface wildcard of the form eth+, which matches eth0, eth10, etc. Wildcards are available for inbound interfaces.
# # smcroute.conf example # # The configuration file supports joining multicast groups, to use # Layer-2 signaling so that switches and routers open up multicast # traffic to your interfaces. Leave is not supported, remove the # mgroup and SIGHUP your daemon, or send a specific leave command. # # NOTE: Use of the mgroup command should be avoided if possible. # Instead configure "router ports" or similar on the switches # or bridges on your LAN. This to have them direct all the # multicast to your router, or direct select groups they have # such capabilities. Usually MAC multicast filters exist. # # The UNIX kernel usually limits the number of multicast groups # a socket/client can join. In Linux, 20 mgroup lines can be # configured by default, but this can be changed with sysctl: # # sysctl -w net.ipv4.igmp_max_memberships=30 # # Similarly supported is setting mroutes. Removing mroutes is not # supported, remove/comment out the mroute from the .conf file, or # send a remove command with smcroutectl. # # Syntax: # phyint IFNAME <enable|disable> [mrdisc] [ttl-threshold <1-255>] # mgroup from IFNAME [source ADDRESS] group MCGROUP # mroute from IFNAME [source ADDRESS] group MCGROUP[/LEN] to IFNAME [IFNAME ...] # This example disables the creation of a multicast VIF for WiFi # interface wlan0. The kernel (at least Linux) sets the ALLMULTI # flag for all interfaces that have a VIF enabled. Hence, it can # cause quite a bit of unnecessary traffic to reach the CPU if too # many interfaces have a VIF (or MIF in IPv6 lingo). Only enable # interfaces required for inbound and outbound traffic. # phyint wlan0 disable phyint eth0 enable ttl-threshold 11 phyint eth1 enable ttl-threshold 3 phyint eth2 enable ttl-threshold 5 phyint virbr0 enable ttl-threshold 5 # The following example instructs the kernel to join the multicast # group 225.1.2.3 on interface eth0. Followed by setting up an # mroute of the same multicast stream, but from the explicit sender # 192.168.1.42 on the eth0 network and forward to eth1 and eth2. # mgroup from eth0 group 225.1.2.3 mroute from eth0 source 192.168.1.42 group 225.1.2.3 to eth1 eth2 # Similar example, but using source-specific group join mgroup from virbr0 source 192.168.123.110 group 225.1.2.4 mroute from virbr0 source 192.168.123.110 group 225.1.2.4 to eth0 # Here we allow routing of multicast to group 225.3.2.1 from ANY # source coming in from interface eth0 and forward to eth1 and eth2. # NOTE: Routing from ANY source is currently only available for IPv4 # multicast. mgroup from eth0 group 225.3.2.1 mroute from eth0 group 225.3.2.1 to eth1 eth2 # The previous is an example of the (*,G) support. Such rules cause # SMCRoute to dynamically add multicast routes to the kernel when the # first frame of a stream reaches the router. It is also possible to # specify a range of such rules, again, note that this currently only # works for IPv4. Also, it is not possible to set a range of groups # to join atm. mroute from eth0 group 225.0.0.0/24 to eth1 eth2
Fairly simple. As usual, to identify the origin of the inbound multicast we need the IFNAME, the sender's IP address and, of course, the multicast group address, MCGROUP. The last argument is a list of outbound interfaces.
The source address is optional for IPv4 multicast routes. If
omitted it defaults to 0.0.0.0 (INADDR_ANY) and will cause
smcrouted
to dynamically add new routes, matching
the group and inbound interface, to the kernel. This is an experimental
feature which may not work as intended, in particular not with 1:1 NAT.
Following the UNIX tradition the file format supports comments starting at the beginning of the line using a hash sign. It is untested to have comments at the end of a line, but should work.
When starting up in debug mode, smcrouted
logs the success of parsing each line and setting up a route.
The current version compiles and runs fine on Linux kernel version 2.4, 2.6 and 3.0. Known limits:
Multicast
routes
Multicast
group memberships
smcrouted
responds to the following
signals:
HUP
INT
TERM
For convenience in sending signals,
smcrouted
writes its process ID to
/var/run/smcroute.pid upon startup.
The most common problem when attempting to route multicast is the TTL. Always start by verifying that the TTL of your multicast stream is not set to 1, because the router decrements the TTL of an IP frame before routing it. Test your setup using ping(8) or iperf(1). Either of which is capable of creating multicast traffic with an adjustable TTL. Iperf in particular is useful since it can act both as a multicast source (sender) and a multicast sink (receiver). For more advanced IP multicast testing the omping(8) tool can be used.
smcrouted
on SIGHUP. Like
the PID file, the name of the configuration file may be different
depending on command line options given to the daemon.smcrouted
when it
has started up and is ready to receive commands. See also the
-I
NAME or
-P
FILE options which can
change the default name.smcrouted
for use by
smcroutectl
. Same caveats apply to this file as
the previous two, command line options to the daemon can change the file
names.mrouted(8), pimd(8), omping(8), ping(8), mcjoin(1), iperf(1)
SMCRoute was created by Carsten Schill <carsten@cschill.de>. IPv6 support by Todd Hayton <todd.hayton@gmail.com>. FreeBSD support by Micha Lenk <micha@debian.org>.
smcrouted
is maintained by Joachim Nilsson
<troglobit@gmail.com>, Todd Hayton <todd.hayton@gmail.com>,
Micha Lenk <micha@debian.org> and Julien BLACHE
<jblache@debian.org> at
https://github.com/troglobit/smcroute
A lot of extra information is sent under the daemon facility and
the debug priority to the syslog daemon. Use smcrouted -s
-l debug
to enable.
May 6, 2017 | Debian |