Skip to content

Commit

Permalink
prober: icmp: Initialize ID and sequence to random values
Browse files Browse the repository at this point in the history
This should help preventing issues with some network devices that have
trouble NATing ICMP packets with the same ID and sequence nubmer but a
different source IP address.

Currently, this can happen if the blackbox_exporter runs in a container
(the ID is set to the PID, which is typically 1 in a container), and
serveral blackbox_exporters are restarted at the same time (the sequence
numbers are reset to zero and stay in sync).

This commit sets the ICMP echo ID to a random value if the PID is 1, and
initializes the sequence number at a random offset.

See prometheus#411 for details.

Signed-off-by: Benoît Knecht <[email protected]>
  • Loading branch information
BenoitKnecht committed Jan 30, 2019
1 parent 844641a commit d5a4f57
Showing 1 changed file with 19 additions and 1 deletion.
20 changes: 19 additions & 1 deletion prober/icmp.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ package prober
import (
"bytes"
"context"
"math/rand"
"net"
"os"
"sync"
Expand All @@ -32,10 +33,27 @@ import (
)

var (
icmpID int
icmpSequence uint16
icmpSequenceMutex sync.Mutex
)

func init() {
// PID is typically 1 when running in a container; in that case, set
// the ICMP echo ID to a random value to avoid potential clashes with
// other blackbox_exporter instances. See #411.
if pid := os.Getpid(); pid == 1 {
icmpID = rand.Intn(1 << 16)
} else {
icmpID = pid & 0xffff
}

// Start the ICMP echo sequence at a random offset to prevent them from
// being in sync when several blackbox_exporter instances are restarted
// at the same time. See #411.
icmpSequence = uint16(rand.Intn(1 << 16))
}

func getICMPSequence() uint16 {
icmpSequenceMutex.Lock()
defer icmpSequenceMutex.Unlock()
Expand Down Expand Up @@ -129,7 +147,7 @@ func ProbeICMP(ctx context.Context, target string, module config.Module, registr
}

body := &icmp.Echo{
ID: os.Getpid() & 0xffff,
ID: icmpID,
Seq: int(getICMPSequence()),
Data: data,
}
Expand Down

0 comments on commit d5a4f57

Please sign in to comment.