[svn-upgrade] Integrating new upstream version, iodine (0.5.1)
[debian/iodine.git] / README
1
2 iodine - http://code.kryo.se/iodine
3
4 ***********************************
5
6 This is a piece of software that lets you tunnel IPv4 data through a DNS
7 server. This can be usable in different situations where internet access is
8 firewalled, but DNS queries are allowed.
9
10
11 QUICKSTART:
12
13 Try it out within your own LAN! Follow these simple steps:
14 - On your server, run: ./iodined -f 10.0.0.1 test.asdf
15   (If you already use the 10.0.0.0 network, use another internal net like 
16   172.16.0.0)
17 - Enter a password
18 - On the client, run: ./iodine -f 192.168.0.1 test.asdf
19   (Replace 192.168.0.1 with the server's ip address)
20 - Enter the same password
21 - Now the client has the tunnel ip 10.0.0.2 and the server has 10.0.0.1
22 - Try pinging each other through the tunnel
23 - Done! :)
24 To actually use it through a relaying nameserver, see below.
25
26
27 HOW TO USE:
28
29 Server side:
30 To use this tunnel, you need control over a real domain (like mytunnel.com),
31 and a server with a public IP number. If the server already runs a DNS
32 server, change the listening port and then use the -b option to let
33 iodined forward the DNS requests. Then, delegate a subdomain 
34 (say, tunnel1.mytunnel.com) to the server. If you use BIND for the domain, 
35 add these lines to the zone file:
36
37 tunnel1host     IN      A       10.15.213.99
38 tunnel1         IN      NS      tunnel1host.mytunnel.com.
39
40 Do not use CNAME instead of A above.
41 If your server has a dynamic IP, use a dynamic dns provider:
42
43 tunnel1         IN      NS      tunnel1host.mydyndnsprovider.com
44
45 Now any DNS querys for domains ending with tunnel1.mytunnnel.com will be sent
46 to your server. Start iodined on the server. The first argument is the tunnel
47 IP address (like 192.168.99.1) and the second is the assigned domain (in this
48 case tunnel1.mytunnel.com). The -f argument will keep iodined running in the
49 foreground, which helps when testing. iodined will start a virtual interface,
50 and also start listening for DNS queries on UDP port 53. Either enter a
51 password on the commandline (-P pass) or after the server has started. Now 
52 everything is ready for the client.
53
54 Client side: 
55 All the setup is done, just start iodine. It takes up to two arguments, the
56 first is the local relaying DNS server (optional) and the second is the domain
57 used (tunnel1.mytunnnel.com). If DNS queries are allowed to any computer, you
58 can use the tunnel endpoint (example: 10.15.213.99 or tunnel1host.mytunnel.com)
59 as the first argument. The tunnel interface will get an IP close to the servers
60 (in this case 192.168.99.2) and a suitable MTU.  Enter the same password as on
61 the server either by argument or after the client has started. Now you should
62 be able to ping the other end of the tunnel from either side.  
63
64
65 MISC. INFO:
66
67 Try experimenting with the MTU size (-m option) to get maximum bandwidth. It is
68 set to 1024 by default, which seems to work with most DNS servers. If you have
69 problems, try setting it to 220 as this ensures all packets to be < 512 bytes.
70 Some DNS servers enforce a 512 byte packet limit, and this is probably the case
71 if you can ping through the tunnel but not login via SSH.
72
73 If you have problems, try inspecting the traffic with network monitoring tools
74 and make sure that the relaying DNS server has not cached the response. A
75 cached error message could mean that you started the client before the server.
76
77 The upstream data is sent gzipped encoded with Base32, or Base64 if the relay
78 server support '+' in domain names. DNS protocol allows one query per packet,
79 and one query can be max 256 chars. Each domain name part can be max 63 chars.
80 So your domain name and subdomain should be as short as possible to allow
81 maximum upstream throughput.
82
83
84 TIPS & TRICKS:
85
86 If your port 53 is taken on a specific interface by an application that does 
87 not use it, use -p on iodined to specify an alternate port (like -p 5353) and 
88 use for instance iptables (on Linux) to forward the traffic:
89 iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to :5353
90 (Sent in by Tom Schouten)
91
92
93 PORTABILITY:
94
95 iodine has been tested on Linux (arm, ia64, x86, AMD64 and SPARC64), FreeBSD
96 (ia64, x86), OpenBSD (x86), NetBSD (x86), MacOS X (ppc and x86, with
97 http://tuntaposx.sourceforge.net/). and Windows (with OpenVPN TAP32 driver, see
98 win32 readme file).  It should be easy to port to other unix-like systems that
99 has TUN/TAP tunneling support. Let us know if you get it to run on other
100 platforms. 
101
102
103 THE NAME:
104
105 The name iodine was chosen since it starts with IOD (IP Over DNS) and since
106 iodine has atomic number 53, which happens to be the DNS port number.
107
108
109 THANKS:
110
111 - To kuxien for FreeBSD and OS X testing
112 - To poplix for code audit
113
114
115 AUTHORS & LICENSE:
116
117 Copyright (c) 2006-2009 Bjorn Andersson <flex@kryo.se>, Erik Ekman <yarrick@kryo.se>
118
119 Permission to use, copy, modify, and distribute this software for any purpose
120 with or without fee is hereby granted, provided that the above copyright notice
121 and this permission notice appear in all copies.
122
123 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
124 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
125 FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
126 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
127 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
128 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
129 PERFORMANCE OF THIS SOFTWARE.
130
131
132 MD5 implementation by L. Peter Deutsch (license and source in src/md5.[ch])
133 Copyright (C) 1999, 2000, 2002 Aladdin Enterprises.  All rights reserved.