diff -purN a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c
--- a/sysdep/linux/netlink.c	2013-09-26 05:13:41.000000000 +0300
+++ b/sysdep/linux/netlink.c	2013-09-26 06:55:44.016172793 +0300
@@ -1018,11 +1018,10 @@ nl_open_async(void)
   sock *sk;
   struct sockaddr_nl sa;
   int fd;
-  static int nl_open_tried = 0;
 
-  if (nl_open_tried)
+  if (nl_async_sk)
     return;
-  nl_open_tried = 1;
+  nl_async_sk = (uintptr_t) -1;
 
   DBG("KRT: Opening async netlink socket\n");
 
@@ -1043,18 +1042,18 @@ nl_open_async(void)
   if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) < 0)
     {
       log(L_ERR "Unable to bind asynchronous rtnetlink socket: %m");
+      close(fd);
       return;
     }
 
+  nl_async_rx_buffer = xmalloc(NL_RX_SIZE);
+
   sk = nl_async_sk = sk_new(krt_pool);
   sk->type = SK_MAGIC;
   sk->rx_hook = nl_async_hook;
   sk->fd = fd;
   if (sk_open(sk))
     bug("Netlink: sk_open failed");
-
-  if (!nl_async_rx_buffer)
-    nl_async_rx_buffer = xmalloc(NL_RX_SIZE);
 }
 
 /*
@@ -1075,6 +1074,7 @@ krt_sys_start(struct krt_proto *p)
 void
 krt_sys_shutdown(struct krt_proto *p UNUSED)
 {
+  nl_table_map[KRT_CF->sys.table_id] = NULL;
 }
 
 int
