diff --git a/src/dhtrunner.cpp b/src/dhtrunner.cpp
index 210a5499b3e459238466090f91a04e748d4a6c6c..a73897ff0b63dd5ab621cc753633bcd197e6c746 100644
--- a/src/dhtrunner.cpp
+++ b/src/dhtrunner.cpp
@@ -219,46 +219,50 @@ DhtRunner::run(const Config& config, Context&& context)
         }
     });
 
-    if (config.peer_discovery or config.peer_publish) {
+    if (config.proxy_server.empty()) {
+        if (config.peer_discovery or config.peer_publish) {
 #ifdef OPENDHT_PEER_DISCOVERY
-        peerDiscovery_ = context.peerDiscovery ?
-            std::move(context.peerDiscovery) :
-            std::make_shared<PeerDiscovery>();
+            peerDiscovery_ = context.peerDiscovery ?
+                std::move(context.peerDiscovery) :
+                std::make_shared<PeerDiscovery>();
 #else
-        std::cerr << "Peer discovery requested but OpenDHT built without peer discovery support." << std::endl;
+            std::cerr << "Peer discovery requested but OpenDHT built without peer discovery support." << std::endl;
 #endif
-    }
+        }
 
 #ifdef OPENDHT_PEER_DISCOVERY
-    auto netId = config.dht_config.node_config.network;
-    if (config.peer_discovery) {
-        peerDiscovery_->startDiscovery<NodeInsertionPack>(PEER_DISCOVERY_DHT_SERVICE, [this, netId](NodeInsertionPack&& v, SockAddr&& addr){
-            addr.setPort(v.port);
-            if (v.nodeId != dht_->getNodeId() && netId == v.net){
-                bootstrap(v.nodeId, addr);
-            }
-        });
-    }
-    if (config.peer_publish) {
-        msgpack::sbuffer sbuf_node;
-        NodeInsertionPack adc;
-        adc.net = netId;
-        adc.nodeId = dht_->getNodeId();
-        // IPv4
-        if (const auto& bound4 = dht_->getSocket()->getBoundRef(AF_INET)) {
-            adc.port = bound4.getPort();
-            msgpack::pack(sbuf_node, adc);
-            peerDiscovery_->startPublish(AF_INET, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);
+        auto netId = config.dht_config.node_config.network;
+        if (config.peer_discovery) {
+            peerDiscovery_->startDiscovery<NodeInsertionPack>(PEER_DISCOVERY_DHT_SERVICE, [this, netId](NodeInsertionPack&& v, SockAddr&& addr){
+                addr.setPort(v.port);
+                if (v.nodeId != dht_->getNodeId() && netId == v.net){
+                    bootstrap(v.nodeId, addr);
+                }
+            });
         }
-        // IPv6
-        if (const auto& bound6 = dht_->getSocket()->getBoundRef(AF_INET6)) {
-            adc.port = bound6.getPort();
-            sbuf_node.clear();
-            msgpack::pack(sbuf_node, adc);
-            peerDiscovery_->startPublish(AF_INET6, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);
+        if (config.peer_publish) {
+            msgpack::sbuffer sbuf_node;
+            NodeInsertionPack adc;
+            adc.net = netId;
+            adc.nodeId = dht_->getNodeId();
+            if (auto socket = dht_->getSocket()) {
+                // IPv4
+                if (const auto& bound4 = socket->getBoundRef(AF_INET)) {
+                    adc.port = bound4.getPort();
+                    msgpack::pack(sbuf_node, adc);
+                    peerDiscovery_->startPublish(AF_INET, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);
+                }
+                // IPv6
+                if (const auto& bound6 = socket->getBoundRef(AF_INET6)) {
+                    adc.port = bound6.getPort();
+                    sbuf_node.clear();
+                    msgpack::pack(sbuf_node, adc);
+                    peerDiscovery_->startPublish(AF_INET6, PEER_DISCOVERY_DHT_SERVICE, sbuf_node);
+                }
+            }
         }
-    }
 #endif
+    }
 }
 
 void