繁体   English   中英

Linux UDP Socket sendto:操作不允许

[英]Linux UDP Socket sendto: Operation not Permitted

我正在尝试使用OpenSIPS (SIP代理)应用程序来诊断问题。

当向同一IP和端口发送两个不同的UDP数据包时,一个呼叫失败,其中-1 EPERM (Operation not permitted)而另一个是正常的。

两个调用都是从同一个进程(至少是相同的PID)进行的。

有问题的代码在github上

这是strace输出:

strace -e sendto
sendto(7, "SIP/2.0 100 Giving a try\r\nVia: S"..., 315, 0, {sa_family=AF_INET, sin_port=htons(5060), sin_addr=inet_addr("yyy.yyy.yyy.yyy")}, 16) = 315
sendto(7, "INVITE sip:myHomeDesktop@xxx"..., 1253, 0, {sa_family=AF_INET, sin_port=htons(5060), sin_addr=inet_addr("xxx.xxx.xxx.xxx")}, 16) = 1253
sendto(7, "SIP/2.0 200 OK\r\nVia: SIP/2.0/UDP"..., 707, 0, {sa_family=AF_INET, sin_port=htons(5060), sin_addr=inet_addr("yyy.yyy.yyy.yyy")}, 16) = -1 EPERM (Operation not permitted)

事实证明,内核conntrack模块正在丢弃数据包,导致系统调用获取EPERM错误而不发送数据包。

在查看了syslog并找到后,我发现了这个:

May 26 10:59:45 localhost kernel: nf_ct_sip: dropping packet: cannot add expectation for voice

我完全没有意识到我正在使用sip conntrack模块,并且它没有动态加载到我的系统上( lsmod显示为空白)。

我通过以下方式关闭SIP流量的连接跟踪来规避问题:

iptables -I OUTPUT -t raw -p udp --sport 5060 -j CT --notrack
iptables -I PREROUTING -t raw -p udp --dport 5060 -j CT --notrack

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM