diff --git a/packages/gossip/errors.go b/packages/gossip/errors.go
index 85e43340fe2f4be0cf91f95de18b21b378d0bb61..554e38618c97aff2cda1b3c97cc3cbd805a6888d 100644
--- a/packages/gossip/errors.go
+++ b/packages/gossip/errors.go
@@ -6,6 +6,7 @@ var (
 	ErrNotStarted        = errors.New("manager not started")
 	ErrClosed            = errors.New("manager closed")
 	ErrNotANeighbor      = errors.New("peer is not a neighbor")
+	ErrLoopback          = errors.New("loopback connection not allowed")
 	ErrDuplicateNeighbor = errors.New("peer already connected")
 	ErrInvalidPacket     = errors.New("invalid packet")
 )
diff --git a/packages/gossip/manager.go b/packages/gossip/manager.go
index 03bcb475025475996c3b494bc862981099ba9b71..683cd24c966051d67b55cb91f8387fbbc457abd0 100644
--- a/packages/gossip/manager.go
+++ b/packages/gossip/manager.go
@@ -78,6 +78,9 @@ func (m *Manager) LocalAddr() net.Addr {
 
 // AddOutbound tries to add a neighbor by connecting to that peer.
 func (m *Manager) AddOutbound(p *peer.Peer) error {
+	if p.ID() == m.local.ID() {
+		return ErrLoopback
+	}
 	var srv *server.TCP
 	m.mu.RLock()
 	if m.srv == nil {
@@ -91,6 +94,9 @@ func (m *Manager) AddOutbound(p *peer.Peer) error {
 
 // AddInbound tries to add a neighbor by accepting an incoming connection from that peer.
 func (m *Manager) AddInbound(p *peer.Peer) error {
+	if p.ID() == m.local.ID() {
+		return ErrLoopback
+	}
 	var srv *server.TCP
 	m.mu.RLock()
 	if m.srv == nil {