diff --git a/tools/dhtchat.cpp b/tools/dhtchat.cpp
index 3ba7c6f401479a8fab313a29d32b4f4000c2ac76..5c7e72c17a2e0400a0201e26b947bafa4a13604a 100644
--- a/tools/dhtchat.cpp
+++ b/tools/dhtchat.cpp
@@ -82,6 +82,10 @@ main(int argc, char **argv)
         config.push_token = params.devicekey;
         config.peer_discovery = params.peer_discovery;
         config.peer_publish = params.peer_discovery;
+        if (params.no_rate_limit) {
+            config.dht_config.node_config.max_req_per_sec = -1;
+            config.dht_config.node_config.max_peer_req_per_sec = -1;
+        }
 
         dht::DhtRunner::Context context {};
         if (params.log) {
diff --git a/tools/dhtnode.cpp b/tools/dhtnode.cpp
index b80d8cb8db6585e48290ede5bbd33ce2d7ec494c..31eca901d74b154d5c5c169e8fce1e3e9e36a343 100644
--- a/tools/dhtnode.cpp
+++ b/tools/dhtnode.cpp
@@ -552,6 +552,10 @@ main(int argc, char **argv)
         config.push_token = params.devicekey;
         config.peer_discovery = params.peer_discovery;
         config.peer_publish = params.peer_discovery;
+        if (params.no_rate_limit) {
+            config.dht_config.node_config.max_req_per_sec = -1;
+            config.dht_config.node_config.max_peer_req_per_sec = -1;
+        }
 
         dht::DhtRunner::Context context {};
         if (params.log) {
diff --git a/tools/tools_common.h b/tools/tools_common.h
index bd682a03bc473274d2b45849c726776b6e378bf6..f368afdabd79d34c0c0bfb4a0f77c88694b0d8f9 100644
--- a/tools/tools_common.h
+++ b/tools/tools_common.h
@@ -131,6 +131,7 @@ struct dht_params {
     std::string privkey_pwd {};
     std::string proxy_privkey_pwd {};
     std::string save_identity {};
+    bool no_rate_limit {false};
 };
 
 static const constexpr struct option long_options[] = {
@@ -147,6 +148,7 @@ static const constexpr struct option long_options[] = {
     {"daemonize",               no_argument      , nullptr, 'd'},
     {"service",                 no_argument      , nullptr, 's'},
     {"peer-discovery",          no_argument      , nullptr, 'D'},
+    {"no-rate-limit",           no_argument      , nullptr, 'U'},
     {"persist",                 required_argument, nullptr, 'f'},
     {"logfile",                 required_argument, nullptr, 'l'},
     {"syslog",                  no_argument      , nullptr, 'L'},
@@ -168,7 +170,7 @@ parseArgs(int argc, char **argv) {
     int opt;
     std::string privkey;
     std::string proxy_privkey;
-    while ((opt = getopt_long(argc, argv, "hidsvDp:n:b:f:l:", long_options, nullptr)) != -1) {
+    while ((opt = getopt_long(argc, argv, "hidsvDUp:n:b:f:l:", long_options, nullptr)) != -1) {
         switch (opt) {
         case 'p': {
                 int port_arg = atoi(optarg);
@@ -212,6 +214,9 @@ parseArgs(int argc, char **argv) {
         case 'n':
             params.network = strtoul(optarg, nullptr, 0);
             break;
+        case 'U':
+            params.no_rate_limit = true;
+            break;
         case 'b':
             params.bootstrap = dht::splitPort((optarg[0] == '=') ? optarg+1 : optarg);
             if (not params.bootstrap.first.empty() and params.bootstrap.second.empty()) {