diff --git a/manager/state/raft/raft.go b/manager/state/raft/raft.go
index <HASH>..<HASH> 100644
--- a/manager/state/raft/raft.go
+++ b/manager/state/raft/raft.go
@@ -999,6 +999,11 @@ func (n *Node) ProcessRaftMessage(ctx context.Context, msg *api.ProcessRaftMessa
 	defer n.stopMu.RUnlock()
 
 	if n.IsMember() {
+		if msg.Message.To != n.Config.ID {
+			n.processRaftMessageLogger(ctx, msg).Errorf("received message intended for raft_id %x", msg.Message.To)
+			return &api.ProcessRaftMessageResponse{}, nil
+		}
+
 		if err := n.raftNode.Step(ctx, *msg.Message); err != nil {
 			n.processRaftMessageLogger(ctx, msg).WithError(err).Debug("raft Step failed")
 		}
raft: Ignore messages intended for a different member

If a node managed to join raft twice, it would receive messages meant
for both the new and old raft members. There was no check verifying that
the recipient of message is correct. Adding this check makes sure that
if this situation were to arise (perhaps because the leader is an older
version that allows Join to be called twice by the same node), extra
messages meant for a different raft member wouldn't be passed through to
Step and possibly cause a panic.