Sip 如何让Kamailio将'Record Route'头设置为内部IP,用于内部通话?

Sip 如何让Kamailio将'Record Route'头设置为内部IP,用于内部通话?,sip,nat,kamailio,Sip,Nat,Kamailio,我有Kamailio 5.4.1(和RTPEngine)运行在一个内部服务器上,该服务器具有一个私有IP地址172.31.7.96,并且一对一NAT到一个外部IP地址。外部IP为192.0.2.100。(注意:内部IP地址都未经编辑,但公共IP已替换为TEST-NET-1和TEST-NET-2示例地址。)我最终将使用RTPEngine进行代码转换,但目前这是一个简单的SIP代理 我有一个Java应用程序,它可以设置在内部服务器上运行的SIP调用,该服务器具有专用IP地址172.31.7.171。

我有Kamailio 5.4.1(和RTPEngine)运行在一个内部服务器上,该服务器具有一个私有IP地址
172.31.7.96
,并且一对一NAT到一个外部IP地址。外部IP为
192.0.2.100
。(注意:内部IP地址都未经编辑,但公共IP已替换为
TEST-NET-1
TEST-NET-2
示例地址。)我最终将使用RTPEngine进行代码转换,但目前这是一个简单的SIP代理

我有一个Java应用程序,它可以设置在内部服务器上运行的SIP调用,该服务器具有专用IP地址
172.31.7.171
。Java应用程序设置了
properties.setProperty(“javax.sip.OUTBOUND_PROXY”,“172.31.7.96”)
将Kamailio用作出站SIP代理

Kamailio服务器是一个库存Kamailio示例配置,有以下更改:

#!define WITH_NAT
#!define WITH_RTPENGINE
#!define WITH_MYSQL
#!define WITH_AUTH
#!define WITH_IPAUTH

#!define WITH_DEBUG

listen=udp:0.0.0.0:5060 advertise 192.0.2.100:5060

#!define DBURL "mysql://kamailio:REAL_PASSWORD_HERE@127.0.0.1/kamailio"
我已使用
kamctl address add 172.31.7.171 32 5060将Java服务器的IP作为允许的服务器添加到Kamailio数据库中

我正试图在位于
198.51.100.200的SIP服务器上呼叫分机
2003

我的Java服务器遵循
OUTBOUND\u PROXY
设置,并向Kamailio发送以下请求:

INVITE sip:2003@198.51.100.200:5060 SIP/2.0
Call-ID: 7979ef9aadc442801835750ef2564a19@172.31.6.171
CSeq: 1 INVITE
From: <tel:+18005551234>;tag=1eu0cJThbWsUcycT
To: <sip:2003@198.51.100.200:5060>
Max-Forwards: 70
Contact: <sip:+18005551234@172.31.6.171:5060;lr>
Content-Type: application/sdp
Via: SIP/2.0/UDP 172.31.6.171:5060;branch=z9hG4bK-343236-823591d229bb5a87df35606cbc45e6e6
Content-Length: 788

v=0
o=- 3808349342 3808349342 IN IP4 172.31.6.171
s=Kurento Media Server
c=IN IP4 172.31.6.171
t=0 0
m=audio 29134 RTP/AVPF 96 0 97
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:96 opus/48000/2
a=rtpmap:97 AMR/8000
a=rtcp:29135
a=sendrecv
a=mid:audio0
a=ssrc:3129303479 cname:user3476653135@host-5072a15e
m=video 15672 RTP/AVPF 102 103
a=setup:actpass
a=extmap:3 http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time
a=rtpmap:102 VP8/90000
a=rtpmap:103 H264/90000
a=rtcp:15673
a=sendrecv
a=mid:video0
a=rtcp-fb:102 nack
a=rtcp-fb:102 nack pli
a=rtcp-fb:102 goog-remb
a=rtcp-fb:102 ccm fir
a=rtcp-fb:103 nack
a=rtcp-fb:103 nack pli
a=rtcp-fb:103 ccm fir
a=ssrc:1221454331 cname:user3476653135@host-5072a15e
Kamailio将其翻译并发送回我的Java应用程序:

SIP/2.0 200 OK
Via: SIP/2.0/UDP 172.31.6.171:5060;rport=5060;branch=z9hG4bK-343236-823591d229bb5a87df35606cbc45e6e6
Record-Route: <sip:192.0.2.100;lr;nat=yes>
From: <tel:+16676664567>;tag=1eu0cJThbWsUcycT
To: <sip:2003@198.51.100.200:5060>;tag=as7825a958
Call-ID: 7979ef9aadc442801835750ef2564a19@172.31.6.171
CSeq: 1 INVITE
Server: FPBX-13.0.197.22(13.28.1)
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Contact: <sip:2003@198.51.100.200:5060>
Content-Type: application/sdp
Content-Length: 363

v=0
o=root 2047371680 2047371680 IN IP4 172.31.7.96
s=Asterisk PBX 13.28.1
c=IN IP4 172.31.7.96
b=CT:384
t=0 0
m=audio 50076 RTP/AVPF 0
a=maxptime:150
a=mid:audio0
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:50077
m=video 50116 RTP/AVPF 103 102
a=rtcp-fb:* ccm fir
a=mid:video0
a=rtpmap:103 H264/90000
a=rtpmap:102 VP8/90000
a=sendrecv
a=rtcp:50117
这里的问题是,我的内部服务器实际上无法将流量路由到Kamailio服务器的公共IP,因此
ACK
永远不会到达那里

我尝试像这样向Kamailio添加第二个
listen
指令,然后将
OUTBOUND_PROXY
设置为使用端口
5061
,但Kamailio也尝试将
172.31.7.96:5061
放入出站SIP消息中:

listen=udp:0.0.0.0:5060 advertise 192.0.2.100:5060
listen=udp:172.31.7.96:5061

如何配置Kamailio在与内部服务器通话时使用其私有IP,在与外部服务器通话时使用其公共IP?

为了解决此问题,我将内部SIP服务器上的IPv6用于信令,将IPv4用于RTP媒体。

请注意,
mhomed=1
不是此问题的正确答案,因为只有当两个IP都与服务器直接关联时,它才起作用。它不适用于1对1 NAT。
SIP/2.0 200 OK
Via: SIP/2.0/UDP 172.31.6.171:5060;rport=5060;branch=z9hG4bK-343236-823591d229bb5a87df35606cbc45e6e6
Record-Route: <sip:192.0.2.100;lr;nat=yes>
From: <tel:+16676664567>;tag=1eu0cJThbWsUcycT
To: <sip:2003@198.51.100.200:5060>;tag=as7825a958
Call-ID: 7979ef9aadc442801835750ef2564a19@172.31.6.171
CSeq: 1 INVITE
Server: FPBX-13.0.197.22(13.28.1)
Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH, MESSAGE
Supported: replaces, timer
Contact: <sip:2003@198.51.100.200:5060>
Content-Type: application/sdp
Content-Length: 363

v=0
o=root 2047371680 2047371680 IN IP4 172.31.7.96
s=Asterisk PBX 13.28.1
c=IN IP4 172.31.7.96
b=CT:384
t=0 0
m=audio 50076 RTP/AVPF 0
a=maxptime:150
a=mid:audio0
a=rtpmap:0 PCMU/8000
a=sendrecv
a=rtcp:50077
m=video 50116 RTP/AVPF 103 102
a=rtcp-fb:* ccm fir
a=mid:video0
a=rtpmap:103 H264/90000
a=rtpmap:102 VP8/90000
a=sendrecv
a=rtcp:50117
ACK sip:2003@198.51.100.200:5060 SIP/2.0
Call-ID: 7979ef9aadc442801835750ef2564a19@172.31.6.171
CSeq: 1 ACK
Via: SIP/2.0/UDP 172.31.6.171:5060;branch=z9hG4bK-343236-57a2ec825886f425ef0b9f8cf2034887
From: <tel:+18005551234>;tag=1eu0cJThbWsUcycT
To: <sip:2003@198.51.100.200:5060>;tag=as7825a958
Max-Forwards: 70
Route: <sip:192.0.2.100;lr;nat=yes>
Record-Route: <sip:192.0.2.100;lr;nat=yes>
Content-Length: 0
listen=udp:0.0.0.0:5060 advertise 192.0.2.100:5060
listen=udp:172.31.7.96:5061