chiark / gitweb /
noip.c, noip.1: Add IPv6 support.
[preload-hacks] / noip.1
CommitLineData
e4976bb0 1.de VS
2.sp 1
3.RS
4.nf
5.ft B
6..
7.de VE
8.ft R
9.fi
10.RE
11.sp 1
12..
13.TH noip 1 "5 May 2005" "Straylight/Edgeware" "Preload hacks"
14.SH NAME
15noip \- run programs without the ability to use IP sockets
16.SH SYNOPSIS
17.B noip
18.RI [ command
19.RI [ args ...]]
20.SH DESCRIPTION
21The
22.B noip
23program runs
24.I command
25(by default, the user's shell, as determined by the
26.B SHELL
27environment variable) in an environment where attempts to use TCP/IP
28networking are (mostly) transparently translated into the use of
29Unix-domain sockets in a private directory.
30.PP
31There are many programs which use TCP/IP for their own internal
32communications needs, largely unnecessarily. This can present security
33problems: even if a program binds its listening sockets to
34.BR localhost ,
35other users on the same system can still connect, and many such programs
36don't seem to have authentication systems.
37.PP
38.B noip
39addresses this problem by intercepting a program's networking calls and
40making it use Unix-domain sockets in a private directory instead of
41TCP/IP. Now its communications are truly private to the running user.
42.SS The socket directory
43The
44.B noip
45program keeps its sockets in a directory whose name can be configured,
46but by default is
47.BI noip- \c
48.IR username ,
49where
50.I username
51is determined by the
52.B USER
53or
54.B LOGNAME
55environment variables, or is
56.BI uid- \c
57.IR realuid
58in the temporary directory, which in turn is determined by the
59.B TMPDIR
60or
61.B TMP
62environment variables, or is
63.BR /tmp .
64The sockets in this directory are simply named
65.IB dottedquad : port
66after the Internet sockets they represent.
67.PP
68If the socket directory does not exist when a program running under
69.B noip
70starts up, it is created and made readable and writable only by the
71current user. Also, it is scanned and any apparently stale sockets are
72removed.
73.SS Configuration
74The operation of
75.B noip
76is controlled by a configuration file. By default,
77.B noip
78reads configuration from
79.B .noip
80in the calling user's home directory, as determined by the
81.B HOME
5b49f527 82environment, or, failing that, looking up the effective user id in the
83password database. However, if the environment variable
a6d9626b 84.B NOIP_CONFIG
85is set, then the file it names is read instead (assuming it exists; if
86it doesn't, no configuration is read).
e4976bb0 87.PP
88The configuration file has a simple line-based format. A line is
89ignored if it consists only of whitespace, or if its first whitespace
90character is
91.RB ` # '.
92Otherwise, the first whitespace-delimited word is a keyword and the
93remainder of the line is a value. The following keywords are
94recognized.
95.TP
96.BR "debug " [\fInumber\fR]
97If
98.I number
99is nonzero, turn debugging on; if it is zero, turn debugging off. The
100default, if no
101.I number
102is given, is to turn debugging on. Debugging is written to standard
103error. Some debugging is produced before the configuration file is
104read; the environment variable
105.B NOIP_DEBUG
106can be used to control this.
107.TP
108.BI "socketdir " directory
109Store the Unix-domain sockets in
110.IR directory
a6d9626b 111rather than the default. The environment variable
112.B NOIP_SOCKETDIR
113can also be used to control which directory is used for sockets.
e4976bb0 114.TP
f6049fdd 115.BI "autoports " min "\-" max
116Select which ports are used for implicit binding. Allocating ports can
117be a bit slow, since checking whether a Unix domain socket is in use is
118difficult. A wide range makes things easier, because
119.B noip
120starts by trying ports at random from the given range. The environment
121variable
122.B NOIP_AUTOPORTS
123can also be used to control which ports are assigned automatically.
124.TP
e4976bb0 125.BI "realbind " acl-entry
126Add an entry to the
127.B realbind
128access control list (ACL). When a program attempts to
129.BR bind (2)
130a socket to an address, the
131.B realbind
132ACL is consulted. If the address is matched, then the program is
133allowed to bind a real Internet socket to that address; otherwise, the
a6d9626b 134socket is bound to a Unix-domain socket. Three environment variables
135are consulted too:
136.BR NOIP_REALBIND_BEFORE ,
137.BR NOIP_REALBIND ,
138and
139.BR NOIP_REALBIND_AFTER .
140The
141.B _BEFORE
142rules are inserted at the front of the list; the
143.B _AFTER
144rules are appended on the end. Currently, the rules in
145.B NOIP_REALBIND
146are also put at the end (before the
147.B _AFTER
148rules), though this may change later.
e4976bb0 149.TP
a6d9626b 150.BI "realconnect " acl-entry
e4976bb0 151Add an entry to the
152.B realconnect
153access control list (ACL). When a program attempts to
154.BR connect (2)
155a socket to an address, or to contact another socket using
156.BR sendto (2)
157or
158.BR sendmsg (2),
159the
160.B realconnect
161ACL is consulted. If the destination address is matched, then the
162program is allowed to contact the real Internet socket; otherwise, the
a6d9626b 163attempt is made to contact a Unix-domain socket. Three environment variables
164are consulted too:
165.BR NOIP_REALCONNET_BEFORE ,
166.BR NOIP_REALCONNECT ,
167and
168.BR NOIP_REALCONNECT_AFTER .
169The
170.B _BEFORE
171rules are inserted at the front of the list; the
172.B _AFTER
173rules are appended on the end. Currently, the rules in
174.B NOIP_REALCONNECT
175are also put at the end (before the
176.B _AFTER
177rules), though this may change later.
e4976bb0 178.PP
179(Aside: An attempt to connect to a remote host may not be a hopeless failure,
180even if a real IP socket is denied:
181.B noip
182deliberately makes no attempt to check that addresses being bound to
183sockets correspond to locally available addresses; and besides, sockets
184can be introduced into the directory by other programs simulating remote
185servers.)
186.PP
187An
188.I acl-entry
a6d9626b 189is a comma-separated list of entries of the form:
e4976bb0 190.IP
191.BR + | \-
192.IR address \c
193.RB [ \- \c
194.IR address | \c
195.BR / \c
9314b85a 196.IR prefix-length ]| \c
e4976bb0 197.BR local | any
198.RB [ : \c
199.IR port [ \c
200.BI \- \c
201.IR port ]]
202.PP
203(The spaces in the above are optional.)
204.PP
205The leading sign says whether
206matching addresses should be
207.I accepted
208.RB (` + ')
209or
210.I denied
211.RB (` \- ').
212.PP
213The IP-address portion may be any of the following
214.TP
215.B any
216Matches all addresses.
217.TP
218.B local
219Matches the address of one of the machine's network interfaces.
220.TP
221.I address
2a06ea0b 222Matches just the given IPv4 or IPv6 address. An
9314b85a 223.I address
2a06ea0b
MW
224may be enclosed in square brackets; IPv6 addresses must be so enclosed,
225because colons are significant in the rest of the ACL syntax.
e4976bb0 226.TP
227.IB address \- address
228Matches any address which falls in the given range. Addresses are
229compared lexicographically, with octets to the left given precedence
230over octets to the right.
231.TP
9314b85a
MW
232.IB address / prefix-length
233Matches an address in the given network.
e4976bb0 234.PP
235The port portion may be omitted (which means `match any port'), or may
236be a single
237.I port
238or a range
239.IB port \- port
240to match.
241.PP
242Range comparisons are always inclusive of both endpoints.
243.PP
244ACL entries are processed in the order they appear in the configuration
245file. The default action of an ACL, used if none of its entries match,
246is the opposite of the last actual entry in the list: if the last entry
247says `accept', then the default is to deny, and vice-versa. If the ACL
248is empty, the default is to deny all addresses.
249.PP
250For example, it may be useful to allow access at least to a DNS server.
251This can be accomplished by adding a line
252.VS
a8be0591 253realconnect +1.2.3.4:53
e4976bb0 254.VE
255to the configuration file, where 1.2.3.4 is the IP address of one of
256your DNS server.
257.SS Example applications
258SLIME is an Emacs extension for doing interactive programming with Lisp
259systems. It communicates with the Lisp system using TCP sockets, since
260Unix-domain sockets are unavailable on Windows, and besides, they are
261less well supported by Lisp implementations. Unfortunately, when the
262author wrote this program, SLIME applied no authentication on its TCP
263port, allowing any local user to take over the running Lisp. Worse,
264some Lisps are unable to bind a listening socket to a particular
265address, leaving the socket potentially available to anyone on the
266network. By running Emacs under
267.BR noip ,
268the security hole is closed completely and no messing with
269authentication secrets is needed.
270.PP
271SSH is an excellent tool for secure communications over hostile
272networks. In particular, its ability to forward TCP connections to a
273port on one side of an SSH tunnel to the other side is very useful.
274However, such a forwarded port is available to all users on the source
275side of the tunnel. Using
276.B noip
277and a suitable configuration, a user can restrict access to a forwarded
278port to himself or a small group.
279.SH BUGS
280.B noip
281is implemented as an
282.B LD_PRELOAD
283hack. It won't work on setuid programs. Also, perhaps more
a8be0591 284importantly, it can't do anything to prevent a
e4976bb0 285.I malicious
a8be0591 286program's use of networking: a program could theoretically issue sockets
e4976bb0 287system calls directly instead of using the C library calls that
288.B noip
289intercepts. It is intended only as a tool for enhancing the security of
290software written by well-meaning programmers who don't understand the
291security aspects of writing networking code.
292.PP
293It's very hard to tell exactly what state a Unix-domain socket is in.
294If the filesystem object isn't there, it's not active, but if it
295.I is
296then the socket might be in use or it might be stale.
297.B noip
298consults
299.B /proc/net/unix
300to decide whether a socket is in use, but this can fail in two ways.
301Firstly, if the socket is created and renamed, the kernel doesn't
302notice, and
303.B noip
304will think that the new name is stale. Secondly, if the socket is
305created, used, unlinked while it's still in use, and recreated, then
306.B noip
307will think that it's in use when in fact it's gone stale. Don't mess
308with
309.BR noip 's
310sockets unless you know what you're doing.
311.PP
312The procedure to replace a Unix-domain socket by an Internet one is
313fairly thorough, but there are some missing cases. In particular, if
314the socket being bound or connected is a duplicate (using
315.BR dup (2))
316then only one of the copies will be fixed. Similarly, copies owned by
317child processes will be unaffected.
318.PP
319This manual is surprisingly long and complicated for such a simple hack.
320.SH AUTHOR
a8be0591 321Mark Wooding, <mdw@distorted.org.uk>