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

 
上一篇:马氏链,Metropolis-Hastings采样与Gibbs采样的理解(附有python仿真)


下一篇:深入浅出低功耗蓝牙(BLE)协议栈