Skip to content

Commit

Permalink
prober: icmp: Initialize ID and sequence to random values (#412)
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 #411 for details.

Signed-off-by: Benoît Knecht <[email protected]>
  • Loading branch information
BenoitKnecht authored and brian-brazil committed Jan 30, 2019
1 parent 844641a commit 6958e6f
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 6958e6f

Please sign in to comment.