client: add an option to set the inactivity timeout interval

This commit is contained in:
Sergey Alirzaev 2018-10-01 04:10:39 +03:00
parent 27e5d6fadd
commit 1a110abef6
No known key found for this signature in database
GPG Key ID: 27ECE5E231D08747
4 changed files with 28 additions and 7 deletions

View File

@ -35,6 +35,8 @@ iodine, iodined \- tunnel IPv4 over DNS
.I 0|1 .I 0|1
.B ] [-I .B ] [-I
.I interval .I interval
.B ] [-o
.I interval
.B ] .B ]
.B [ .B [
.I nameserver .I nameserver
@ -236,8 +238,10 @@ There are some DNS relays with very small timeouts,
notably dnsadvantage.com (ultradns), that will give notably dnsadvantage.com (ultradns), that will give
SERVFAIL errors even with \-I1; data will still get trough, SERVFAIL errors even with \-I1; data will still get trough,
and these errors can be ignored. and these errors can be ignored.
Maximum useful value is 59, since iodined will close a client's Maximum useful value is less than specified in \-o.
connection after 60 seconds of inactivity. .TP
.B -o interval
Inactivity timeout interval. Defaults to 60 seconds.
.SS Server Options: .SS Server Options:
.TP .TP
.B -c .B -c

View File

@ -95,6 +95,7 @@ static unsigned short do_qtype = T_UNSET;
static enum connection conn; static enum connection conn;
static int selecttimeout; /* RFC says timeout minimum 5sec */ static int selecttimeout; /* RFC says timeout minimum 5sec */
static int inactivitytimeout;
static int lazymode; static int lazymode;
static long send_ping_soon; static long send_ping_soon;
static time_t lastdownstreamtime; static time_t lastdownstreamtime;
@ -211,6 +212,12 @@ client_set_selecttimeout(int select_timeout)
selecttimeout = select_timeout; selecttimeout = select_timeout;
} }
void
client_set_inactivitytimeout(int inactivity_timeout)
{
inactivitytimeout = inactivity_timeout;
}
void void
client_set_lazymode(int lazy_mode) client_set_lazymode(int lazy_mode)
{ {
@ -847,7 +854,7 @@ tunnel_dns(int tun_fd, int dns_fd)
} }
if (read == 5 && !strncmp("BADIP", buf, 5)) { if (read == 5 && !strncmp("BADIP", buf, 5)) {
warnx("BADIP: Server rejected sender IP address (maybe iodined -c will help), or server kicked us due to timeout. Will exit if no downstream data is received in 60 seconds."); warnx("BADIP: Server rejected sender IP address (maybe iodined -c will help), or server kicked us due to timeout. Will exit if no downstream data is received in %d seconds.", inactivitytimeout);
return -1; /* nothing done */ return -1; /* nothing done */
} }
@ -1117,8 +1124,8 @@ client_tunnel(int tun_fd, int dns_fd)
i = select(MAX(tun_fd, dns_fd) + 1, &fds, NULL, NULL, &tv); i = select(MAX(tun_fd, dns_fd) + 1, &fds, NULL, NULL, &tv);
if (lastdownstreamtime + 60 < time(NULL)) { if (lastdownstreamtime + inactivitytimeout < time(NULL)) {
warnx("No downstream data received in 60 seconds, shutting down."); warnx("No downstream data received in %d seconds, shutting down.", inactivitytimeout);
running = 0; running = 0;
} }

View File

@ -31,6 +31,7 @@ int client_set_qtype(char *qtype);
char *client_get_qtype(void); char *client_get_qtype(void);
void client_set_downenc(char *encoding); void client_set_downenc(char *encoding);
void client_set_selecttimeout(int select_timeout); void client_set_selecttimeout(int select_timeout);
void client_set_inactivitytimeout(int inactivity_timeout);
void client_set_lazymode(int lazy_mode); void client_set_lazymode(int lazy_mode);
void client_set_hostname_maxlen(int i); void client_set_hostname_maxlen(int i);

View File

@ -98,7 +98,8 @@ static void help(FILE *stream, bool verbose)
" -t dir to chroot to directory dir\n" " -t dir to chroot to directory dir\n"
" -d device to set tunnel device name\n" " -d device to set tunnel device name\n"
" -z context, to apply specified SELinux context after initialization\n" " -z context, to apply specified SELinux context after initialization\n"
" -F pidfile to write pid to a file\n\n" " -F pidfile to write pid to a file\n"
" -o inactivity timeout interval\n\n"
"nameserver is the IP number/hostname of the relaying nameserver. If absent,\n" "nameserver is the IP number/hostname of the relaying nameserver. If absent,\n"
" /etc/resolv.conf is used\n" " /etc/resolv.conf is used\n"
"topdomain is the FQDN that is delegated to the tunnel endpoint.\n"); "topdomain is the FQDN that is delegated to the tunnel endpoint.\n");
@ -143,6 +144,7 @@ int main(int argc, char **argv)
int raw_mode; int raw_mode;
int lazymode; int lazymode;
int selecttimeout; int selecttimeout;
int inactivitytimeout;
int hostname_maxlen; int hostname_maxlen;
#ifdef OPENBSD #ifdef OPENBSD
int rtable = 0; int rtable = 0;
@ -172,6 +174,7 @@ int main(int argc, char **argv)
raw_mode = 1; raw_mode = 1;
lazymode = 1; lazymode = 1;
selecttimeout = 4; selecttimeout = 4;
inactivitytimeout = 60;
hostname_maxlen = 0xFF; hostname_maxlen = 0xFF;
nameserv_family = AF_UNSPEC; nameserv_family = AF_UNSPEC;
@ -190,7 +193,7 @@ int main(int argc, char **argv)
__progname++; __progname++;
#endif #endif
while ((choice = getopt(argc, argv, "46vfhru:t:d:R:P:m:M:F:T:O:L:I:")) != -1) { while ((choice = getopt(argc, argv, "46vfhru:t:d:R:P:m:M:F:T:O:L:I:o:")) != -1) {
switch(choice) { switch(choice) {
case '4': case '4':
nameserv_family = AF_INET; nameserv_family = AF_INET;
@ -271,6 +274,11 @@ int main(int argc, char **argv)
if (selecttimeout < 1) if (selecttimeout < 1)
selecttimeout = 1; selecttimeout = 1;
break; break;
case 'o':
inactivitytimeout = atoi(optarg);
if (inactivitytimeout < 1)
inactivitytimeout = 1;
break;
default: default:
usage(); usage();
/* NOTREACHED */ /* NOTREACHED */
@ -322,6 +330,7 @@ int main(int argc, char **argv)
} }
client_set_selecttimeout(selecttimeout); client_set_selecttimeout(selecttimeout);
client_set_inactivitytimeout(inactivitytimeout);
client_set_lazymode(lazymode); client_set_lazymode(lazymode);
client_set_topdomain(topdomain); client_set_topdomain(topdomain);
client_set_hostname_maxlen(hostname_maxlen); client_set_hostname_maxlen(hostname_maxlen);