diff --git a/broker/extractor.go b/broker/extractor.go
new file mode 100644
index 00000000..4ba9fdc3
--- /dev/null
+++ b/broker/extractor.go
@@ -0,0 +1,70 @@
+package broker
+
+import (
+	"fmt"
+	"net"
+)
+
+var (
+	privateBlocks []*net.IPNet
+)
+
+func init() {
+	for _, b := range []string{"10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"} {
+		if _, block, err := net.ParseCIDR(b); err == nil {
+			privateBlocks = append(privateBlocks, block)
+		}
+	}
+}
+
+func extractAddress(addr string) (string, error) {
+	if len(addr) > 0 && (addr != "0.0.0.0" && addr != "[::]") {
+		return addr, nil
+	}
+
+	addrs, err := net.InterfaceAddrs()
+	if err != nil {
+		return "", fmt.Errorf("Failed to get interface addresses! Err: %v", err)
+	}
+
+	var ipAddr []byte
+
+	for _, rawAddr := range addrs {
+		var ip net.IP
+		switch addr := rawAddr.(type) {
+		case *net.IPAddr:
+			ip = addr.IP
+		case *net.IPNet:
+			ip = addr.IP
+		default:
+			continue
+		}
+
+		if ip.To4() == nil {
+			continue
+		}
+
+		if !isPrivateIP(ip.String()) {
+			continue
+		}
+
+		ipAddr = ip
+		break
+	}
+
+	if ipAddr == nil {
+		return "", fmt.Errorf("No private IP address found, and explicit IP not provided")
+	}
+
+	return net.IP(ipAddr).String(), nil
+}
+
+func isPrivateIP(ipAddr string) bool {
+	ip := net.ParseIP(ipAddr)
+	for _, priv := range privateBlocks {
+		if priv.Contains(ip) {
+			return true
+		}
+	}
+	return false
+}
diff --git a/broker/http_broker.go b/broker/http_broker.go
index 9daab6ad..75dd1df0 100644
--- a/broker/http_broker.go
+++ b/broker/http_broker.go
@@ -389,6 +389,11 @@ func (h *httpBroker) Subscribe(topic string, handler Handler, opts ...SubscribeO
 	host := strings.Join(parts[:len(parts)-1], ":")
 	port, _ := strconv.Atoi(parts[len(parts)-1])
 
+	addr, err := extractAddress(host)
+	if err != nil {
+		return nil, err
+	}
+
 	id := uuid.NewUUID().String()
 
 	var secure bool
@@ -400,7 +405,7 @@ func (h *httpBroker) Subscribe(topic string, handler Handler, opts ...SubscribeO
 	// register service
 	node := &registry.Node{
 		Id:      h.id + "." + id,
-		Address: host,
+		Address: addr,
 		Port:    port,
 		Metadata: map[string]string{
 			"secure": fmt.Sprintf("%t", secure),