iptables NAT需要30秒来开始redirect

我正在实现一个SIP代理,它应该能够redirect两个客户端之间的所有RTPstream量,而这两个客户端之间不能互相访问。 为了实现这一点,我决定在SIP / SDP消息中操纵协商好的地址,并使用iptables规则redirectRTPstream量。

如果发送RTP数据包的源发生更改,则会出现问题。 在这种情况下,iptables需要30秒才能开始redirect来自新源的stream量。

为了详细解释我正在尝试做什么,假设我有两个SIP客户端和我的代理服务器:

  • Bob的SIP客户端运行在192.168.1.1
  • Alice的SIP客户端运行在192.168.2.1
  • 代理运行在192.168.3.1。
  • 鲍勃和爱丽丝的networking不能达到对方。 代理知道Bob和Alicenetworking。

Bob呼叫Alice,在其SIP / SDP消息中通知他将监听192.168.1.1:8000处的RTPstream量。 然后,代理将此地址更改为192.168.3.1:15000,并将新的SIP / SDP消息转发给Alice。 现在,来自Alice的所有RTPstream量都将被发送到代理服务器。 要将这个stream量redirect回Bob,代理添加以下规则到iptables:

iptables -t nat -A OUTPUT -d 192.168.3.1 -p UDP --dport 15000 -j DNAT --to 192.168.1.1:8000 iptables -t nat -A PREROUTING -d 192.168.3.1 -p UDP --dport 15000 -j DNAT --to 192.168.1.1:8000 iptables -t nat -A POSTROUTING -d 192.168.1.1 -p UDP --dport 8000 -j SNAT --to 192.168.3.1:15000 

现在,假设源RTPstream发生了变化。 出于某种原因,运行代理的机器正在生成RTPstream量,而不是Alice。

iptables规则不需要改变。 Iptables应该能够使用上面的OUTPUT规则redirect这个新的RTPstream量。 但是,iptables需要30秒才能将stream量redirect到Bob。

经过一番研究,我发现这个问题可能是由conntrack表引起的,必须等待它的条目“Alice-> Bob”在添加一个新的条目“Proxy-> Bob”之前到期。 我可以确认,当我看着/ proc / net / ip_conntrack。

我的规则没有指定来源,因为我并不总是拥有它,它可以dynamic改变而不告诉代理。 所以,我不能删除conntrack条目手动使用conntrack工具,因为我在其他职位阅读。

任何想法如何处理这个问题?

NAT + SIP + RTP不是一件容易的事情。 (当源/目标IP地址发生改变的时候是双重的)还有更多的东西需要调整,而不仅仅是源地址和目标地址。 在实际的SIP会话本身中,有些位也必须被破坏(这是conntrack模块的作用)。 SIP用于协商每个对等端必须连接的源和目的地以便交换RTP数据。 由于所有stream量都是UDP(无连接),因此conntrack模块必须等待超时或者在连接被视为死亡之前结束呼叫,并从表中删除。

要解决你的问题,你需要一个正确的SIP代理…不是iptables。 在这种情况下,电话将连接到代理,代理将连接到远程对等的代理,远程代理将连接到远程对等。 在这个例子中,将有3个单独的连接,如果其中一个路由器有一个IP改变,它只是重新发送远程代理,并且连接被恢复。 你也不再需要iptables来打包数据包。