diff --git a/p2p/peer.go b/p2p/peer.go
index c3907349fc5aed482b340b7fe6e618c841520118..ff8602602845e5c74d703860355813633f91d187 100644
--- a/p2p/peer.go
+++ b/p2p/peer.go
@@ -95,10 +95,11 @@ type PeerEvent struct {
 
 // Peer represents a connected remote node.
 type Peer struct {
-	rw      *conn
-	running map[string]*protoRW
-	log     log.Logger
-	created mclock.AbsTime
+	rw        *conn
+	isInbound bool // Cached from rw.flags to avoid a race condition
+	running   map[string]*protoRW
+	log       log.Logger
+	created   mclock.AbsTime
 
 	wg       sync.WaitGroup
 	protoErr chan error
@@ -160,19 +161,20 @@ func (p *Peer) String() string {
 
 // Inbound returns true if the peer is an inbound connection
 func (p *Peer) Inbound() bool {
-	return p.rw.flags&inboundConn != 0
+	return p.isInbound
 }
 
 func newPeer(conn *conn, protocols []Protocol) *Peer {
 	protomap := matchProtocols(protocols, conn.caps, conn)
 	p := &Peer{
-		rw:       conn,
-		running:  protomap,
-		created:  mclock.Now(),
-		disc:     make(chan DiscReason),
-		protoErr: make(chan error, len(protomap)+1), // protocols + pingLoop
-		closed:   make(chan struct{}),
-		log:      log.New("id", conn.id, "conn", conn.flags),
+		rw:        conn,
+		isInbound: conn.is(inboundConn),
+		running:   protomap,
+		created:   mclock.Now(),
+		disc:      make(chan DiscReason),
+		protoErr:  make(chan error, len(protomap)+1), // protocols + pingLoop
+		closed:    make(chan struct{}),
+		log:       log.New("id", conn.id, "conn", conn.flags),
 	}
 	return p
 }