diff --git a/src/net_processing.cpp b/src/net_processing.cpp
--- a/src/net_processing.cpp
+++ b/src/net_processing.cpp
@@ -4563,12 +4563,29 @@
             return;
         }
 
+        if (fImporting || fReindex) {
+            LogPrint(
+                BCLog::NET,
+                "Ignoring getheaders from peer=%d while importing/reindexing\n",
+                pfrom.GetId());
+            return;
+        }
+
         LOCK(cs_main);
-        if (m_chainman.ActiveChainstate().IsInitialBlockDownload() &&
-            !pfrom.HasPermission(NetPermissionFlags::Download)) {
+
+        // Note that if we were to be on a chain that forks from the
+        // checkpointed chain, then serving those headers to a peer that has
+        // seen the checkpointed chain would cause that peer to disconnect us.
+        // Requiring that our chainwork exceed nMinimumChainWork is a protection
+        // against being fed a bogus chain when we started up for the first time
+        // and getting partitioned off the honest network for serving that chain
+        // to others.
+        if (m_chainman.ActiveTip() == nullptr ||
+            (m_chainman.ActiveTip()->nChainWork < nMinimumChainWork &&
+             !pfrom.HasPermission(NetPermissionFlags::Download))) {
             LogPrint(BCLog::NET,
-                     "Ignoring getheaders from peer=%d because node is in "
-                     "initial block download\n",
+                     "Ignoring getheaders from peer=%d because active chain "
+                     "has too little work\n",
                      pfrom.GetId());
             return;
         }
diff --git a/test/functional/feature_minchainwork.py b/test/functional/feature_minchainwork.py
--- a/test/functional/feature_minchainwork.py
+++ b/test/functional/feature_minchainwork.py
@@ -17,6 +17,7 @@
 
 import time
 
+from test_framework.p2p import P2PInterface, msg_getheaders
 from test_framework.test_framework import BitcoinTestFramework
 from test_framework.util import assert_equal
 
@@ -41,6 +42,9 @@
         for i in range(self.num_nodes - 1):
             self.connect_nodes(i + 1, i)
 
+        # Set clock of node2 2 days ahead, to keep it in IBD during this test.
+        self.nodes[2].setmocktime(int(time.time()) + 48 * 60 * 60)
+
     def run_test(self):
         # Start building a chain on node0.  node2 shouldn't be able to sync until node1's
         # minchainwork is exceeded
@@ -80,6 +84,15 @@
         assert self.nodes[1].getbestblockhash() != self.nodes[0].getbestblockhash()
         assert_equal(self.nodes[2].getblockcount(), starting_blockcount)
 
+        self.log.info("Check that getheaders requests to node2 are ignored")
+        peer = self.nodes[2].add_p2p_connection(P2PInterface())
+        msg = msg_getheaders()
+        msg.locator.vHave = [int(self.nodes[2].getbestblockhash(), 16)]
+        msg.hashstop = 0
+        peer.send_and_ping(msg)
+        time.sleep(5)
+        assert "headers" not in peer.last_message
+
         self.log.info("Generating one more block")
         self.generate(self.nodes[0], 1)
 
@@ -94,6 +107,14 @@
         self.sync_all()
         self.log.info(f"Blockcounts: {[n.getblockcount() for n in self.nodes]}")
 
+        self.log.info("Test that getheaders requests to node2 are not ignored")
+        peer.send_and_ping(msg)
+        assert "headers" in peer.last_message
+
+        # Verify that node2 is in fact still in IBD (otherwise this test may
+        # not be exercising the logic we want!)
+        assert_equal(self.nodes[2].getblockchaininfo()["initialblockdownload"], True)
+
 
 if __name__ == "__main__":
     MinimumChainWorkTest().main()