问题:在Linux环境中手动使用ping命令是可以正常执行的,但是golang程序调用go-ping包则会返回socket: permission denied错误,导致程序失败
程序源码
//测试3个包, 不能ping通则返回false; func pings(ip string) (bool, error) { pinger, err := ping.NewPinger(ip) if err != nil { return false, err } //测试3个包 pinger.Count = 3 pinger.Timeout = 3000000000 //3 秒超时 err = pinger.Run() // Blocks until finished. if err != nil { return false, err } stats := pinger.Statistics() // get send/receive/rtt stats fmt.Println("stats.PacketLoss is; ", stats.PacketLoss) //如果丢包100% if stats.PacketLoss == 100 { return false, nil } //不丢包返回true return true, nil } func main() { b, err := pings("x.x.x.x") fmt.Println("---", b) fmt.Println("err is: ", err) }
具体原因
这是一个sysctl设置,用于限制允许在Alpine上ping的用户ID范围。让所有用户可以ping
临时解决:sudo sysctl -w net.ipv4.ping_group_range="0 2147483647"
永久化,echo "net.ipv4.ping_group_range = 0 2147483647" >> /etc/sysctl.conf