Provided by: smcroute_2.5.7-1_amd64 bug

NAME

     smcrouted — SMCRoute, a static multicast router

SYNOPSIS

     smcrouted [-nNhsv] [-c SEC] [-d SEC] [-e CMD] [-f FILE] [-F FILE] [-i NAME] [-l LVL]
               [-m SEC] [-p USER:GROUP] [-P FILE] [-t ID] [-u FILE]

DESCRIPTION

     smcrouted is a static multicast routing daemon providing fine grained control over the
     multicast forwarding cache (MFC) in the UNIX kernel.  Both IPv4 and IPv6 are fully
     supported.

     smcrouted can be used as an alternative to dynamic multicast daemons like mrouted(8),
     pimd(8) or pim6sd(8) 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 only as long as a multicast routing daemon is
     running.  On Linux, multiple multicast routers can run simultaneously using 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 the friendly control tool smcroutectl(8).

   Warning
     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.

OPTIONS

     The following command line options are available:

     -c SEC  Flush unused dynamic (*,G) multicast routes every SEC seconds.

             This 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 SEC  Daemon startup delay.  Delays the probe of interfaces and parsing of the
             configuration file.  Note, the PID file is also not created, since the daemon is not
             ready yet.

             This 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 CMD  Specify external script or command to be called when smcrouted has loaded/reloaded
             all static multicast routes from the configuration file, or when a source-less (ANY)
             rule has been installed.

     -f FILE
             Alternate configuration file, default /etc/smcroute.conf

     -F FILE
             Check configuration file syntax, use -l LEVEL to increase verbosity.  Returns non-
             zero on error.

     -h      Show summary of command line options and exit.

     -i NAME
             Set daemon identity.  Used to create unique PID, IPC socket, and configuration file
             names, as well as set the syslog identity.  E.g., -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
             Set log level: none, err, notice, info, debug.  Default is notice.

     -m SEC  Modify Multicast Router Discovery (mrdisc) announcement interval.  Default 20 sec.
             This option is only available when smcrouted is built with mrdisc support (Linux,
             and IPv4, only). RFC4286.

     -n      Run daemon in foreground, do not detach from controlling terminal

     -N      By default 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.

     -p USER [:GROUP]
             Drop root privileges to USER:GROUP after start and retain CAP_NET_ADMIN capabilities
             only.  The :GROUP is optional.  This option is only available when smcrouted is
             built with libcap support.

     -P FILE
             Set PID file name, and optionally full path, in case you need to override the
             default identity, or the identity set with -i NAME.  Regardless, setting this option
             overrides all others, but it is recommended to use the ident option instead.

     -s      Let daemon log to syslog, default unless running in foreground.

     -t ID   Set multicast routing table ID.  Remember to also create routing rules directing
             packets to the table.  This example uses routing table ID 123:

             ip mrule add iif eth0 lookup 123
             ip mrule add oif eth0 lookup 123

             Note: Only available on Linux.

     -u FILE
             UNIX domain socket path, used for the IPC between smcrouted and smcroutectl.  Use
             this to override the default socket path, derived from the daemon identity, -i NAME.
             This option can be useful when overriding the identity is not sufficient, e.g. for
             testing.  The default depends on how smcrouted is configured at build time, see
             FILES.

     -v      Show program version and support information.

     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.

OPERATION

   Introduction
     When smcrouted starts up it scans for available network interfaces that have the MULTICAST
     flag set.  Provided the -N flag is not set, each interface is enumerated as a virtual
     interface (VIF) which is what the kernel's multicast routing stack uses.  The enumeration
     process on some operating systems also require each interface to have an IP address, but
     Linux and FreeBSD systems only require the ifindex and the MULTICAST flag.  If the interface
     does not yet exist when smcrouted starts, the -d SEC flag can be used to delay startup.
     Otherwise smcrouted needs to be reloaded (e.g., using SIGHUP) when a new interface has been
     added to the system.

     Since VIFs are a limited resource, most operating systems only support 32 in total, the
     administrator may need to declare which interfaces to use for multicast routing using the
     /etc/smcroute.conf phyint directive.  It is recommended to always start smcrouted with the
     -N flag, disabling VIF creation by default, and then selectively enable each of the
     interfaces you are going to route between.  See smcroute.conf(5) for more information.

   Multicast Scoping
     Because multicast inherently is broadcast there is an obvious need to limit.  On a LAN this
     is usually managed automatically by bridges (switches) with built-in multicast snooping
     (IGMP and MLD).  Between LANs there is also the need to scope multicast, often the same
     multicast groups are used for different purposes on different LANs.  This must be managed by
     administrators, at least three options exist:

           TTL scoping
                   The traditional way of "raising walls" between zones.  The outbound interfaces
                   of routers are given a TTL threshold greater than the hop it represents.  The
                   default TTL threshold is 1.  Managing the routers is a lot easier than
                   adjusting the TTL value of each multicast sender.  The only real downside to
                   this is that it scales poorly with the number of routers and it affects all
                   multicast traversing the router's interfaces.

           Administrative scoping (RFC2365)
                   This is one of the current best practices, defining boundaries for sets of
                   multicast groups instead of limiting all multicast (as TTL scoping does).  In
                   the case of smcrouted this is left to the administrator to manage.  See
                   mrouted(8), and mrouted.conf(5), for more details.

           Filtering
                   Some sort of filtering mechanism, e.g., firewall (Linux netfilter) or low-
                   level filter (Linux tc or eBPF) that may even have some hardware offloading
                   support (TCAM).  The firewall is likely the most common since it is also often
                   used to set up SNAT or 1:1 NAT (Linux netmap).

   Multicast Routes
     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 ...].

           mroute from eth0                  group 225.1.2.3  to eth1 eth2
           mroute from eth0 source 1.2.3.4   group 225.3.2.1  to eth1 eth2

           mroute from eth0                  group  ff2e::42  to eth1 eth2
           mroute from eth0 source 2001:3::1 group  ff2e::43  to eth1 eth2

     The sender address and multicast group must both be either IPv4 or IPv6 addresses.

     The output interfaces are not needed when removing routes using the smcroutectl remove
     command.  The first three parameters are sufficient to identify the source of the multicast
     route.

     The intended purpose of smcrouted 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).

     Note: the optional source address multicast routes are not installed in the kernel multicast
     forwarding cache (MFC) by smcrouted.  Instead, it dynamically installs new routes to the
     kernel MFC, matching the group and inbound interface, when the kernel notifies smcrouted
     using "upcalls" called NOCACHE messages.  This feature was grafted onto smcrouted from
     mrouted(8), and may not work as intended in all use-cases.

   Multicast Groups
     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.  Some platforms impose a limit on the maximum number of groups
     that can be joined, some of these systems can be tuned to increase this limit.  For bigger
     installations it is strongly recommended to instead address the root cause, e.g. enable
     multicast router ports on intermediate switches, either statically or by enabling the
     multicast router discovery feature of smcrouted.

     To emulate a multicast client using smcrouted 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.

   Multiple Daemon Instances
     When running multiple smcrouted instances, using the -t ID command line flag, 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.

DEBUGGING

     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 mcjoin(1) tool can be
     used.

   Note
     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.

SIGNALS

     For convenience in sending signals, smcrouted writes its process ID to /var/run/smcroute.pid
     upon startup, unless the -p FILE or -i NAME options are used to change the identity or file
     name used.  The following signals are supported:

     HUP   Tell smcrouted to reload its configuration file and activate the changes.
     INT   Terminates execution gracefully.
     TERM  The same as INT.

FILES

     /etc/smcroute.conf      Optional configuration file for smcrouted.  Defined interfaces to
                             use, groups to join, and routes to set when starting, or reloading
                             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.  Most notably, -I IDENT defines the
                             full suite of files used by the smcrouted daemon.  See
                             smcroute.conf(5) for details.
     /etc/smcroute.d/*.conf  Optional configuration directory, path defined by convention only,
                             actual configuration directory, or file(s) to include, defined by
                             /etc/smcroute.conf.  See smcroute.conf(5) for details.
     /var/run/smcroute.pid   Default PID file (re)created by 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.
     /var/run/smcroute.sock  IPC socket created by smcrouted for use by smcroutectl.  Same
                             caveats apply to this file as the previous two, command line options
                             -i NAME and -S FILE to the daemon can be used to change the socket
                             file name.
     /proc/net/ip_mr_cache   Linux specific, holds active IPv4 multicast routes.
     /proc/net/ip_mr_vif     Linux specific, holds the IPv4 virtual interfaces used by the active
                             multicast routing daemon.
     /proc/net/ip6_mr_cache  Linux specific, holds active IPv6 multicast routes.
     /proc/net/ip6_mr_vif    Linux specific, holds the IPv6 virtual interfaces used by the active
                             multicast routing daemon.
     /proc/net/igmp          Linux specific, holds active IGMP ASM (*,G) joins.
     /proc/net/igmp6         Linux specific, holds active MLD ASM (*,G) joins.
     /proc/net/mcfilter      Linux specific, holds active IGMP SSM (S,G) joins.
     /proc/net/mcfilter6     Linux specific, holds active MLD SSM (S,G) joins.
     /proc/sys/net/ipv4/igmp_max_memberships
                             Linux specific tuning of max IGMP ASM (*,G) per socket, default 20.
     /proc/sys/net/ipv4/igmp_max_msf
                             Linux specific tuning of max IGMP SSM (S,G) per socket, default 10.

     BSD systems may consult the netstat(1) tool for stats on virtual multicast interface tables
     and multicast forwarding caches, and VIF/MIF allocation, as well as the ifmcstat(8) tool for
     querying group membership.

EXIT STATUS

     smcrouted leverages BSD sysexits.h exit codes (64-78), which process supervisors like
     systemd(1) and finit(8) understands.  The following table details what codes are used for
     and how to interpret them.

           Status    Symbolic Name    Description
           0         EX_OK            Success
           64        EX_USAGE         Invalid command line option, or missing argument
           69        EX_UNAVAILABLE   Multicast routing socket (or table) already in use
           79        EX_SOFTWARE      Internal error, bug in smcrouted
           71        EX_OSERR         Failed fork(), daemon(), getifaddrs(), malloc(), etc.
           76        EX_PROTOCOL      Kernel does not seem to support multicast routing
           77        EX_NOPERM        Not enough permissions to run
           78        EX_CONFIG        Parse error in configuration file

SEE ALSO

     smcroute.conf(5), smcroutectl(8), mrouted(8), pimd(8), pim6sd(8), ping(8), mcjoin(1),
     iperf(1)

AUTHORS

     SMCRoute was originally created by Carsten Schill <carsten@cschill.de>.  Initial IPv6
     support by Todd Hayton <todd.hayton@gmail.com>.  Initial FreeBSD support by Micha Lenk
     <micha@debian.org>.

     SMCRoute is currently maintained by Joachim Wiberg <troglobit@gmail.com>, and Micha Lenk
     <micha@debian.org> at GitHub: https://github.com/troglobit/smcroute.