go-ping库,用于golang中的非特权ICMP ping

sup*_*iya 1 go

我一直在使用go-ping库进行无特权的ping,并在golang中计算各种网络统计信息。代码段为->

func (p *Ping) doPing() (latency, jitter, packetLoss float64, err error) {

    timeout := time.Second*1000
    interval := time.Second
    count := 5
    host := p.ipAddr
    pinger, cmdErr := ping.NewPinger(host)
    if cmdErr != nil {
            glog.Error("Failed to ping " + p.ipAddr)
            err = cmdErr
            return
    }


    pinger.Count = count
    pinger.Interval = interval
    pinger.Timeout = timeout
    pinger.SetPrivileged(false)
    pinger.Run()
    stats := pinger.Statistics()
    latency = float64(stats.AvgRtt)   
    jitter = float64(stats.StdDevRtt) 
    packetLoss = stats.PacketLoss
    return
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但现在开始抛出:-“侦听ICMP数据包时出错:套接字:权限被拒绝”错误。有人知道这背后的原因吗?我正在使用的Go版本是go1.7.4。

Pet*_*oor 6

确保您的设置没有以任何方式改变。如果我之前根据Github上的说明设置了 net.ipv4.ping_group_range ,那么带有 Go 1.7.4 (linux/386) 的 32 位 Ubuntu 16.04 上使用包中的ping仍然适用于我。

关于 Linux 支持的注意事项:

该库尝试通过 UDP 发送“非特权”ping。在 linux 上,这必须通过设置启用

sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"

如果您不想这样做,您可以设置pinger.SetPrivileged(true)并使用 setcap 来允许您的二进制文件使用 go-ping 绑定到原始套接字(或仅以超级用户身份运行):

setcap cap_net_raw=+ep /bin/goping-binary

有关更多详细信息,请参阅此博客Go icmp 库


Mou*_*hub 5

这是在您使用的库的README.md中:

该库尝试通过UDP发送“非特权” ping。在Linux上,必须通过设置启用

sudo sysctl -w net.ipv4.ping_group_range="0   2147483647"
Run Code Online (Sandbox Code Playgroud)

如果您不希望这样做,则可以设置pinger.SetPrivileged(true)并使用setcap允许您使用go-ping将二进制文件绑定到原始套接字(或仅以超级用户身份运行):

setcap cap_net_raw=+ep /bin/goping-binary
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参见此博客和Go icmp库。

希望能帮助到你 !