关于使用 socket 构造 icmp 包报错 Permission denied 的问题

2023-04-17 10:24:01 +08:00
 bulay

背景: 接手别人的项目,添加子网时对子网所有地址进行 ping 测试


构造子网地址和广播地址 socket 连接时,会报PermissionError: [Errno 13] Permission denied的错误.

关于为什么要上子网地址和广播地址我也不清楚(代码专门拼接了这两个地址,这两者和对子网所有地址进行 ping 不是重复了吗)

所有,子网地址和广播地址和应该怎么构造 icmp 的包和建立 socket 连接?

1525 次点击
所在节点    程序员
11 条回复
keakon
2023-04-17 11:04:57 +08:00
socket.SOCK_RAW 需要 root 权限,你加个 sudo 试试
yougg
2023-04-17 11:09:45 +08:00
artnowben
2023-04-17 11:11:37 +08:00
构建 icmp 报文请参考一下 测试仪项目 dperf https://github.com/baidu/dperf
具体代码:
1. raw socket 参考 https://github.com/pengjianzhang/tcping/blob/main/tcping.c
2. icmp 封装参考 https://github.com/baidu/dperf/blob/main/src/icmp.c
julyclyde
2023-04-17 11:27:19 +08:00
建议还是先学学网络的基本原理,搞明白掩码到底是做啥用的
再处理权限问题
qwq11
2023-04-17 11:55:39 +08:00
楼上提到需要 root 权限,其实从内核 2.2 开始就可以单独设置这些权限。你可以用用 sudo setcap cap_net_raw+p PROGRAM 赋予你程序 socket_row 的能力
julyclyde
2023-04-17 12:21:28 +08:00
@qwq11 求教那个+p 是啥意思
之前我看 man 的时候没明白
qwq11
2023-04-17 12:45:42 +08:00
bulay
2023-04-17 14:18:45 +08:00
@keakon
@yougg
@artnowben
@julyclyde 感谢各位给出的建议,我按照各位的建议使用 root 权限启动,或者为程序添加 root 权限,问题并没有解决.
我可能描述的不清楚,该程序 ping 普通地址是没问题的,不存在权限问题,但是 ping 子网地址和子网广播地址才会报权限问题.

@qwq11 谢谢提醒,掩码什么作用我知道
qbqbqbqb
2023-04-17 14:44:07 +08:00
子网地址是不能用作目标地址的

广播地址可以,但是如果要用广播地址作为目标地址的话,需要用 setsockopt 给 socket 加上 SO_BROADCAST 属性
bulay
2023-04-17 16:10:14 +08:00
@qbqbqbqb 感谢大佬!就是这个问题. 另外,子网地址确实可以 ping 通.用 linux 的命令`ping -b`也是可以用子网地址作为目标地址的
julyclyde
2023-04-18 17:10:49 +08:00
你这个功能是新加的??
我还以为接手的时候已经有这个了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/933068

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX