innd - InterNetNews daemon
innd [
-adfNrsSu] [
-4 address] [
-6
address] [
-c days] [
-H count] [
-i
count] [
-l size] [
-m mode] [
-n
flag] [
-o count] [
-P port] [
-t
timeout] [
-T count] [
-X seconds]
innd, the InterNetNews daemon, handles all incoming NNTP feeds,
coordinates the storage, retransmission, and overview generation for all
accepted articles, and manages the
active(5) and
history(5)
databases. It handles incoming connections on the NNTP port, and also creates
and listens to a local Unix-domain stream socket in order to receive articles
from local processes such as
nnrpd(8) and
rnews(1).
As the master daemon,
innd should generally be started at boot and be
always running. It listens to a Unix-domain datagram socket for commands to
control its activities, commands that can be sent using
ctlinnd(8). The
current status of
innd can be obtained by running "ctlinnd
mode", or for more detailed output,
innstat(8).
innd can be in one of three operating modes: running, paused, or
throttled. Running is the normal mode; when the server is throttled, it closes
connections and rejects new ones. Paused is like a temporary throttle,
suspending
innd's activities but not causing the server to shut down
existing connections. The mode is normally changed via
ctlinnd(8),
either by various automated processes (such as nightly article expiration) or
manually by the news administrator, but
innd will also throttle itself
if it encounters ENOSPC errors in writing data or an excessive number of I/O
errors (among other problems).
innd normally takes care of spawning
nnrpd(8) to handle
connections from news reading clients, but it can be run on a separate port
from
nnrpd(8) so that feed connections and news reading connections are
handled separately (this can often be faster). Normally,
innd listens
on port 119, the assigned port for NNTP; if it is desirable to run
innd
and
nnrpd(8) on separate ports, it's recommended that
nnrpd(8)
be given port 119 (since many news reading clients connect only to that port)
and that port 433 be used for
innd.
The primary configuration files that control
innd's activities are
incoming.conf, which specifies what remote sites
innd will
accept connections from,
newsfeeds, which specifies what is to be done
with incoming articles besides storing them, and
inn.conf, which sets a
wide variety of configuration parameters. Some parameters in
inn.conf(5) can also be set with command-line flags; for these, the
command-line flags take precedence if used.
innd must be run as the news user and news group. It will check for this
at startup and fail to start if not run properly. Normally it should be
started via
rc.news(8) as part of the system boot up process. It relies
on the setuid root helper program
innbind(8) to listen on a privileged
port (119, 433 or 563).
For the options below that override
inn.conf settings, see
inn.conf(5) for the default values if neither the
inn.conf
setting nor the command-line option is given.
-
-4 address
- Normally, innd binds to all local IP addresses
(unless bindaddress is set in inn.conf). If this option is
given, it specifies the IP address that INN should bind as. This is only
relevant for servers with multiple local IP addresses. The IP address must
be in dotted-quad ("nnn.nnn.nnn.nnn") format.
If this option is specified, it's the same as setting bindaddress in
inn.conf and may cause changes in whether INN binds to an IPv6
address as well. See inn.conf(5) for more details and also the
-6 flag for innd.
This option has no effect when systemd socket activation is used.
-
-6 address
- Only applies when INN has been built with IPv6 support.
Normally innd binds to all local IP addresses (unless
bindaddress6 is set in inn.conf). If this option is given,
it specifies the IPv6 address that INN should bind to. The IPv6 address
must be in colon-separated RFC 4291 format
("n:n:n:n:n:n:n:n").
If this option is specified, it's the same as setting bindaddress6 in
inn.conf and may cause changes in whether INN binds to an IPv4
address as well. See inn.conf(5) for more details and also the
-4 flag for innd.
This option has no effect when systemd socket activation is used.
- -a
- By default, if a host connects to innd but is not
listed in incoming.conf, the connection is handed off to
nnrpd (or rejected if noreader is set in inn.conf).
If -a is given, incoming.conf is ignored and any host can
connect and transfer articles. This flag should never be used with an
accessible server connected to Usenet; it would open the server up for all
sorts of abuse.
-
-c days
-
innd normally rejects any article that is older (in
days) than the value of artcutoff in inn.conf. This option,
if given, overrides the value of that setting. If days is 0, this
check is suppressed and innd will accept articles regardless of how
old they are.
Note that rejected articles are remembered during the number of days
specified by the "/remember/" line in expire.ctl(5).
You'll have to wait that number of days before being able to inject again
an article with the same previously rejected Message-ID.
In case you need re-injecting articles before that amount of time, you'll
have to set "/remember/" to 0 in expire.ctl, run the
expire process (for instance via news.daily called with the
same parameters as in crontab, plus "notdaily") and undo the
change in expire.ctl. All previously rejected or removed articles
will then not be considered as duplicate if their Message-ID is
proposed.
-
-d, -f
-
innd normally puts itself into the background,
points its standard output and error to log files, and disassociates
itself from the terminal. Using -d prevents all of this, resulting
in log messages being written to standard output; this is generally useful
only for debugging. Using -f prevents the backgrounding and
disassociation but still redirects output; it may be useful if you want to
monitor innd with a program that would be confused by forks.
-
-H count, -T count, -X
seconds
- These flags control the number of connections per
seconds seconds that are allowed. This code is meant to protect
your server from newsreader clients that make too many connections per
minute (and therefore these flags are probably only useful when
innd is spawning nnrpd). You probably should not use these
options unless you're having problems. The table used for this check is
fixed at 128 entries and is used as a ring; the size was chosen to make
calculating the index easy and to be fairly sure that it won't run out of
space. In practice, it is unlikely that even half the table will be used
at any given moment.
The -H flag limits the number of times a host is allowed to connect
to the server per the time interval given by -X. The default is 2.
The -T flag limits the total number of incoming connections per the
time interval given by -X. The maximum value is 128, and the
default is 60.
Note that the time interval given by -X is set to 0 by default, that
is to say no control is done on the number of connections.
-
-i count
-
innd normally allows a maximum number of concurrent
NNTP connections given by the value of maxconnections in
inn.conf. This option, if given, overrides the value of that
setting. If count is 0, this check is suppressed.
-
-l size
-
innd normally rejects any article larger than the
value of maxartsize in inn.conf. This option, if given,
overrides the value of that setting and specifies a maximum article size
of size. If size is 0, this check is suppressed.
-
-m mode
- Normally, innd starts in the "running"
mode. If this option is given, it specifies what mode innd should
start in. mode should begin with one of "g",
"p", or "t", and the starting mode will be set to
"running", "paused", or "throttled",
respectively, based on that initial letter. ("g" is short for
"go".)
- -N
- If this option is given, any filters (Perl or Python) are
disabled before innd starts (normally, filters default to being
enabled). The filters can be enabled after innd has started with
ctlinnd(8).
-
-n flag
- Whether innd allows (and hands off to nnrpd)
reader connections while paused or throttled is normally determined by the
value of readerswhenstopped in inn.conf. This option, if
given, overrides that value. If flag is "n", innd
will not allow readers if it is paused or throttled. If flag is
"y", readers will be allowed regardless of innd's
operating mode.
-
-o count
- This flag limits the number of file descriptors that are
available for outgoing file feeds. The default is the number of available
file descriptors minus some reserved for internal use (which could
potentially starve innd of descriptors to use for accepting new
connections). If innd has more file feeds than count, some
of them will be buffered and only written out periodically.
Normally you never need to use this option, since the number of outgoing
feeds is fixed, being the number of file feeds configured in
newsfeeds, and is generally small (particularly given that
innfeed(8) is now used for most outgoing feeds at large
sites).
-
-P port
- The port innd should listen on is normally given by
the value of port in inn.conf. This option, if given,
overrides that value and specifies the port that innd should bind
to.
- -r
- Instructs innd to renumber the active file
after starting, just as if a "ctlinnd renumber" command were
sent.
- -s
- Just check the syntax of the newsfeeds file and
exit. innd will exit with a non-zero status if any errors are
found; the actual errors will be reported via syslog(3).
- -S
- Report errors found in incoming.conf via
syslog(3) and exit normally. (Yes, this is less useful than it
should be.)
-
-t seconds
- Normally, innd will flush any changes to history and
the active file after 300 seconds of inactivity. This option
changes that timeout to seconds.
- -u
- The news log (the trace information for every article
accepted by innd) is normally buffered. This option changes the log
to be unbuffered.
Arriving articles that have a Control header field are called "control
messages". Except for cancel messages, these messages are handled by
controlchan(8) via a feed set up in
newsfeeds.
(Cancel messages update the history database, so they must be handled
internally; the cost of syncing, locking, then unlocking would be too high
given the number of cancel messages that are received. Note that if an article
is cancelled before it is received by the news server, it will be rejected
when it arrives since the history database has been updated; it is useful for
rejecting spam before it arrives.)
The distribution of control messages is different than that of standard
articles. Control messages are normally filed into the pseudo-newsgroup named
"control" regardless of which newsgroup they were actually posted
to. If, however, a "control."
command newsgroup exists that
matches the control command, the control message will be filed into that group
instead. For example, a newgroup control message will be filed in
"control.newgroup" if that group exists; otherwise, it will be filed
in "control".
If you want to specifically feed all control messages to a given site regardless
of whether the control messages would affect the newsgroups you're feeding
that site, you can put the appropriate control newsgroup in the subscription
list. For example, to feed all cancel messages to a given remote site
(normally a bad idea), add "control.cancel" to its subscription
list. Normally it's best to exclude the control newsgroups from feeds to keep
from sending your peers more control messages than they care about. That's why
the
newsfeeds pattern "!control,!control.*" is as often as
not specified (adding this pattern do not prevent control messages which
affect the newsgroups fed to a site from being sent to it).
checkgroups, newgroup and rmgroup control messages receive additional special
treatment. If one of these control messages is approved and posted to the
newsgroup being created or removed (or to the admin group to which the
checkgroups is posted), the message will be sent to all sites whose
subscription patterns would cause them to receive articles posted to that
group. For example, if a newgroup control message for a nonexistent newsgroup
"news.admin.meow" is received, it will be sent to any site whose
subscription pattern would cause it to receive "news.admin.meow" if
that newsgroup existed (such as a pattern of "news.admin.*"). For
this reason, it is correct to post newgroup messages to the newsgroup that the
control message would create. It is
not generally correct to crosspost
newgroup messages to some "well-propagated" newsgroup; not only will
this not actually improve their propagation to sites that want such control
messages, but it will also cause sites that do not want those control messages
to receive them. Therefore, assuming that a newgroup control message is sent
to the group "news.admin.meow" (specified in the Newsgroups header
field body) in order to create the group "news.admin.meow", the
sites with the following subscription patterns will receive it:
*,@news.*
news.*
news.*,!control,!control.*
control,control.*
As a matter of fact, for the first pattern, "control.newgroup" (or
"control") is included in "*". However, the sites with the
following subscription patterns will not receive it:
*,@news.*,!control,!control.*
comp.*,@news.*
If a control message is posted to a group whose name ends with the four
characters ".ctl", this suffix is stripped off and the control
message is propagated as if it were posted to the base group. For example, a
cancel message posted to "news.admin.ctl" will be sent to all sites
that subscribe to "control.cancel" (or "control" if that
newsgroup doesn't exist) or "news.admin". This behavior is present
for historical compatibility reasons and should be considered obsolete;
support for the ".ctl" suffix may be removed in a future version of
INN.
Finally, articles posted to newsgroups beginning with "to." are
treated specially. Provided that either that newsgroup exists in the
active file or
mergetogroups is set in
inn.conf, the
remainder of the newsgroup is taken to be a site name, as configured in
newsfeeds, and the article is sent to sites propagating
"to.uunet". If
mergetogroups is set, the article will be
filed in the group named "to" (which must exist in the
active
file). For example, with
mergetogroups set, an article posted to
"to.uunet" will be filed in "to" and sent to the sites
propagating "to.uunet".
innd implements the NNTP commands defined in RFC 3977 (NNTP),
RFC 4643 (NNTP authentication), RFC 4644 (streaming NNTP feeds)
and RFC 6048 (NNTP LIST additions) with the following differences:
- 1.
- A batch transfer command, XBATCH byte-count, is
provided. This command will read byte-count bytes and store them
for later processing by rnews(1) (which must be run separately,
probably from cron). See innxbatch(8) and sendxbatches for
more details on this extension.
- 2.
- As INN is a mode-switching news server, innd
implements a limited subset of the protocol useful for transferring news.
The remaining commands are mostly only useful for readers and are
implemented by nnrpd(8). Use of the MODE READER command will cause
innd to pass the connection to nnrpd.
- 3.
-
innd allows a wider syntax for wildmats.
- 4.
- Three commands (IHAVE, CHECK and TAKETHIS) will continue,
for interoperability reasons, to return a reject code (respectively 435,
438 and 439) when the command contains a syntax error (which normally
leads to 501).
innd modifies as few article headers as possible, although it could be
better in this area.
Empty header field bodies and header field bodies that consist of nothing but
whitespace are dropped.
The local site's name (as set with the
pathhost parameter in
inn.conf) and an exclamation point are prepended to the Path header
field body, provided the first site name in the Path header field body is
different from the local one. In addition,
pathalias and
pathcluster may be similarly respectively prepended and appended as
path identities immediately to the right or the left of
pathhost in the
Path header field body; see
inn.conf(5) for the details.
The Xref header field is removed and a new one created.
innd does not rewrite incorrect header fields. For example, it will not
replace an incorrect Lines header field, though it may reject such an article
depending on the value of
linecountfuzz in
inn.conf.
In order to efficiently apply a large number of local cancels (such as from
processing NoCeMs or from some other external source), INN supports a special
feed mode available only to connections to the local Unix-domain socket (not
to connections to any network sockets).
To enter this mode, connect to the Unix-domain socket (
pathrun/nntpin)
and send the command MODE CANCEL. The response will have code 284. Every
subsequent line sent on that connection should consist of a single message-ID.
An attempt will be made to cancel that message-ID, and the server will reply
289 for success or 484 for failure. (Failure can occur, for example, if the
server is paused or throttled, or the message-ID is corrupt. Failure does
not occur if the article to be cancelled does not exist.)
innd reports all incoming articles in its log file (
pathlog/news).
This is a text file with a variable number of space-separated fields in one of
the following formats:
mon dd hh:mm:ss.mmm + feed <message-id> site ...
mon dd hh:mm:ss.mmm j feed <message-id> site ...
mon dd hh:mm:ss.mmm c feed <message-id> Cancelling <message-id>
mon dd hh:mm:ss.mmm - feed <message-id> reason
mon dd hh:mm:ss.mmm ? feed <message-id> reason
There may also be hostname and/or size fields after the message-ID depending on
the settings of
nntplinklog and
logartsize in
inn.conf.
The first three fields are the date and time to millisecond resolution. The
fifth field is the site that sent the article (based on the Path header field
body) and the sixth field is the article's Message-ID; they will be a question
mark if the information is not available.
The fourth field indicates whether the article was accepted or not. If it is a
plus sign, then the article was accepted. If it is the letter "j",
then the article was accepted, providing all of the newsgroups to which the
article was posted were set to status "j" in the
active file
(or not listed in the
active file and
wanttrash was set in
inn.conf), and then the article was filed into the "junk"
newsgroup. In both of these cases, the article has been accepted and the
"site ..." field contains the space-separated list of sites to which
the article is being sent.
If the fourth field is the letter "c", then a cancel message was
accepted before the original article arrived, and a history entry for the
cancelled message was created so that
innd will reject that message if
it arrives later.
If the fourth field is a minus sign, then the article was rejected. The reasons
for rejection generated by
innd include:
"%s" header too long
Article exceeds local limit of %s bytes
Article posted in the future -- "%s"
Bad "%s" header field
Can't write history
Duplicate
Duplicate "%s" header field
EOF in headers
Linecount %s != %s +- %s
Missing %s header field
No body
No colon-space in "%s" header field
No matching newsgroups in cancel <%s>
No space
Space before colon in "%s" header field
Too old -- "%s"
Unapproved for "%s"
Unwanted newsgroup "%s"
Unwanted distribution "%s"
Whitespace in "Newsgroups" header field -- "%s"
where %s, above, is replaced by more specific information. (The Perl and Python
filters, if used, may reject articles with other reasons.)
If the fourth field is the letter "?", the article contains strange
strings, such as CR without LF or LF without CR. (These characters should
never occur in isolation, only together as CRLF to indicate the end of a
line.) This log message is just informational, to give an idea of how
widespread such articles are;
innd does not reject such articles.
Note that when
wanttrash is set to true in
inn.conf and an article
is received that isn't posted to any valid newsgroups, it will be accepted and
logged with two lines, a "j" line and a minus sign line, unless the
logtrash parameter is set to false (in which case only the
"j" line is written).
innd also makes extensive reports through
syslog(3). The first
word of the log message will be the name of the site if the entry is
site-specific (such as a "connected" message). The first word will
be "SERVER" if the message relates to the server itself, such as
when a read error occurs.
If the second word is the four letters "cant", then an error is being
reported. (The absence of an apostrophe is intentional; it makes it easier to
grep from the command line and easier to find error messages in FAQs using a
search engine. However, "can't" is also used at a few places.) In
this case, the next two words generally name the system call or library
routine that failed and the object upon which the action was being performed.
The rest of the line may contain other information.
In other cases, the second word attempts to summarize what change has been made,
while the rest of the line gives more specific information. The word
"internal" generally indicates an internal logic error.
innd will catch SIGTERM and SIGHUP and shut down. If
-d is used,
SIGINT will also be caught and will result in an orderly shutdown.
innd will catch the SIGUSR1 signal and recreate the control channel used
by
ctlinnd(8).
innd normally attempts to strip IP options from incoming connections,
since it uses IP-based authentication and source routing can confuse that.
However, this doesn't work on all systems, and it doesn't work at all in the
presence of IPv6 support (and is disabled in that case). Hence, if using
innd with IPv6 support, make sure that your kernel or router disables
source routing.
Written by Rich $alz <
[email protected]> for InterNetNews.
active(5),
ctlinnd(8),
history(5),
incoming.conf(5),
inn.conf(5),
innbind(8),
innfeed(8),
innstat(8),
libinn_dbz(3),
libinn_inndcomm(3),
newsfeeds(5),
nnrpd(8),
rnews(1),
syslog(3).