【问题标题】:go-ping library for unprivileged ICMP ping in golanggo-ping 库,用于 golang 中的非特权 ICMP ping
【发布时间】:2017-01-02 18:57:51
【问题描述】:

我一直在使用 go-ping 库进行非特权 ping 并计算 golang 中的各种网络统计信息。 代码 sn -p 是 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 数据包时出错:套接字:权限被拒绝”错误。 有人知道这背后的原因吗?我使用的 Go 版本是 go1.7.4。

【问题讨论】:

    标签: go


    【解决方案1】:

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

    此库尝试通过 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 库。

    希望对您有所帮助!

    【讨论】:

    • 哎呀,你更快了。
    • 非常感谢@Peter。
    【解决方案2】:

    确保您的设置没有发生任何变化。如果我之前根据instructions on Github 设置了 net.ipv4.ping_group_range,则使用包中的 ping 仍然适用于带有 Go 1.7.4 (linux/386) 的 32 位 Ubuntu 16.04。

    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

    this blogthe Go icmp library 更多细节。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-11
      • 2010-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多