Release 0.3.1

This commit is contained in:
Erik Ekman 2006-07-11 08:54:05 +00:00
parent fa06d5eea1
commit 1feacfada3
6 changed files with 60 additions and 34 deletions

18
CHANGELOG Normal file
View File

@ -0,0 +1,18 @@
iodine - IP over DNS is now easy
http://code.kryo.se/iodine
********************************
CHANGES:
2006-07-11: 0.3.1
- Add Mac OSX support
- Add setting device name
- Use compression of domain name in reply (should allow setting MTU
approx 200 bytes higher)
2006-06-24: 0.3.0
- First public release
- Support for Linux, FreeBSD, OpenBSD

7
README
View File

@ -61,9 +61,10 @@ possible to allow maximum throughput.
PORTABILITY: PORTABILITY:
iodine has been tested on Linux (x86 and SPARC64), FreeBSD (x86) and iodine has been tested on Linux (x86 and SPARC64), FreeBSD (x86), OpenBSD (x86)
OpenBSD (x86). It should work on other unix-like systems as well that has and MacOS X (10.3, ppc, with http://www-user.rhrk.uni-kl.de/~nissler/tuntap/).
TUN/TAP tunneling support. Let us know if you get it to run on other platforms. It should work on other unix-like systems as well that has TUN/TAP tunneling
support. Let us know if you get it to run on other platforms.
THE NAME: THE NAME:

25
dns.c
View File

@ -19,11 +19,15 @@
#include <netinet/in.h> #include <netinet/in.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <arpa/nameser.h> #include <arpa/nameser.h>
#ifdef DARWIN
#include <arpa/nameser8_compat.h>
#endif
#include <netdb.h> #include <netdb.h>
#include <time.h> #include <time.h>
#include <err.h> #include <err.h>
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <stdint.h>
#include <unistd.h> #include <unistd.h>
#include <string.h> #include <string.h>
#include <ctype.h> #include <ctype.h>
@ -352,7 +356,6 @@ dns_read(int fd, char *buf, int buflen)
return 0; return 0;
} }
static int static int
host2dns(const char *host, char *buffer, int size) host2dns(const char *host, char *buffer, int size)
{ {
@ -386,6 +389,7 @@ dnsd_send(int fd, struct query *q, char *data, int datalen)
int len; int len;
char *p; char *p;
char buf[64*1024]; char buf[64*1024];
short name;
HEADER *header; HEADER *header;
memset(buf, 0, sizeof(buf)); memset(buf, 0, sizeof(buf));
@ -406,24 +410,21 @@ dnsd_send(int fd, struct query *q, char *data, int datalen)
p = buf + sizeof(HEADER); p = buf + sizeof(HEADER);
name = 0xc000 | ((p - buf) & 0x3fff);
p += host2dns(q->name, p, strlen(q->name)); p += host2dns(q->name, p, strlen(q->name));
PUTSHORT(q->type, p); PUTSHORT(q->type, p);
PUTSHORT(C_IN, p); PUTSHORT(C_IN, p);
p += host2dns(q->name, p, strlen(q->name)); PUTSHORT(name, p);
PUTSHORT(q->type, p); PUTSHORT(q->type, p);
PUTSHORT(C_IN, p); PUTSHORT(C_IN, p);
PUTLONG(0, p); PUTLONG(0, p);
q->id = 0; q->id = 0;
if(datalen > 0) { PUTSHORT(datalen, p);
PUTSHORT(datalen, p); memcpy(p, data, datalen);
memcpy(p, data, datalen); p += datalen;
p += datalen;
} else {
PUTSHORT(0, p);
}
len = p - buf; len = p - buf;
sendto(fd, buf, len, 0, (struct sockaddr*)&q->from, q->fromlen); sendto(fd, buf, len, 0, (struct sockaddr*)&q->from, q->fromlen);
@ -481,9 +482,7 @@ dnsd_read(int fd, struct query *q, char *buf, int buflen)
addrlen = sizeof(struct sockaddr); addrlen = sizeof(struct sockaddr);
r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen); r = recvfrom(fd, packet, sizeof(packet), 0, (struct sockaddr*)&from, &addrlen);
if(r == -1) { if (r >= sizeof(HEADER)) {
perror("recvfrom");
} else {
header = (HEADER*)packet; header = (HEADER*)packet;
id = ntohs(header->id); id = ntohs(header->id);
@ -508,6 +507,8 @@ dnsd_read(int fd, struct query *q, char *buf, int buflen)
return decodepacket(name, buf, buflen); return decodepacket(name, buf, buflen);
} }
} }
} else {
perror("recvfrom");
} }
return 0; return 0;

View File

@ -188,7 +188,7 @@ help() {
static void static void
version() { version() {
printf("iodine IP over DNS tunneling client\n"); printf("iodine IP over DNS tunneling client\n");
printf("version: 0.3\n"); printf("version: 0.3.1 from 2006-07-11\n");
exit(0); exit(0);
} }

View File

@ -188,7 +188,7 @@ help() {
static void static void
version() { version() {
printf("iodine IP over DNS tunneling server\n"); printf("iodine IP over DNS tunneling server\n");
printf("version: 0.3\n"); printf("version: 0.3.1 from 2006-07-11\n");
exit(0); exit(0);
} }

40
tun.c
View File

@ -57,18 +57,18 @@ open_tun(const char *tun_device)
ifreq.ifr_flags = IFF_TUN; ifreq.ifr_flags = IFF_TUN;
if (tun_device != NULL) { if (tun_device != NULL) {
strncpy(ifreq.ifr_name, tun_device, IFNAMSIZ); strncpy(ifreq.ifr_name, tun_device, IFNAMSIZ);
strncpy(if_name, tun_device, sizeof(if_name)); strncpy(if_name, tun_device, sizeof(if_name));
if (ioctl(tun_fd, TUNSETIFF, (void *) &ifreq) != -1) { if (ioctl(tun_fd, TUNSETIFF, (void *) &ifreq) != -1) {
printf("Opened %s\n", ifreq.ifr_name); printf("Opened %s\n", ifreq.ifr_name);
return tun_fd; return tun_fd;
} }
if (errno != EBUSY) { if (errno != EBUSY) {
warn("open_tun: ioctl[TUNSETIFF]: %s", strerror(errno)); warn("open_tun: ioctl[TUNSETIFF]: %s", strerror(errno));
return -1; return -1;
} }
} else { } else {
for (i = 0; i < TUN_MAX_TRY; i++) { for (i = 0; i < TUN_MAX_TRY; i++) {
snprintf(ifreq.ifr_name, IFNAMSIZ, "dns%d", i); snprintf(ifreq.ifr_name, IFNAMSIZ, "dns%d", i);
@ -85,7 +85,7 @@ open_tun(const char *tun_device)
} }
} }
warn("open_tun: Couldn't set interface name.\n"); warn("open_tun: Couldn't set interface name");
} }
return -1; return -1;
} }
@ -100,10 +100,16 @@ open_tun(const char *tun_device)
char tun_name[50]; char tun_name[50];
if (tun_device != NULL) { if (tun_device != NULL) {
if ((tun_fd = open(tun_device, O_RDWR)) < 0) { snprintf(tun_name, sizeof(tun_name), "/dev/%s", tun_device);
warn("open_tun: %s: %s", tun_device, strerror(errno)); strncpy(if_name, tun_device, sizeof(if_name));
if ((tun_fd = open(tun_name, O_RDWR)) < 0) {
warn("open_tun: %s: %s", tun_name, strerror(errno));
return -1; return -1;
} }
printf("Opened %s\n", tun_name);
return tun_fd;
} else { } else {
for (i = 0; i < TUN_MAX_TRY; i++) { for (i = 0; i < TUN_MAX_TRY; i++) {
snprintf(tun_name, sizeof(tun_name), "/dev/tun%d", i); snprintf(tun_name, sizeof(tun_name), "/dev/tun%d", i);
@ -118,7 +124,7 @@ open_tun(const char *tun_device)
break; break;
} }
warn("open_tun: Failed to open tunneling device."); warn("open_tun: Failed to open tunneling device");
} }
return -1; return -1;
@ -136,10 +142,10 @@ close_tun(int tun_fd)
int int
write_tun(int tun_fd, char *data, int len) write_tun(int tun_fd, char *data, int len)
{ {
#ifdef FREEBSD #if defined (FREEBSD) || defined (DARWIN)
data += 4; data += 4;
len -= 4; len -= 4;
#else /* !FREEBSD */ #else /* !FREEBSD/DARWIN */
#ifdef LINUX #ifdef LINUX
data[0] = 0x00; data[0] = 0x00;
data[1] = 0x00; data[1] = 0x00;
@ -163,7 +169,7 @@ write_tun(int tun_fd, char *data, int len)
int int
read_tun(int tun_fd, char *buf, int len) read_tun(int tun_fd, char *buf, int len)
{ {
#ifdef FREEBSD #if defined (FREEBSD) || defined (DARWIN)
// FreeBSD has no header // FreeBSD has no header
return read(tun_fd, buf + 4, len - 4) + 4; return read(tun_fd, buf + 4, len - 4) + 4;
#else /* !FREEBSD */ #else /* !FREEBSD */