xref: /freebsd/usr.sbin/inetd/inetd.8 (revision 1b6c76a2fe091c74f08427e6c870851025a9cf67)
1.\" Copyright (c) 1985, 1991, 1993, 1994
2.\"	The Regents of the University of California.  All rights reserved.
3.\"
4.\" Redistribution and use in source and binary forms, with or without
5.\" modification, are permitted provided that the following conditions
6.\" are met:
7.\" 1. Redistributions of source code must retain the above copyright
8.\"    notice, this list of conditions and the following disclaimer.
9.\" 2. Redistributions in binary form must reproduce the above copyright
10.\"    notice, this list of conditions and the following disclaimer in the
11.\"    documentation and/or other materials provided with the distribution.
12.\" 3. All advertising materials mentioning features or use of this software
13.\"    must display the following acknowledgement:
14.\"	This product includes software developed by the University of
15.\"	California, Berkeley and its contributors.
16.\" 4. Neither the name of the University nor the names of its contributors
17.\"    may be used to endorse or promote products derived from this software
18.\"    without specific prior written permission.
19.\"
20.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30.\" SUCH DAMAGE.
31.\"
32.\"     from: @(#)inetd.8	8.3 (Berkeley) 4/13/94
33.\" $FreeBSD$
34.\"
35.Dd February 7, 1996
36.Dt INETD 8
37.Os BSD 4.4
38.Sh NAME
39.Nm inetd
40.Nd internet
41.Dq super-server
42.Sh SYNOPSIS
43.Nm
44.Op Fl d
45.Op Fl l
46.Op Fl w
47.Op Fl W
48.Op Fl c Ar maximum
49.Op Fl C Ar rate
50.Op Fl a Ar address | hostname
51.Op Fl p Ar filename
52.Op Fl R Ar rate
53.Op Ar configuration file
54.Sh DESCRIPTION
55The
56.Nm
57program
58should be run at boot time by
59.Pa /etc/rc
60(see
61.Xr rc 8 ) .
62It then listens for connections on certain
63internet sockets.  When a connection is found on one
64of its sockets, it decides what service the socket
65corresponds to, and invokes a program to service the request.
66The server program is invoked with the service socket
67as its standard input, output and error descriptors.
68After the program is
69finished,
70.Nm
71continues to listen on the socket (except in some cases which
72will be described below).  Essentially,
73.Nm
74allows running one daemon to invoke several others,
75reducing load on the system.
76.Pp
77The following options are available:
78.Bl -tag -width indent
79.It Fl d
80Turn on debugging.
81.It Fl l
82Turn on logging of successful connections.
83.It Fl w
84Turn on TCP Wrapping for external services.
85See the
86.Sx "IMPLEMENTATION NOTES"
87section for more information on TCP Wrappers support.
88.It Fl W
89Turn on TCP Wrapping for internal services which are built in to
90.Nm .
91.It Fl c Ar maximum
92Specify the default maximum number of
93simultaneous invocations of each service;
94the default is unlimited.
95May be overridden on a per-service basis with the "max-child"
96parameter.
97.It Fl C Ar rate
98Specify the default maximum number of times a service can be invoked
99from a single IP address in one minute; the default is unlimited.
100May be overridden on a per-service basis with the
101"max-connections-per-ip-per-minute" parameter.
102.It Fl R Ar rate
103Specify the maximum number of times a service can be invoked
104in one minute; the default is 256.
105A rate of 0 allows an unlimited number of invocations.
106.It Fl a
107Specify one specific IP address to bind to.
108Alternatively, a hostname can be specified,
109in which case the IPv4 or IPv6 address
110which corresponds to that hostname is used.
111Usually a hostname is specified when
112.Nm
113is run inside a
114.Xr jail 8 ,
115in which case the hostname corresponds to the
116.Xr jail 8
117environment.
118.Pp
119When hostname specification is used
120and both IPv4 and IPv6 bindings are desired,
121one entry with the appropriate
122.Em protocol
123type for each binding
124is required for each service in
125.Pa /etc/inetd.conf .
126For example,
127a TCP-based service would need two entries,
128one using
129.Dq tcp4
130for the
131.Em protocol
132and the other using
133.Dq tcp6 .
134See the explanation of the
135.Pa /etc/inetd.conf
136.Em protocol
137field below.
138.It Fl p
139Specify an alternate file in which to store the process ID.
140.El
141.Pp
142Upon execution,
143.Nm
144reads its configuration information from a configuration
145file which, by default, is
146.Pa /etc/inetd.conf .
147There must be an entry for each field of the configuration
148file, with entries for each field separated by a tab or
149a space.  Comments are denoted by a
150.Dq #
151at the beginning
152of a line.  There must be an entry for each field.  The
153fields of the configuration file are as follows:
154.Pp
155.Bd -unfilled -offset indent -compact
156service name
157socket type
158protocol
159{wait|nowait}[/max-child[/max-connections-per-ip-per-minute]]
160user[:group][/login-class]
161server program
162server program arguments
163.Ed
164.Pp
165To specify an
166.Tn "ONC RPC" Ns -based
167service, the entry would contain these fields:
168.Pp
169.Bd -unfilled -offset indent -compact
170service name/version
171socket type
172rpc/protocol
173user[:group][/login-class]
174server program
175server program arguments
176.Ed
177.Pp
178There are two types of services that
179.Nm
180can start: standard and TCPMUX.
181A standard service has a well-known port assigned to it;
182it may be a service that implements an official Internet standard or is a
183BSD-specific service.
184As described in
185.Tn RFC 1078 ,
186TCPMUX services are nonstandard services that do not have a
187well-known port assigned to them.
188They are invoked from
189.Nm
190when a program connects to the
191.Dq tcpmux
192well-known port and specifies
193the service name.
194This feature is useful for adding locally-developed servers.
195TCPMUX requests are only accepted when the multiplexor service itself
196is enabled, above and beyond and specific TCPMUX-based servers; see the
197discussion of internal services below.
198.Pp
199The
200.Em service-name
201entry is the name of a valid service in
202the file
203.Pa /etc/services ,
204or the specification of a
205.Ux
206domain socket (see below).
207For
208.Dq internal
209services (discussed below), the service
210name
211should
212be the official name of the service (that is, the first entry in
213.Pa /etc/services ) .
214When used to specify an
215.Tn "ONC RPC" Ns -based
216service, this field is a valid RPC service name in
217the file
218.Pa /etc/rpc .
219The part on the right of the
220.Dq /
221is the RPC version number.
222This
223can simply be a single numeric argument or a range of versions.
224A range is bounded by the low version to the high version -
225.Dq rusers/1-3 .
226For TCPMUX services, the value of the
227.Em service-name
228field consists of the string
229.Dq tcpmux
230followed by a slash and the
231locally-chosen service name.
232The service names listed in
233.Pa /etc/services
234and the name
235.Dq help
236are reserved.
237Try to choose unique names for your TCPMUX services by prefixing them with
238your organization's name and suffixing them with a version number.
239.Pp
240The
241.Em socket-type
242should be one of
243.Dq stream ,
244.Dq dgram ,
245.Dq raw ,
246.Dq rdm ,
247or
248.Dq seqpacket ,
249depending on whether the socket is a stream, datagram, raw,
250reliably delivered message, or sequenced packet socket.
251TCPMUX services must use
252.Dq stream .
253.Pp
254The
255.Em protocol
256must be a valid protocol or
257.Dq unix .
258Examples are
259.Dq tcp
260or
261.Dq udp ,
262both of which imply IPv4 for backward compatibility.
263The names
264.Dq tcp4
265and
266.Dq udp4
267specify IPv4 only.
268The names
269.Dq tcp6
270and
271.Dq udp6
272specify IPv6 only.
273The names
274.Dq tcp46
275and
276.Dq udp46
277specify that the entry accepts both IPv6 and IPv6 connections
278via a wildcard
279.Dv AF_INET6
280socket.
281If it is desired that the service is reachable via T/TCP, one should
282specify
283.Dq tcp/ttcp ,
284which implies IPv4 for backward compatibility.
285The name
286.Dq tcp4/ttcp
287specifies IPv4 only, while
288.Dq tcp6/ttcp
289specifies IPv6 only.
290The name
291.Dq tcp46/ttcp
292specify that the entry accepts both IPv6 and IPv6 connections
293via a wildcard
294.Dv AF_INET6
295socket.
296Rpc based services
297(for which only IPv4 is supported at this time)
298are specified with the
299.Dq rpc/tcp
300or
301.Dq rpc/udp
302service type.
303TCPMUX services must use
304.Dq tcp ,
305.Dq tcp4 ,
306.Dq tcp6
307or
308.Dq tcp46 .
309.Pp
310The
311.Em wait/nowait
312entry specifies whether the server that is invoked by
313.Nm
314will take over
315the socket associated with the service access point, and thus whether
316.Nm
317should wait for the server to exit before listening for new service
318requests.
319Datagram servers must use
320.Dq wait ,
321as they are always invoked with the original datagram socket bound
322to the specified service address.
323These servers must read at least one datagram from the socket
324before exiting.
325If a datagram server connects
326to its peer, freeing the socket so
327.Nm
328can receive further messages on the socket, it is said to be
329a
330.Dq multi-threaded
331server;
332it should read one datagram from the socket and create a new socket
333connected to the peer.
334It should fork, and the parent should then exit
335to allow
336.Nm
337to check for new service requests to spawn new servers.
338Datagram servers which process all incoming datagrams
339on a socket and eventually time out are said to be
340.Dq single-threaded .
341.Xr Comsat 8 ,
342.Pq Xr biff 1
343and
344.Xr talkd 8
345are both examples of the latter type of
346datagram server.
347.Xr Tftpd 8
348is an example of a multi-threaded datagram server.
349.Pp
350Servers using stream sockets generally are multi-threaded and
351use the
352.Dq nowait
353entry.
354Connection requests for these services are accepted by
355.Nm ,
356and the server is given only the newly-accepted socket connected
357to a client of the service.
358Most stream-based services operate in this manner.
359Stream-based servers that use
360.Dq wait
361are started with the listening service socket, and must accept
362at least one connection request before exiting.
363Such a server would normally accept and process incoming connection
364requests until a timeout.
365TCPMUX services must use
366.Dq nowait .
367.Pp
368The maximum number of outstanding child processes (or
369.Dq threads )
370for a
371.Dq nowait
372service may be explicitly specified by appending a
373.Dq /
374followed by the number to the
375.Dq nowait
376keyword.
377Normally
378(or if a value of zero is specified) there is no maximum.
379Otherwise,
380once the maximum is reached, further connection attempts will be
381queued up until an existing child process exits.
382This also works
383in the case of
384.Dq wait
385mode, although a value other than one (the
386default) might not make sense in some cases.
387You can also specify the maximum number of connections per minute
388for a given IP address by appending
389a
390.Dq /
391followed by the number to the maximum number of
392outstanding child processes.
393Once the maximum is reached, further
394connections from this IP address will be dropped until the end of the
395minute.
396.Pp
397The
398.Em user
399entry should contain the user name of the user as whom the server
400should run.  This allows for servers to be given less permission
401than root.
402Optional
403.Em group
404part separated by
405.Dq \&:
406allows to specify group name different
407than default group for this user.
408Optional
409.Em login-class
410part separated by
411.Dq /
412allows to specify login class different
413than default
414.Dq daemon
415login class.
416.Pp
417The
418.Em server-program
419entry should contain the pathname of the program which is to be
420executed by
421.Nm
422when a request is found on its socket.  If
423.Nm
424provides this service internally, this entry should
425be
426.Dq internal .
427.Pp
428The
429.Em server program arguments
430should be just as arguments
431normally are, starting with argv[0], which is the name of
432the program.  If the service is provided internally, the
433.Em service-name
434of the service (and any arguments to it) or the word
435.Dq internal
436should take the place of this entry.
437.Pp
438Currently, the only internal service to take arguments is
439.Dq auth .
440Without options, the service will always return
441.Dq ERROR\ : HIDDEN-USER .
442The available arguments to this service that alter its behavior are:
443.Bl -tag -width indent
444.It Fl d Ar fallback
445Provide a
446.Ar fallback
447username.
448If the real
449.Dq auth
450service is enabled
451(with the
452.Fl r
453option discussed below),
454return this username instead of an error
455when look ups fail
456for either socket credentials or the username.
457If the real
458.Dq auth
459service is disabled,
460return this username for every request.
461This is primarily useful when running this service on a NAT machine.
462.It Fl g
463Instead of returning
464the user's name to the ident requester,
465report a
466username made up of random alphanumeric characters,
467e.g.
468.Dq c0c993 .
469The
470.Fl g
471flag overrides not only the user names,
472but also any fallback name,
473.Pa .fakeid
474or
475.Pa .noident
476files.
477.It Fl t Xo
478.Ar sec Ns Op . Ns Ar usec
479.Xc
480Specify a timeout for the service.
481The default timeout is 10.0 seconds.
482.It Fl r
483Offer a real
484.Dq auth
485service, as per RFC 1413.
486All the remaining flags apply only in this case.
487.It Fl i
488Return numeric user IDs instead of usernames.
489.It Fl f
490If the file
491.Pa .fakeid
492exists in the home directory of the identified user, report the username
493found in that file instead of the real username.
494If the username found in
495.Pa .fakeid
496is that of an existing user,
497then the real username is reported.
498If the
499.Fl i
500flag is also given then the username in
501.Pa .fakeid
502is checked against existing user IDs instead.
503.It Fl F
504same as
505.Fl f
506but without the restriction that the username in
507.Pa .fakeid
508must not match an existing user.
509.It Fl n
510If the file
511.Pa .noident
512exists in the home directory of the identified user, return
513.Dq ERROR\ : HIDDEN-USER .
514This overrides any
515.Pa fakeid
516file which might exist.
517.It Fl o Ar osname
518Use
519.Ar osname
520instead of the name of the system as reported by
521.Xr uname 3 .
522.El
523.Pp
524The
525.Nm
526program
527also provides several other
528.Dq trivial
529services internally by use of
530routines within itself.  These services are
531.Dq echo ,
532.Dq discard ,
533.Dq chargen
534(character generator),
535.Dq daytime
536(human readable time), and
537.Dq time
538(machine readable time, in the form of the number of seconds since
539midnight, January 1, 1900).  All of these services are available in
540both TCP and UDP versions; the UDP versions will refuse service if the
541request specifies a reply port corresponding to any internal service.
542(This is done as a defense against looping attacks; the remote IP address
543is logged.)
544For details of these services, consult the
545appropriate
546.Tn RFC
547document.
548.Pp
549The TCPMUX-demultiplexing service is also implemented as an internal service.
550For any TCPMUX-based service to function, the following line must be included
551in
552.Pa inetd.conf :
553.Bd -literal -offset indent
554tcpmux	stream	tcp	nowait	root	internal
555.Ed
556.Pp
557When given the
558.Fl l
559option
560.Nm
561will log an entry to syslog each time a connection is accepted, noting the
562service selected and the IP-number of the remote requester if available.
563Unless otherwise specified in the configuration file,
564and in the absence of the
565.Fl W
566and
567.Fl w
568options,
569.Nm
570will log to the
571.Dq daemon
572facility.
573.Pp
574The
575.Nm
576program
577rereads its configuration file when it receives a hangup signal,
578.Dv SIGHUP .
579Services may be added, deleted or modified when the configuration file
580is reread.
581Except when started in debugging mode,
582.Nm
583records its process ID in the file
584.Pa /var/run/inetd.pid
585to assist in reconfiguration.
586.Sh IMPLEMENTATION NOTES
587.Ss TCP Wrappers
588When given the
589.Fl w
590option,
591.Nm
592will wrap all services specified as
593.Dq stream nowait
594or
595.Dq dgram
596except for
597.Dq internal
598services.
599If the
600.Fl W
601option is given, such
602.Dq internal
603services will be wrapped.
604If both options are given, wrapping for both
605internal and external services will be enabled.
606Either wrapping option
607will cause failed connections to be logged to the
608.Dq auth
609syslog facility.
610Adding the
611.Fl l
612flag to the wrapping options will include successful connections in the
613logging to the
614.Dq auth
615facility.
616.Pp
617Note that
618.Nm
619only wraps requests for a
620.Dq wait
621service while no servers are available to service requests.
622Once a
623connection to such a service has been allowed, inetd has no control
624over subsequent connections to the service until no more servers
625are left listening for connection requests.
626.Pp
627When wrapping is enabled, the
628.Pa tcpd
629daemon is not required, as that functionality is builtin.
630For more information on TCP Wrappers; see the relevant documentation (
631.Xr hosts_access 5
632).
633When reading that document, keep in mind that
634.Dq internal
635services have no associated daemon name.
636Therefore, the service name
637as specified in
638.Pa inetd.conf
639should be used as the daemon name for
640.Dq internal
641services.
642.Ss TCPMUX
643.Tn RFC 1078
644describes the TCPMUX protocol:
645``A TCP client connects to a foreign host on TCP port 1.  It sends the
646service name followed by a carriage-return line-feed <CRLF>.  The
647service name is never case sensitive.  The server replies with a
648single character indicating positive (+) or negative (\-)
649acknowledgment, immediately followed by an optional message of
650explanation, terminated with a <CRLF>.  If the reply was positive,
651the selected protocol begins; otherwise the connection is closed.''
652The program is passed the TCP connection as file descriptors 0 and 1.
653.Pp
654If the TCPMUX service name begins with a
655.Dq + ,
656.Nm
657returns the positive reply for the program.
658This allows you to invoke programs that use stdin/stdout
659without putting any special server code in them.
660.Pp
661The special service name
662.Dq help
663causes
664.Nm
665to list TCPMUX services in
666.Pa inetd.conf .
667.Ss IPsec
668The implementation includes a tiny hack
669to support IPsec policy settings for each socket.
670A special form of comment line, starting with
671.Dq Li #@ ,
672is interpreted as a policy specifier.
673Everything after the
674.Dq Li #@
675will be used as an IPsec policy string,
676as described in
677.Xr ipsec_set_policy 3 .
678Each
679policy specifier is applied to all the following lines in
680.Pa inetd.conf
681until the next policy specifier.
682An empty policy specifier resets the IPsec policy.
683.Pp
684If an invalid IPsec policy specifier appears in
685.Pa inetd.conf ,
686.Nm
687will provide an error message via the
688.Xr syslog 3
689interface and abort execution.
690.Ss Ux Domain Sockets
691In addition to running services on IP sockets,
692.Nm
693can also manage
694.Ux
695domain sockets.
696To do this you specify a
697.Em protocol
698of
699.Dq unix
700and specify the unix domain socket as the
701.Em service-name .
702The
703.Em service-type
704may be
705.Dq stream
706or
707.Dq dgram .
708The specification of the socket must be
709an absolute path name,
710optionally prefixed by an owner and mode
711of the form
712.Em :user:group:mode: .
713The specification:
714.Bd -literal -offset indent -compact
715:news:daemon:220:/var/run/sock
716.Ed
717creates a socket owned
718by user news in group daemon
719with permissions allowing only that user and group to connect.
720The default owner is the user that inetd is running as.
721The default mode only allows the socket's owner to connect.
722.Pp
723.Sy WARNING:
724while creating
725.Ux
726domain socket
727.Nm
728must change the ownership and permissions on the socket.
729This can only be done securely if
730the directory in which the socket is created
731is writable only by root.
732Do
733.Sy NOT
734use
735.Nm
736to create sockets in world writable directories,
737such as
738.Pa /tmp ,
739instead use
740.Pa /var/run
741or a similar directory.
742.Pp
743Internal services may be run on
744.Ux
745domain sockets, in the usual way.
746In this case
747the name of the internal service
748is determined using
749the last component of the socket's pathname.
750.Sh "FILES"
751.Bl -tag -width /var/run/inetd.pid -compact
752.It Pa /etc/inetd.conf
753configuration file
754.It Pa /etc/rpc
755translation of service names to RPC program numbers
756.It Pa /etc/services
757translation of service names to port numbers
758.It Pa /var/run/inetd.pid
759the pid of the currently running
760.Nm
761.El
762.Sh "EXAMPLES"
763.Pp
764Here are several example service entries for the various types of services:
765.Bd -literal
766ftp          stream  tcp   nowait root  /usr/libexec/ftpd        ftpd -l
767ntalk        dgram   udp   wait   root  /usr/libexec/ntalkd      ntalkd
768telnet       stream  tcp6  nowait root  /usr/libexec/telnetd  telnetd
769shell        stream  tcp46  nowait root  /usr/libexec/rshd rshd
770tcpmux/+date stream  tcp   nowait guest /bin/date                date
771tcpmux/phonebook stream tcp nowait guest /usr/local/bin/phonebook phonebook
772rstatd/1-3   dgram   rpc/udp wait root  /usr/libexec/rpc.rstatd  rpc.rstatd
773/var/run/echo stream unix  nowait root	internal
774#@ ipsec ah/require
775chargen      stream  tcp   nowait root  internal
776#@
777.Ed
778.Sh "ERROR MESSAGES"
779The
780.Nm
781server
782logs error messages using
783.Xr syslog 3 .
784Important error messages and their explanations are:
785.Pp
786.Bl -ohang -compact
787.It Xo
788.Ar service Ns / Ns Ar protocol
789.No "server failing (looping), service terminated."
790.Xc
791The number of requests for the specified service in the past minute
792exceeded the limit.
793The limit exists to prevent a broken program
794or a malicious user from swamping the system.
795This message may occur for several reasons:
796.Bl -enum -offset indent
797.It
798There are many hosts requesting the service within a short time period.
799.It
800A broken client program is requesting the service too frequently.
801.It
802A malicious user is running a program to invoke the service in
803a denial-of-service attack.
804.It
805The invoked service program has an error that causes clients
806to retry quickly.
807.El
808.Pp
809Use the
810.Fl R Ar rate
811option,
812as described above, to change the rate limit.
813Once the limit is reached, the service will be
814reenabled automatically in 10 minutes.
815.Pp
816.It Xo
817.Ar service Ns / Ns Ar protocol :
818.No \&No such user
819.Ar user ,
820.No service ignored
821.Xc
822.It Xo
823.Ar service Ns / Ns Ar protocol :
824.No getpwnam :
825.Ar user :
826.No \&No such user
827.Xc
828No entry for
829.Ar user
830exists in the
831.Xr passwd 5
832database.
833The first message
834occurs when
835.Nm
836(re)reads the configuration file.
837The second message occurs when the
838service is invoked.
839.Pp
840.It Xo
841.Ar service :
842.No can't set uid
843.Ar uid
844.Xc
845.It Xo
846.Ar service :
847.No can't set gid
848.Ar gid
849.Xc
850The user or group ID for the entry's
851.Ar user
852field is invalid.
853.Pp
854.It "setsockopt(SO_PRIVSTATE): Operation not supported"
855The
856.Nm
857program attempted to renounce the privileged state associated with a
858socket but was unable to.
859.El
860.Sh SEE ALSO
861.Xr hosts_access 5 ,
862.Xr hosts_options 5 ,
863.Xr ipsec_set_policy 3 ,
864.Xr login.conf 5 ,
865.Xr passwd 5 ,
866.Xr rpc 5 ,
867.Xr services 5 ,
868.Xr comsat 8 ,
869.Xr fingerd 8 ,
870.Xr ftpd 8 ,
871.Xr rpcbind 8 ,
872.Xr rexecd 8 ,
873.Xr rlogind 8 ,
874.Xr rshd 8 ,
875.Xr telnetd 8 ,
876.Xr tftpd 8
877.Rs
878.%A Michael C. St. Johns
879.%T Identification Protocol
880.%O RFC1413
881.Re
882.Sh HISTORY
883The
884.Nm
885command appeared in
886.Bx 4.3 .
887TCPMUX is based on code and documentation by Mark Lottor.
888Support for
889.Tn "ONC RPC"
890based services is modeled after that
891provided by
892.Tn SunOS
8934.1.
894The IPsec hack was contributed by the KAME project in 1999.
895The
896.Fx
897TCP Wrappers support first appeared in
898.Fx 3.2 .
899