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

时间:2017-01-02 08:44:36

标签: go

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

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
}

它工作正常,但现在已经开始投掷: - "侦听ICMP数据包时出错:socket:权限被拒绝"错误。 谁知道这背后的原因?我正在使用的版本是go1.7.4。

2 个答案:

答案 0 :(得分:5)

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

这个图书馆试图发送一个" nonrivileged"通过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库。

希望它有所帮助!

答案 1 :(得分:3)

确保您的设置无法以任何方式改变。如果我先前根据{{3}设置了net.ipv4.ping_group_range,那么在使用Go 1.7.4(linux / 386)的32位Ubuntu 16.04上使用程序包中的 ping 仍然适用于我}。

  

关于Linux支持的注意事项:

     

这个图书馆试图发送一个" nonrivileged"通过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

     

参见instructions on Github   和this blog   更多细节。