diff --git a/CHANGELOG b/CHANGELOG index ab87cfd..c860636 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -33,6 +33,8 @@ CHANGES: - Fix DNS tunneling bug caused by uninitialized variable, #94 - Handle spaces when entering password interactively, fixes #93. Patch by Hagar. + - Add -R option to set OpenBSD routing domain for the DNS socket. + Patch by laurent at gouloum fr, fixes #95. 2009-06-01: 0.5.2 "WifiFree" - Fixed client segfault on OS X, #57 diff --git a/man/iodine.8 b/man/iodine.8 index 6eee603..9ff5247 100644 --- a/man/iodine.8 +++ b/man/iodine.8 @@ -17,6 +17,8 @@ iodine, iodined \- tunnel IPv4 over DNS .I chrootdir .B ] [-d .I device +.B ] [-R +.I rdomain .B ] [-m .I fragsize .B ] [-M @@ -129,6 +131,9 @@ Skip raw UDP mode. If not used, iodine will try getting the public IP address of the iodined host and test if it is reachable directly. If it is, traffic will be sent to the server instead of the DNS relay. .TP +.B -R rdomain +Use OpenBSD routing domain 'rdomain' for the DNS connection. +.TP .B -m fragsize Force maximum downstream fragment size. Not setting this will cause the client to automatically probe the maximum accepted downstream fragment size. diff --git a/src/iodine.c b/src/iodine.c index 03efb18..e9e2729 100644 --- a/src/iodine.c +++ b/src/iodine.c @@ -132,6 +132,7 @@ main(int argc, char **argv) int lazymode; int selecttimeout; int hostname_maxlen; + int rtable = 0; nameserv_addr = NULL; topdomain = NULL; @@ -170,7 +171,7 @@ main(int argc, char **argv) __progname++; #endif - while ((choice = getopt(argc, argv, "vfhru:t:d:P:m:M:F:T:O:L:I:")) != -1) { + while ((choice = getopt(argc, argv, "vfhru:t:d:R:P:m:M:F:T:O:L:I:")) != -1) { switch(choice) { case 'v': version(); @@ -194,6 +195,9 @@ main(int argc, char **argv) case 'd': device = optarg; break; + case 'R': + rtable = atoi(optarg); + break; case 'P': strncpy(password, optarg, sizeof(password)); password[sizeof(password)-1] = 0; @@ -321,6 +325,10 @@ main(int argc, char **argv) retval = 1; goto cleanup2; } +#ifdef OPENBSD + if (rtable > 0) + socket_setrtable(dns_fd, rtable); +#endif signal(SIGINT, sighandler); signal(SIGTERM, sighandler); diff --git a/src/util.c b/src/util.c index bc5fc8d..30b7197 100644 --- a/src/util.c +++ b/src/util.c @@ -67,3 +67,11 @@ get_resolvconf_addr() return rv; } +#ifdef OPENBSD +void +socket_setrtable(int fd, int rtable) +{ + if (setsockopt (fd, IPPROTO_IP, SO_RTABLE, &rtable, sizeof(rtable)) == -1) + err(1, "Failed to set routing table %d", rtable); +} +#endif diff --git a/src/util.h b/src/util.h index f514139..6872077 100644 --- a/src/util.h +++ b/src/util.h @@ -2,5 +2,6 @@ #define __UTIL_H__ char *get_resolvconf_addr(); +void socket_setrtable(int fd, int rtable); #endif