Draft specification for future X-Trace header
olaf at bigred.inka.de
Tue Jul 4 17:30:50 UTC 2000
This is an attempt at a formal specification for a better X-Trace
header (and a draft for an implementation in INN which I'm going to
do when I have too much time on my hands :-). Any comments welcome.
Any news system which an article crosses MAY insert an X-Trace header.
However, this SHOULD NOT be done in the normal forwarding of articles,
but only at injection points and gateways (of any kind).
Recommendation: insert this header when an article is received via the
NNTP POST command or a local program.
The X-Trace header serves the purposes of
- identifying injection points and gateways,
- giving the administrator at each injection point enough information
to determine the precise circumstances how the article entered the
- giving every news system enough information to detect potential
trouble from malfunctioning software or misbehaving users.
When this header becomes standardized by RFC it should be renamed to "Trace".
header = "X-Trace:" LWSP systemid *(LWSP item)
systemid = domain-name
item = ctoken | ntoken | comment
ctoken = ":" data
ntoken = data
data = (any data in base64 encoding)
comment = "(" *pchar ")"
pchar = (any printable character except "(" and ")")
LWSP = linear-white-space
with the following meanings:
systemid = the hostname of the generating system. This MUST be the
same name the system puts in the Path header.
ctoken = Data item which is suitable to compare against the ctoken
parts of other X-Trace headers generated by the same
system to detect multiple postings.
ntoken = any other data, usually only relevant to the local admin.
comment = readable comment.
The total length of the X-Trace header including header name and
terminating newline SHOULD NOT exceed 255 octets.
X-Trace: g212.hadiko.de :7F0quBAr148= riniJg54iM4= (complaints to usenet at bigred.inka.de)
systemid ctoken ntoken comment
3. Generating the headers
3.1. Postings by local users
For local postings, the injection point SHOULD generate a /ctoken/
which is the same for all postings of one user over a certain period
of time (recommendation: about one day) and always different for
postings by different users. To prevent privacy problems, this token
SHOULD be encrypted or hashed.
For a single-user client system, this can be achieved by combining the
posting IP address and the upper 16 bits of the Unix system time into
an 8-byte block and encrypting this block using a block cipher with a
secret key. When authenticated user info is available, use this user
ID in place of the IP address. In case of a HTTP-based injection
point, use the HTTP client IP address. See the appendix for detailed
Additional /ntoken/ parts SHOULD be generated if necessary in a way
that it is possible for the local admin, and for the local admin only,
to find out the identity of the poster. This may include the precise
system time, process IDs or other info. This info SHOULD be encrypted
if its knowledge is otherwise useful to outside parties.
3.2. Mailinglist to news gateways
The first /ctoken/ SHOULD always be the base64 encoding of the original
mail's Message-ID. If no such header is present, the news Message-ID
generated by the gateway should be used. All gateways SHOULD use this
information to prevent loops.
This recommendation also holds for other gateways, e.g. BBS to news.
If the originating system provides authenticated user information this
should be used to construct an additional /ctoken/ as of section 3.1.
3.3. Posting robots
Bulk postings by legitimate robots (e.g. weather reports, NoCeM
notices) SHOULD generate no /ctoken/ at all, to exempt these posters
from rate-limiting done by comparing /ctoken/ values. Additional
information MAY be encoded into /ntoken/ items.
4. Processing and analyzing the headers
4.1. Handling of incoming articles
Any X-Trace header present in an article coming in, whether by POST or
regular feed, MUST NOT be changed or deleted. One additional X-Trace
header MAY be added. An article SHOULD NOT be rejected just because of
the presence of an X-Trace header. (Note this is changed from current
The X-Trace header can be analyzed by any system where the article
arrived, giving information such as:
- Any X-Trace header present indicates and identifies an original
injection point, gateway or POST feed.
- If an X-Trace header is present with the same /systemid/ as the local
system, a message loop has occurred. (The only cause can be that
some kind of gateway or POST feed was crossed which changes or
deletes the Path or Message-ID headers. The present X-Trace headers
then give a hint on where that failure occurred.)
- The presence of identical /ctoken/ fields in corresponding X-Trace
headers of different articles in short succession indicate multiple
postings by the same user or POST feed. Each /ctoken/ field should
be compared by itself for that purpose.
This information can be used for rate-limiting. However, if more
than one X-Trace header is present, a rejection caused by comparing
only one of them SHOULD NOT be noted in the article history (because
it may have come from a legitimate POST feed).
- The /ntoken/ fields are not relevant except to the generating system.
When reporting trouble (such as malfunctioning systems or misbehaving
users), the reports always should include the complete set of headers.
Each system administrator should be able to get all relevant
information out of his own X-Trace header. Systems generating X-Trace
headers MAY insert a relevant reporting address into a comment item,
this is especially encouraged when the address differs from the system
5. Other headers
The header presented here includes the information present in the
existing INN-type X-Trace header, the NNTP-Posting-Host and (possibly)
NNTP-Posting-Date headers, the X-Complaint-To header (as comment) and
the "<address>.POSTED" Path entries. Generation of these items may
therefore be omitted.
The additional loop-prevention properties MUST NOT be taken as an
excuse to violate the strict prohibition of changing or deleting any
existing Message-ID or Date header or manipulating the existing part
of the Path header.
Appendix: Recommendation for generating /ctoken/ from client info
The client info is encoded into an 64 bit or 128 bit block as given
below and encrypted using a 64 bit block cipher. Use the first
available method from this list.
If the client gives an authenticated user ID:
bits 0..15: Upper 16 bits of Unix system time. (I.e. this changes
approximately every 18 hours.)
bit 16..19: 0001 (indicative of user ID and reserved bits).
bits 20..63: User ID of client. If the user ID is non-numeric, an
injective function should be used if possible to map
it to a number.
If the client is only identified by an IPv4 address:
bits 0..15: Upper 16 bits of Unix system time.
bits 16..19: 0010 (indicative of IP address and reserved bits).
bits 20..31: Unused.
bits 32..63: IPv4 address of client. (Use the HTTP client in case of
HTTP based gateways!)
If the client is only identified by an IPv6 address:
Find the rightmost 16-bit word consisting of all zeros in the
address and replace that with the upper 16 bit of the Unix system
time. If the address contains no all-zeros word use the leftmost
word instead. Use the widest-scope address available.
Rationale for this method: this yields a 128-bit block which is good
for block encryption.
$Id: xtrace-protocol,v 1.1 2000/07/04 17:29:23 olaf Exp $
More information about the inn-workers