static unsigned int nfnetlink_pernet_id __read_mostly;
 
 struct nfnl_net {
+       unsigned int ctnetlink_listeners;
        struct sock *nfnl;
 };
 
                netlink_rcv_skb(skb, nfnetlink_rcv_msg);
 }
 
-#ifdef CONFIG_MODULES
 static int nfnetlink_bind(struct net *net, int group)
 {
        const struct nfnetlink_subsystem *ss;
        rcu_read_unlock();
        if (!ss)
                request_module_nowait("nfnetlink-subsys-%d", type);
+
+#ifdef CONFIG_NF_CONNTRACK_EVENTS
+       if (type == NFNL_SUBSYS_CTNETLINK) {
+               struct nfnl_net *nfnlnet = nfnl_pernet(net);
+
+               nfnl_lock(NFNL_SUBSYS_CTNETLINK);
+
+               if (WARN_ON_ONCE(nfnlnet->ctnetlink_listeners == UINT_MAX)) {
+                       nfnl_unlock(NFNL_SUBSYS_CTNETLINK);
+                       return -EOVERFLOW;
+               }
+
+               nfnlnet->ctnetlink_listeners++;
+               if (nfnlnet->ctnetlink_listeners == 1)
+                       WRITE_ONCE(net->ct.ctnetlink_has_listener, true);
+               nfnl_unlock(NFNL_SUBSYS_CTNETLINK);
+       }
+#endif
        return 0;
 }
+
+static void nfnetlink_unbind(struct net *net, int group)
+{
+#ifdef CONFIG_NF_CONNTRACK_EVENTS
+       int type = nfnl_group2type[group];
+
+       if (type == NFNL_SUBSYS_CTNETLINK) {
+               struct nfnl_net *nfnlnet = nfnl_pernet(net);
+
+               nfnl_lock(NFNL_SUBSYS_CTNETLINK);
+               WARN_ON_ONCE(nfnlnet->ctnetlink_listeners == 0);
+               nfnlnet->ctnetlink_listeners--;
+               if (nfnlnet->ctnetlink_listeners == 0)
+                       WRITE_ONCE(net->ct.ctnetlink_has_listener, false);
+               nfnl_unlock(NFNL_SUBSYS_CTNETLINK);
+       }
 #endif
+}
 
 static int __net_init nfnetlink_net_init(struct net *net)
 {
        struct netlink_kernel_cfg cfg = {
                .groups = NFNLGRP_MAX,
                .input  = nfnetlink_rcv,
-#ifdef CONFIG_MODULES
                .bind   = nfnetlink_bind,
-#endif
+               .unbind = nfnetlink_unbind,
        };
 
        nfnlnet->nfnl = netlink_kernel_create(net, NETLINK_NETFILTER, &cfg);