diff --git a/src/ice_transport.cpp b/src/ice_transport.cpp
index 7adc55d4c891f77539bacfce064ec48869e4c9f6..791b9303a4f2c01e1096a14e18f69289f04a3f75 100644
--- a/src/ice_transport.cpp
+++ b/src/ice_transport.cpp
@@ -487,6 +487,9 @@ IceTransport::start(const std::vector<uint8_t>& rem_data)
         return false;
     }
 
+    if (onlyIPv4Private_)
+        RING_WARN("[ice:%p] no public IPv4 found, your connection may fail!", this);
+
     return start({rem_ufrag, rem_pwd}, rem_candidates);
 }
 
@@ -854,8 +857,10 @@ IceTransport::getCandidateFromSDP(const std::string& line, IceCandidate& cand)
 
     if (strchr(ipaddr, ':'))
         af = pj_AF_INET6();
-    else
+    else {
         af = pj_AF_INET();
+        onlyIPv4Private_ &= IpAddr(ipaddr).isPrivate();
+    }
 
     tmpaddr = pj_str(ipaddr);
     pj_sockaddr_init(af, &cand.addr, NULL, 0);
diff --git a/src/ice_transport.h b/src/ice_transport.h
index fbd2b54ffda024f0de7b3e1844cab68e7aa4204b..990c88d1de979a95cfff6520a50187623a2ccd2a 100644
--- a/src/ice_transport.h
+++ b/src/ice_transport.h
@@ -297,6 +297,8 @@ class IceTransport {
 
         std::unique_ptr<upnp::Controller> upnp_;
 
+        bool onlyIPv4Private_ {true};
+
         // IO/Timer events are handled by following thread
         std::thread thread_;
         std::atomic_bool threadTerminateFlags_ {false};