大家都知道, 在linux中, 基于UDP的 traceroute
程序本身是不需要root的, 可以直接运行, 而不需要sudo traceroute
而ping
因为需要发送ICMP报文, 所以需要root, 但是 ls -l /bin/ping
, 可以发现他是有suid
权限的, 这也就解释了用户不需要sudo 也能用他发送ICMP报文的原因, (而 traceroute
程序没有suid
)
现在, 我想自己实现一个基于UDP的traceroute
程序, 需要接收返回的ICMP报文, 但是不是root用户不能创建raw socket
也就是在调用socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
的时候会报错, 那么请问 traceroute程序是如何实现非root用户处理ICMP报文的? 难道不用创建 raw socket??
谢谢!!