Linux环境下无法使用非权威ping问题
Linux环境下无法使用非权威ping问题(github.com/go-ping/ping包)
问题:在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

浙公网安备 33010602011771号