chiark / gitweb /
noip.c: Support IPv6-mapped IPv4 addresses (nearly) correctly.
[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.
7be80f86
MW
178.TP
179.BI "impbind " bind-rule
180Add an entry to the implicit-bind rule list. When a program attempts to
181.BR connect (2)
182a socket without binding its local address first,
183.B noip
184consults this list to decide on the correct local address to assign.
185Each entry in the list has the form
186.RS
187.IP
188.I address-range
189.IR address | \c
190.B same
191.PP
192The rules are tried in order: if the remote address matches (in the same
193way as in an ACL entry) the address range on the left side of the rule,
194then the socket is bound to the address from the right side; if the
195address on the right is
196.B same
197then the remote address is used.
198.PP
199Three environment variables
200are consulted too:
201.BR NOIP_IMPBIND_BEFORE ,
202.BR NOIP_IMPBIND ,
203and
204.BR NOIP_IMPBIND_AFTER .
205The
206.B _BEFORE
207rules are inserted at the front of the list; the
208.B _AFTER
209rules are appended on the end. Currently, the rules in
210.B NOIP_IMPBIND
211are also put at the end (before the
212.B _AFTER
213rules), though this may change later.
214.RE
e4976bb0 215.PP
216(Aside: An attempt to connect to a remote host may not be a hopeless failure,
217even if a real IP socket is denied:
218.B noip
219deliberately makes no attempt to check that addresses being bound to
220sockets correspond to locally available addresses; and besides, sockets
221can be introduced into the directory by other programs simulating remote
222servers.)
223.PP
224An
225.I acl-entry
a6d9626b 226is a comma-separated list of entries of the form:
e4976bb0 227.IP
228.BR + | \-
0a6ab6a1 229.I address-range
e4976bb0 230.RB [ : \c
0a6ab6a1 231.IR port-range ]
e4976bb0 232.PP
233(The spaces in the above are optional.)
234.PP
99222954 235The leading sign says whether matching addresses should be
e4976bb0 236.I accepted
237.RB (` + ')
238or
239.I denied
240.RB (` \- ').
241.PP
0a6ab6a1
MW
242The
243.I address-range
244portion may be any of the following.
e4976bb0 245.TP
246.B any
247Matches all addresses.
248.TP
249.B local
250Matches the address of one of the machine's network interfaces.
251.TP
252.I address
2a06ea0b 253Matches just the given IPv4 or IPv6 address. An
9314b85a 254.I address
2a06ea0b
MW
255may be enclosed in square brackets; IPv6 addresses must be so enclosed,
256because colons are significant in the rest of the ACL syntax.
e4976bb0 257.TP
258.IB address \- address
259Matches any address which falls in the given range. Addresses are
260compared lexicographically, with octets to the left given precedence
261over octets to the right.
262.TP
9314b85a
MW
263.IB address / prefix-length
264Matches an address in the given network.
e4976bb0 265.PP
0a6ab6a1
MW
266The
267.I port-range
268may be omitted (which means `match any port'), or may be a single
e4976bb0 269.I port
270or a range
271.IB port \- port
272to match.
273.PP
274Range comparisons are always inclusive of both endpoints.
275.PP
276ACL entries are processed in the order they appear in the configuration
277file. The default action of an ACL, used if none of its entries match,
278is the opposite of the last actual entry in the list: if the last entry
279says `accept', then the default is to deny, and vice-versa. If the ACL
280is empty, the default is to deny all addresses.
281.PP
282For example, it may be useful to allow access at least to a DNS server.
283This can be accomplished by adding a line
284.VS
a8be0591 285realconnect +1.2.3.4:53
e4976bb0 286.VE
287to the configuration file, where 1.2.3.4 is the IP address of one of
288your DNS server.
289.SS Example applications
290SLIME is an Emacs extension for doing interactive programming with Lisp
291systems. It communicates with the Lisp system using TCP sockets, since
292Unix-domain sockets are unavailable on Windows, and besides, they are
293less well supported by Lisp implementations. Unfortunately, when the
294author wrote this program, SLIME applied no authentication on its TCP
295port, allowing any local user to take over the running Lisp. Worse,
296some Lisps are unable to bind a listening socket to a particular
297address, leaving the socket potentially available to anyone on the
298network. By running Emacs under
299.BR noip ,
300the security hole is closed completely and no messing with
301authentication secrets is needed.
302.PP
303SSH is an excellent tool for secure communications over hostile
304networks. In particular, its ability to forward TCP connections to a
305port on one side of an SSH tunnel to the other side is very useful.
306However, such a forwarded port is available to all users on the source
307side of the tunnel. Using
308.B noip
309and a suitable configuration, a user can restrict access to a forwarded
310port to himself or a small group.
311.SH BUGS
312.B noip
313is implemented as an
314.B LD_PRELOAD
315hack. It won't work on setuid programs. Also, perhaps more
a8be0591 316importantly, it can't do anything to prevent a
e4976bb0 317.I malicious
a8be0591 318program's use of networking: a program could theoretically issue sockets
e4976bb0 319system calls directly instead of using the C library calls that
320.B noip
321intercepts. It is intended only as a tool for enhancing the security of
322software written by well-meaning programmers who don't understand the
323security aspects of writing networking code.
324.PP
325It's very hard to tell exactly what state a Unix-domain socket is in.
326If the filesystem object isn't there, it's not active, but if it
327.I is
328then the socket might be in use or it might be stale.
329.B noip
330consults
331.B /proc/net/unix
332to decide whether a socket is in use, but this can fail in two ways.
333Firstly, if the socket is created and renamed, the kernel doesn't
334notice, and
335.B noip
336will think that the new name is stale. Secondly, if the socket is
337created, used, unlinked while it's still in use, and recreated, then
338.B noip
339will think that it's in use when in fact it's gone stale. Don't mess
340with
341.BR noip 's
342sockets unless you know what you're doing.
343.PP
344The procedure to replace a Unix-domain socket by an Internet one is
345fairly thorough, but there are some missing cases. In particular, if
346the socket being bound or connected is a duplicate (using
347.BR dup (2))
348then only one of the copies will be fixed. Similarly, copies owned by
349child processes will be unaffected.
350.PP
351This manual is surprisingly long and complicated for such a simple hack.
352.SH AUTHOR
a8be0591 353Mark Wooding, <mdw@distorted.org.uk>