diff -ruN diablo-6-CUR-20140422-00.work/dreaderd/defs.h diablo-6-CUR-20140422-00/dreaderd/defs.h
--- diablo-6-CUR-20140422-00.work/dreaderd/defs.h	2009-01-23 16:37:55.000000000 +0100
+++ diablo-6-CUR-20140422-00/dreaderd/defs.h	2015-08-05 15:29:20.000000000 +0200
@@ -115,6 +115,8 @@
 
 #define DEFNAMELEN	128
 
+#define MAXVSINTERFACE	4
+
 typedef struct Vserver {		/* Define a virtual server	*/
     char vs_Name[DEFNAMELEN];
     char vs_ClusterName[64];
@@ -124,7 +126,7 @@
     char vs_Org[128];
     char vs_AbuseTo[64];
     char vs_CryptPw[32];
-    struct sockaddr_storage vs_Interface;
+    char vs_Interface[MAXVSINTERFACE][48];
     char vs_AccessFile[128];
     int vs_NoXrefHostUpdate;
     int vs_NoReadPath;
diff -ruN diablo-6-CUR-20140422-00.work/dreaderd/dns.c diablo-6-CUR-20140422-00/dreaderd/dns.c
--- diablo-6-CUR-20140422-00.work/dreaderd/dns.c	2015-08-05 15:26:03.000000000 +0200
+++ diablo-6-CUR-20140422-00/dreaderd/dns.c	2015-08-05 15:31:16.000000000 +0200
@@ -1354,10 +1354,6 @@
     int firstmatch;
     FILE *af = NULL;
     char *realm = NULL;
-#ifdef INET6
-    void *dreq_ptr;
-    int sa_len=0;
-#endif
 
     /* This got trashed, so reset it */
     if (*dreq->dr_AuthUser) {
@@ -1366,49 +1362,18 @@
 	strcpy(dres->dr_AuthPass, dreq->dr_AuthPass);
     }
 
-#ifdef INET6
-    switch (dreq->dr_LSin.ss_family) {
-	case AF_INET:
-	    dreq_ptr = &((struct sockaddr_in *)&dreq->dr_LSin)->sin_addr;
-	    sa_len = sizeof(struct in_addr);
-	    break;
-	case AF_INET6:
-	    dreq_ptr = &((struct sockaddr_in6 *)&dreq->dr_LSin)->sin6_addr;
-	    sa_len = sizeof(struct in6_addr);
-	    break;
-    }
-#endif
+    char *lsin = NetAddrToSt(0, (struct sockaddr *)&dreq->dr_LSin, 1, 0, 0);
 
-	/* XXX Doesn't work after INET6 addition!! */
     for (vsp = accessmap.VServerList, acount = 0;
 		acount < accessmap.VServerCount; acount++, vsp++) {
-#ifdef INET6
-	void *vsp_ptr;
-
-	switch (vsp->vs_Interface.ss_family) {
-	    case AF_INET:
-		vsp_ptr = &((struct sockaddr_in *)&vsp->vs_Interface)->sin_addr;
+	int ac, match = 0;
+	for (ac = 0; ac < MAXVSINTERFACE && vsp->vs_Interface[ac][0]; ac++) {
+	    if (CidrMatch(vsp->vs_Interface[ac], lsin)) {
+		match = 1;
 		break;
-	    case AF_INET6:
-		vsp_ptr = &((struct sockaddr_in6 *)&vsp->vs_Interface)->sin6_addr;
-		break;
-	}
-
-	if (DebugOpt) {
-	    char buf1[64], buf2[64];
-
-	    inet_ntop(dreq->dr_LSin.ss_family, dreq_ptr, buf1, sizeof(buf1));
-	    inet_ntop(vsp->vs_Interface.ss_family, vsp_ptr, buf2, sizeof(buf2));
-	    logit(LOG_DEBUG, "vserver :  %s (%i) && %s (%i)\n", buf1, dreq->dr_LSin.ss_family, buf2, vsp->vs_Interface.ss_family);
+	    }
 	}
-
-	if (dreq->dr_LSin.ss_family == vsp->vs_Interface.ss_family && sa_len
-	    && memcmp(vsp_ptr, dreq_ptr, sa_len)==0) {
-#else
-	struct sockaddr_in *sa = (struct sockaddr_in *)&dreq->dr_LSin;
-	struct sockaddr_in *vsa = (struct sockaddr_in *)&vsp->vs_Interface;
-	if (sa->sin_addr.s_addr == vsa->sin_addr.s_addr) {
-#endif
+	if (match) {
 	    strcpy(dres->dr_VServer, vsp->vs_Name);
 	    dres->dr_VServerDef = vsp;
             break;
@@ -2656,38 +2621,22 @@
 		    continue;
 		}
 		if (*val && strcmp(opt, "interface") == 0) {
-#ifdef INET6
-		    int error;
-		    struct addrinfo *res;
-                     
-		    error = getaddrinfo(val, 0, NULL, &res);
-		    if (error != 0)
-			logit(LOG_ERR, "getaddrinfo: %s: %s\n",
-					val, gai_strerror(error));
-		    else {
-			char buf[64]; void *ptr;
-
-			switch (res->ai_family) {
-			    case AF_INET:
-				ptr = &((struct sockaddr_in *) res->ai_addr)->sin_addr;
-				break;
-			    case AF_INET6:
-				ptr = &((struct sockaddr_in6 *) res->ai_addr)->sin6_addr;
-				break;
-			}
-			memcpy(&(vserver.vs_Interface), res->ai_addr, res->ai_addrlen);
-			inet_ntop(res->ai_family, ptr, buf, sizeof(buf));
-			logit(LOG_ERR, "getaddrinfo: %s : %s (%i, %i)\n",
-					val, buf, res->ai_family, res->ai_addrlen);
-			freeaddrinfo(res);
+		    int ac;
+		    for (ac = 0; ac < MAXVSINTERFACE; ac++) {
+			if (vserver.vs_Interface[ac][0] == 0)
+			    break;
 		    }
-#else
-		    struct sockaddr_in *sin = (struct sockaddr_in *)&vserver.vs_Interface;
-
-		    bzero(&vserver.vs_Interface, sizeof(vserver.vs_Interface));
-		    sin->sin_family = AF_INET;
-		    sin->sin_addr.s_addr = inet_addr(val);
-#endif
+		    if (ac == MAXVSINTERFACE) {
+			logit(LOG_ERR, "interface %s: too many interfaces\n",
+					val);
+			continue;
+		    }
+		    if (!IsIpAddr(val)) {
+			logit(LOG_ERR, "interface %s: invalid address\n", val);
+			continue;
+		    }
+		    strncpy(vserver.vs_Interface[ac], val,
+					sizeof(vserver.vs_Interface[0]) - 1);
 		    continue;
 		}
 		if (*val && strcmp(opt, "noxrefhostupdate") == 0) {
diff -ruN diablo-6-CUR-20140422-00.work/samples/dreader.access diablo-6-CUR-20140422-00/samples/dreader.access
--- diablo-6-CUR-20140422-00.work/samples/dreader.access	2015-08-05 15:26:17.000000000 +0200
+++ diablo-6-CUR-20140422-00/samples/dreader.access	2015-08-05 15:29:20.000000000 +0200
@@ -41,6 +41,7 @@
 #		   Default: No crypting of X-Trace:
 #
 # interface	 : IP address for which we accept connections for this vserver
+#		   May be a cidr ip/mask. Max 4 per vserver.
 #		   Default: All interfaces
 #		   This option is more useful when used in addition to the
 #		   'accessfile' directive and can effectively allow true
