通过 Cisco 881 NAT 拨入的 SIP 呼叫在几秒钟后挂断

通过 Cisco 881 NAT 拨入的 SIP 呼叫在几秒钟后挂断

我最近将 WAN 链路换成了 Cisco 881 路由器。我之前使用 Cisco Linksys WAG320N 作为调制解调器/路由器/WiFi AP/NAT 防火墙。WAG320N 现在以桥接模式运行,因此它只是充当调制解调器,其中一个 LAN 端口连接到FE4 WAN我的 Cisco 881 上。

Cisco 881 从我的 ISP 获取 DHCP 提供的 IP。我的 LAN 是默认 Vlan 1 (192.168.1.0/24) 的一部分。一般互联网连接工作正常,我已设法为在 LAN 上运行的 HTTP/HTTPS/SMTP/等服务设置静态 NAT 规则。我不知道是否值得一提的是,我选择使用 NVI NAT(ip nat enable而不是传统的ip nat outside/ ip nat inside)设置。我这样做的原因是 NVI 允许从我的 LAN 到 WAN IP 进行 NAT 环回,并返回到 LAN 上的必要服务器。

我在 LAN 上运行 Asterisk 1.8 PBX,它连接到互联网上的 SIP 提供商。通过旧设置(WAG320N 提供路由/NAT)的入站和出站呼叫都运行良好。但是,自从转移到 Cisco 881 后,入站呼叫在大约 10 秒后中断,而出站呼叫则运行正常。

我的 Asterisk PBX 上记录了以下消息:

[Dec  9 15:27:45] WARNING[27734]: chan_sip.c:3641 retrans_pkt: Retransmission timeout reached on transmission [email protected] for seqno 1 (Critical Response) -- See https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions
Packet timed out after 6528ms with no response
[Dec  9 15:27:45] WARNING[27734]: chan_sip.c:3670 retrans_pkt: Hanging up call [email protected] - no reply to our critical packet (see https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions).

(我知道这是一个相当常见的问题——我花了整整两天的时间在 Google 上搜索这个问题。)

我已经按照要求做了,并检查过了https://wiki.asterisk.org/wiki/display/AST/SIP+Retransmissions。参考上面链接页面中的“其他 SIP 请求”部分,我相信挂断是由于ACK我的 SIP 提供商未通过 NAT 传回我的 PBX 上的 Asterisk 造成的。

我尝试通过在 881 上的 WAN 接口上转储数据包来确定这一点。我设法获得了进出 WAN 接口的数据包的 PCAP 转储。以下是路由器从我的提供商处收到的 ACK 的示例:

689 21.219999   193.x.x.x   188.x.x.x   SIP 502 Request: ACK sip:[email protected] | 

但是 Asterisk 服务器上的 SIP 跟踪显示,没有ACK收到来自我的 PBX 的响应200 OK

http://pastebin.com/wwHpLPPz

过去,我曾被强烈建议禁用路由器和/或防火墙上的任何 SIP ALG,互联网上关于此问题的许多帖子似乎都支持这一点。但是,我相信在 Cisco IOS 上,禁用 SIP ALG 的配置命令似乎对情况no ip nat service sip udp port 5060没有帮助。要确认配置设置已设置:

Router1#show running-config | include sip
no ip nat service sip udp port 5060

另一个有趣的转折:在很短的一段时间内,我尝试了另一家提供商。幸运的是,我的试用帐户仍然可用,因此我将 Asterisk 配置恢复到与当前提供商集成之前的修订版本。然后,我拨入与试用中继关联的 DDI,呼叫没有挂断,我也没有收到上述错误!对我来说,这指向提供商,但是我知道,就像所有提供商一样,他们会说“我们的 SIP 代理没有问题 - 是您的防火墙。”我很想同意这一点,因为在旧的 WAG320N 路由器进行 NAT 时,这个问题并不明显。

我确信你也想看看我的运行配置:

!
! Last configuration change at 15:55:07 UTC Sun Dec 9 2012 by xxx
version 15.2
no service pad
service tcp-keepalives-in
service tcp-keepalives-out
service timestamps debug datetime msec localtime show-timezone
service timestamps log datetime msec localtime show-timezone
no service password-encryption
service sequence-numbers
!
hostname Router1
!
boot-start-marker
boot-end-marker
!
!
security authentication failure rate 10 log
security passwords min-length 6
logging buffered 4096
logging console critical
enable secret 4 xxx
!
aaa new-model
!
!
aaa authentication login local_auth local
!
!
!
!
!
aaa session-id common
!
memory-size iomem 10
!
crypto pki trustpoint TP-self-signed-xxx
 enrollment selfsigned
 subject-name cn=IOS-Self-Signed-Certificate-xxx
 revocation-check none
 rsakeypair TP-self-signed-xxx
!
!
crypto pki certificate chain TP-self-signed-xxx
 certificate self-signed 01
    quit
no ip source-route
no ip gratuitous-arps
ip auth-proxy max-login-attempts 5
ip admission max-login-attempts 5
!
!
!
!
!
no ip bootp server
ip domain name dmz.merlin.local
ip domain list dmz.merlin.local
ip domain list merlin.local
ip name-server x.x.x.x
ip inspect audit-trail
ip inspect udp idle-time 1800
ip inspect dns-timeout 7
ip inspect tcp idle-time 14400
ip inspect name autosec_inspect ftp timeout 3600
ip inspect name autosec_inspect http timeout 3600
ip inspect name autosec_inspect rcmd timeout 3600
ip inspect name autosec_inspect realaudio timeout 3600
ip inspect name autosec_inspect smtp timeout 3600
ip inspect name autosec_inspect tftp timeout 30
ip inspect name autosec_inspect udp timeout 15
ip inspect name autosec_inspect tcp timeout 3600
ip cef
login block-for 3 attempts 3 within 3
no ipv6 cef
!
!
multilink bundle-name authenticated
license udi pid CISCO881-SEC-K9 sn 
!
!
username xxx privilege 15 secret 4 xxx
username xxx secret 4 xxx
!
!
!
!
!
ip ssh time-out 60
! 
!
!
!
!
!
!
!
!
interface FastEthernet0
 no ip address
!
interface FastEthernet1
 no ip address
!
interface FastEthernet2
 no ip address
!
interface FastEthernet3
 switchport access vlan 2
 no ip address
!
interface FastEthernet4
 ip address dhcp
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip nat enable
 duplex auto
 speed auto
!
interface Vlan1
 ip address 192.168.1.1 255.255.255.0
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip nat enable
!
interface Vlan2
 ip address 192.168.0.2 255.255.255.0
!
ip forward-protocol nd
ip http server
ip http access-class 1
ip http authentication local
ip http secure-server
ip http timeout-policy idle 60 life 86400 requests 10000
!
!
no ip nat service sip udp port 5060
ip nat source list 1 interface FastEthernet4 overload
ip nat source static tcp x.x.x.x 80 interface FastEthernet4 80
ip nat source static tcp x.x.x.x 443 interface FastEthernet4 443
ip nat source static tcp x.x.x.x 25 interface FastEthernet4 25
ip nat source static tcp x.x.x.x 587 interface FastEthernet4 587
ip nat source static tcp x.x.x.x 143 interface FastEthernet4 143
ip nat source static tcp x.x.x.x 993 interface FastEthernet4 993
ip nat source static tcp x.x.x.x 1723 interface FastEthernet4 1723
!
!
logging trap debugging
logging facility local2
access-list 1 permit 192.168.1.0 0.0.0.255
access-list 1 permit 192.168.0.0 0.0.0.255
no cdp run
!
!
!
!
control-plane
!
!
banner motd 
Authorized Access only

!
line con 0
 login authentication local_auth
 length 0
 transport output all
line aux 0
 exec-timeout 15 0
 login authentication local_auth
 transport output all
line vty 0 1
 access-class 1 in
 logging synchronous
 login authentication local_auth
 length 0
 transport preferred none
 transport input telnet
 transport output all
line vty 2 4
 access-class 1 in
 login authentication local_auth
 length 0
 transport input ssh
 transport output all
!
!
end

...如果有用的话,这是我的 Asterisk SIP 配置:

[general]
context=default                 ; Default context for calls
allowoverlap=no                 ; Disable overlap dialing support. (Default is yes)
udpbindaddr=0.0.0.0             ; IP address to bind UDP listen socket to (0.0.0.0 binds to all)
                                ; Optionally add a port number, 192.168.1.1:5062 (default is port 5060)
tcpenable=no                    ; Enable server for incoming TCP connections (default is no)
tcpbindaddr=0.0.0.0             ; IP address for TCP server to bind to (0.0.0.0 binds to all interfaces)
                                ; Optionally add a port number, 192.168.1.1:5062 (default is port 5060)
srvlookup=yes                   ; Enable DNS SRV lookups on outbound calls
                                ; Note: Asterisk only uses the first host
                                ; in SRV records
                                ; Disabling DNS SRV lookups disables the
                                ; ability to place SIP calls based on domain
                                ; names to some other SIP users on the Internet
                                ; Specifying a port in a SIP peer definition or
                                ; when dialing outbound calls will supress SRV
                                ; lookups for that peer or call.
directmedia=no                  ; Don't allow direct RTP media between extensions (doesn't work through NAT)
externhost=<MY DYNDNS HOSTNAME> ; Our external hostname to resolve to IP and be used in NAT'ed packets
localnet=192.168.1.0/24         ; Define our local network so we know which packets need NAT'ing
qualify=yes                     ; Qualify peers by default
dtmfmode=rfc2833                ; Set the default DTMF mode
disallow=all                    ; Disallow all codecs by default
allow=ulaw                      ; Allow G.711 u-law
allow=alaw                      ; Allow G.711 a-law

; ----------------------
; SIP Trunk Registration
; ----------------------

; Orbtalk
register => <MY SIP PROVIDER USER NAME>:[email protected]/<MY DDI>       ; Main Orbtalk number

; ----------
; Trunks
; ----------

[orbtalk]                       ; Main Orbtalk trunk
type=peer
insecure=invite
host=sipgw3.orbtalk.co.uk
nat=yes
username=<MY SIP PROVIDER USER NAME>
defaultuser=<MY SIP PROVIDER USER NAME>
fromuser=<MY SIP PROVIDER USER NAME>
secret=xxx
context=inbound

我真的不知道该怎么办。如果有人能帮我找出这些电话被挂断的原因,我将不胜感激!如果需要更多信息,请告诉我。

更新日期 2012/10/12 (1)

@GerryEgan 建议我添加以下静态 NAT: ip nat source static udp 192.168.1.2 5060 interface FastEthernet 4 5060 虽然据我所知这似乎可以解决问题,但它会让我容易受到 5060 上的暴力攻击。

@GerryEgan 还建议了一条检查规则: ip inspect name autosec_inspect sip ... (config-if)#ip inspect autosec_inspect in在我的 WAN 接口上即使清除了 NAT NVI 转换,仅靠这一点也无法解决问题。

以下是debug ip nat sip一通掉线的来电: http://pastebin.com/3WHPcyDD

注意:如果我尝试no ip nat service sip udp port 5060上面提到的配置设置,我不会得到任何调试输出debug ip nat sip,所以现在,我ip nat service sip udp port 5060的配置中有默认设置 - 希望我不会因此而混淆。

更糟糕的是,我的静态 NAT NVI 规则在路由器重新加载时似乎变得混乱了 :-(。虽然这是另一个问题,但可能会对您的回复产生一定影响。

更新日期 2012/10/12 (2):当 Asterisk 挂断电话时,我看到以下内容/var/log/syslog

Dec 10 20:02:39 <PBX> asterisk[26620]: rc_avpair_new: unknown attribute 1490026597

更新日期:2012 年 11 月 12 日

@GerryEgan 建议添加:

access-list 101 permit udp X.X.X.X 0.0.0.255 host 1.2.3.4 eq 5060
access-list 101 deny   udp any any eq 5060
access-list 101 permit ip any any

interface FastEthernet4
ip access-group 101 in

我明白这个理论,所以我期待它能够起作用,但不幸的是,没有。

这很奇怪,因为我之前使用的 WAG320N 无需配置或 NAT 即可处理与同一提供商、PBX 等的 SIP。这促使我重建新的 881,因此为了完整起见,以下是当前配置:

!
! Last configuration change at 20:20:15 UTC Tue Dec 11 2012 by xxx
version 15.2
no service pad
service timestamps debug datetime msec
service timestamps log datetime msec
service password-encryption
!
hostname xxx
!
boot-start-marker
boot-end-marker
!
!
enable secret 4 xxxx
!
aaa new-model
!
!
aaa authentication login local_auth local
!
!
!
!
!
aaa session-id common
!
memory-size iomem 10
!
crypto pki trustpoint TP-self-signed-xxx
 enrollment selfsigned
 subject-name cn=IOS-Self-Signed-Certificate-xxx
 revocation-check none
 rsakeypair TP-self-signed-xxx
!
!
crypto pki certificate chain TP-self-signed-xxx
 certificate self-signed 01
  xxx
    quit
ip gratuitous-arps
ip auth-proxy max-login-attempts 5
ip admission max-login-attempts 5
!
!
!
!
!
ip domain list dmz.xxx.local
ip domain list xxx.local
ip domain name dmz.xxx.local
ip name-server 192.168.1.x
ip cef
login block-for 3 attempts 3 within 3
no ipv6 cef
!
!
multilink bundle-name authenticated
license udi pid CISCO881-SEC-K9 sn xxx
!
!
username admin privilege 15 secret 4 xxx
username joe secret 4 xxx
!
!
!
!
!
ip ssh time-out 60
! 
!
!
!
!
!
!
!
!
interface FastEthernet0
 no ip address
!
interface FastEthernet1
 no ip address
!
interface FastEthernet2
 no ip address
!
interface FastEthernet3
 switchport access vlan 2
 no ip address
!
interface FastEthernet4
 ip address dhcp
 ip access-group 101 in
 ip nat enable
 duplex auto
 speed auto
!
interface Vlan1
 ip address 192.168.1.x 255.255.255.0
 no ip redirects
 no ip unreachables
 no ip proxy-arp
 ip nat enable
!
interface Vlan2
 ip address 192.168.0.x 255.255.255.0
!
ip forward-protocol nd
ip http server
ip http access-class 1
ip http authentication local
ip http secure-server
!
!
ip nat source list 1 interface FastEthernet4 overload
ip nat source list 2 interface FastEthernet4 overload
ip nat source static tcp 192.168.1.x 1723 interface FastEthernet4 1723
!
!
access-list 1 permit 192.168.0.0 0.0.0.255
access-list 2 permit 192.168.1.0 0.0.0.255
access-list 101 permit udp 193.x.x.0 0.0.0.255 any eq 5060
access-list 101 deny   udp any any eq 5060
access-list 101 permit ip any any
!
!
!
!
control-plane
!
!
banner motd 
Authorized Access only

!
line con 0
 exec-timeout 15 0
 login authentication local_auth
line aux 0
 exec-timeout 15 0
 login authentication local_auth
line vty 0 4
 access-class 2 in
 login authentication local_auth
 length 0
 transport input all
!
!
end

您会注意到我使用了access-list 101 permit udp 193.x.x.0 0.0.0.255 any eq 5060而不是access-list 101 permit udp X.X.X.X 0.0.0.255 host 1.2.3.4 eq 5060。原因是,我的 WAN IP 由 DHCP 提供,因此在 之后我没有设置 IP 来输入host。我希望这是一个有效的替代方法(?)。

再次重申 - 此 SIP 提供商在我旧的“家用” Linksys WAG320N 上运行良好,无需配置 NAT 和防火墙。该系统默认禁用 SIP ALG。

另一个值得关注的点是 - 我目前无法通过此路由器对入站 PPTP 进行 NAT。看来 GRE 流量无法通过。虽然我知道这两者并不相同,但可能是相同的底层配置问题阻止了路由器正确地对每个协议的流量进行 NAT - 我可能搞错了方向...

更新日期:2012/12/16

当我在 Asterisk 的 sip.conf 中进行注释时,我看到了改进localnet=192.168.1.0/24;当省略此设置时,我能够接收入站呼叫而不会挂断。

我知道这可以看作是解决问题的办法,但它无法解释为什么 PBX 在 WAG320N 后面作为防火墙/路由器时,可以在此设置下工作约 6 个月。考虑到这一点,有人还有其他想法吗?注释掉该localnet指令对我来说不太合适,而且当它在旧路由器上工作得很好时,我不愿意依赖它作为永久解决方案。

答案1

我在部署的多个 881 上都遇到了执行 nat 过载和使用接口的问题。在大多数情况下,将 wan 链接设为静态 IP 并将 IP nat 过载命令更改为该 IP 已解决大多数通话甚至电话冻结问题。祝你好运

答案2

如果添加 NAT 和检查规则已经解决了问题,但您不想将端口开放到互联网,为什么不向 WAN 接口添加访问列表以仅允许来自 SIP 提供商 IP 地址范围的端口 5060 上的流量? 你需要类似的东西:

access-list 101 permit udp X.X.X.X 0.0.0.255 host 1.2.3.4 eq 5060
access-list 101 deny   udp any any eq 5060
access-list 101 permit ip any any

其中 XXXX/24 是您的 SIP 提供商范围,1.2.3.4 是您的外部 IP。然后使用以下命令将其应用于您的外部接口:

interface FastEthernet4
ip access-group 101 in

从您的更新中我不确定 NAT 规则是否完全修复了它,并且您已将其删除以便以另一种方式使其工作,或者它是否仍然无法与 NAT 规则一起工作...如果 NAT 修复了它,添加访问列表,您应该会很好。如果还有更多问题,请告诉我。

答案3

我已经在两个 VPS 之间切换了整整一个月,一直遇到同样的问题,一个 VPS 功率不足但运行正常,另一个 VPS 功率过大,也遇到同样的问题。在网上找遍了也没有答案,我不得不继续测试,直到找到问题所在。我通过 FreePBX Advance 设置设置了“qualify=no”,之后一切都开始正常工作。

唯一的罪魁祸首是 Qualify。

相关内容