2014-05-25 91 views
1

我试图诊断OpenSIPS(SIP代理)应用程序的问题。Linux UDP套接字sendto:操作不允许

当发送两个不同的UDP数据包到同一个IP和端口时,一个呼叫失败,-1 EPERM (Operation not permitted),而另一个没有问题。

这两个调用是从相同的过程(至少相同的PID)。

有问题的代码是on 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:my[email protected]"..., 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) 
+0

任何线索?例如任何ICMP消息? – nos

+0

不幸的是,没有ICMP消息回来。 tcpdump没有显示发送失败的数据包,但我想这并不奇怪。 – Eosis

回答

8

原来内核连接跟踪模块被丢弃数据包,从而导致系统调用得到EPERM错误和不发送数据包。

我发现这个看syslog和发现后:

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

我完全不知道,我是使用SIP连接跟踪模块,并且它不是动态加载我的系统上(lsmod显示为空白)。

我绕过通过关闭连接跟踪我的SIP通信的问题:如果你使用Wireshark跟踪你的数据包

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

* conntrack *是关键字。谢谢,节省了很多时间! – Kirzilla

+0

根据手册'-j CT --notrack'可以替换为'-j NOTRACK' –