mDNS故障排查(译)
WLC上mDNS网关的理解及排查
第一部分:介绍
这篇文档描述了Bonjour协议在WLC上的操作,该文档旨在协助工程师理解该工作流量的原理以及提供故障排查的指导。
第二部分:需求和前提
知识需求:
Cisco建议你对Bonjour协议、在WLC配置mDNS、以及多播路由有一定的基础知识,以便你能更好的理解。
设备组件:
该文档是基于如下设备和相关软件版本完成的:
- AIR-CT2504-K9 WLC, 8.2.141.0
- WS-C3560CX-8PC-S
- AIR-CAP3702I-E-K9
- Apple TV
- Iphone5s, 10.2
该文档是在指定的LAB环境中完成的,所有的设备开始都是默认的配置。如果你的网络是在线的,有业务,那么需要你了解你的操作对网络的潜在影响。
第三部分:背景信息
Bonjour协议是一种Apple服务发现协议,它使用多播域名系统(multicast Domain Name System,mDNS)服务记录来定位本地网络上的设备和服务。
Bonjour协议通过服务通告(service announcements)和服务查询(service queries)来运作。每个查询和通告消息都以组播地址224.0.0.251为目的地址发送出去(如果在IPv6中,地址为FF02::FB),该协议在UDP5353上使用mDNS。
Bonjour协议使用的地址是链路本地多播地址,因此仅转发到本地L2网络。路由器无法使用多播路由重定向流量,因为生存时间(TTL)设被置为1。那么,这就有一个问题,所有的服务提供者(或者称为源,通告服务的设备)和Bonjour客户端(请求服务的设备)都必须位于同一子网,这就限制扩展性。那么,为了解决这个问题,思科WLC就充当这个Bonjour的网关。由WLC来监听Bonjour服务,缓存这些来自源的Bonjour通告(例如AirPlay、AirPrint等)。例如,Apple TV会在Bonjour客户端请求服务的时候给予响应。那么这样的方式就就可以让源和客户端位于不同的子网中。
第四部分:配置拓扑
网络拓扑图
第五部分:数据流和debug操作
当mDNS在Cisco WLC上运行时,会发生如下基本的四个步骤。 这些步骤描述如下:
步骤1:当在WLC全局开启mDNS
默认情况下,WLC(version8.3.143)上mDNS监听如下的服务:
如下所示的是自定义的mDNS profile:其中的每一个服务都有一个Service String与之关联。Service Strings是为服务查询匹配服务实例的。一个服务类型就是包含了服务名称(Service Name)和协议(Protocol)。另外,它还可以包含一个或多个子类型标识符(subtype identifiers)。如下的AppleTV Service使用 _airplay._tcp.local. 这个字符串。
当mDNS全局开启的时候,控制器会发送mDNS queries消息到目的组播地址224.0.0.251,以查询有线和无线网络的服务。
如下的抓包信息,是在WLC switch port抓取,我们可以看到80、81和82 三个query报文是以management(10.48.39.142)和动态接口(192.168.232.11 & 192.168.239.8)作为源,发送到组播地址224.0.0.251的,来查询有线网络上的服务。
包83显示的是WLC发送到无线网络的查询。在内部的报文显示WLC的查询报文还是以源为management,目的地址为224.0.0.251的。无线上的query报文,会被添加上CAPWAP头部,该报文外部的IP地址还是management,但是此图中目的地址就是组播地址239.100.100.100了。
其中的组播地址239.100.100.100,是在WLC全局配置的。APs会加入这个组播组以监听这个它。WLC转发query报文到这个组播组,APs收到查询报文后,将它发送到无线空口环境。这个组播地址239.100.100.100只出现在WLC和APs的CAPWAP的头部中,无线clients不会感知到它(但是clients看得到作为数据封装在报文中的原始mDNS报文)。
这里的设置中,WLC是2504在vlan1中,并且AP在vlan231。由于这两个设备是在不同的vlan,那么需要在vlan1和vlan231的有线网络开启组播路由,才能使其正常工作。
注意:如果组播路由没有在WLC和AP的管理VLAN开启,则必须将AP组播模式设置为单播。在此模式下,WLC将每个多播数据包单播发送到与WLC关联的每个AP。此模式效率非常低,不建议使用。
如下抓取的数据包是query数据包的详细部分:
如下的debug信息体现的之前抓取报文的相同部分:
(Cisco Controller) >debug mdns all enable
Cisco Controller) >*emWeb: Feb 22 16:24:18.203: bgSetBonjourAccessPolicy :1192 Bonjour AccessPolicy status is already in requested state Disabled
*emWeb: Feb 22 16:24:18.203: bgSetBonjourQueryInterval :1359 Bonjour query interval is already configured for requested value = 15
*Bonjour_Process_Task: Feb 22 16:24:18.215: bonjourProcessTask : 220 Processing message type = BONJOUR_AGGREGATED_QUERY
*Bonjour_Process_Task: Feb 22 16:24:18.215: sendBonjourPkt : 3881 sendBonjourPkt msg-type = BONJOUR_AGGREGATED_QUERY toSend = all
*Bonjour_Process_Task: Feb 22 16:24:18.216: Send to Wired, All vlan is TRUE
*Bonjour_Process_Task: Feb 22 16:24:18.216: sendBonjourPacketToWired : 3652 sending aggregated query on interface = management
*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2916 Preparing for l2 Multicast send
*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2936 allVlan = 0 , vlanId = 0
*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 2948 simInterfaceMacAddrGet( management ) = 00:A2:89:B9:62:60
*Bonjour_Process_Task: Feb 22 16:24:18.216: Inside buildBonjourAggregatedQuery, available len = 1458
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : 7339 Sending mDNS AGGREGATED query for services configured in MSAL-DB
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 1 ] Including SRV = AirPrint in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 2 ] Including SRV = AirTunes in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 3 ] Including SRV = AppleTV in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 4 ] Including SRV = HP_Photosmart_Printer_1 in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 5 ] Including SRV = HP_Photosmart_Printer_2 in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : [ 6 ] Including SRV = Printer in aggregated query packet
*Bonjour_Process_Task: Feb 22 16:24:18.216: -----------------------------------------
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : PACKET-1 mDNS-QUERY sent for [ 6 ] services
*Bonjour_Process_Task: Feb 22 16:24:18.216: fillBonjourAggregatedQuery : mDNS-QUERY sent for all services in [ 1 ] packets
*Bonjour_Process_Task: Feb 22 16:24:18.216: -----------------------------------------
*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket : 3054 BONJOUR_AGGREGATED_QUERY: buildBonjourAggregatedQuery()STATUS = 0
*Bonjour_Process_Task: Feb 22 16:24:18.216: buildBonjourPacket MCAST-DST-IP ADDR = 224.0.0.251
步骤2:WLC缓存Bonjour服务(Apple TV通告)
在此数据包中,Apple TV(192.168.239.37)向224.0.0.251发送通告。 由于在这种情况下Apple TV是无线的,因此可以看到通过capwap发送的通告报文。 WLC仅注意一次mDNS服务响应,但是,该缓存条目具有TTL,并且需要keepalive来维护它,如图所示。
如下报文是Apple TV的响应:
这些debug信息显示Apple TV响应WLC的查询。 在这种情况下,Apple TV以21种服务作为回应,其中只有Airplay服务受到关注。
*Bonjour_Msg_Task: Feb 23 16:22:02.372: 18:ee:69:11:dc:60 Parsing 21 Bonjour Answers.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1562 aStringNameStr = Wireless Team (4)._airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1579 RR: Wireless Team (4)._airplay._tcp.local., aType: 16, aClass: 32769, aTTL: 4500, aDataLen: 207, ptr: 0x327a9ca8, end: 0x327aa100
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1581 aStringNameStr : Wireless Team (4)._airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: Found Service Name:_airplay._tcp.local., Service Provider Name:Wireless Team (4)._airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgServiceAllowedInMsalDb : 181 srv_str = _airplay._tcp.local. type = Wireless
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgServiceAllowedInMsalDb : 195 Incoming Service Advertisement string = _airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: Service-Name = AppleTV Service-String = _airplay._tcp.local. Type = all Origin = Wireless FOUND and is ALLOWED FOR LEARNING
<<< Airplay service registered in WLC DB >>
*Bonjour_Msg_Task: Feb 23 16:22:02.374: Service Name:_airplay._tcp.local. is supported in Master-service-db
*Bonjour_Msg_Task: Feb 23 16:22:02.374: aDataLen: 2, aSrPtrRecord.aSrvProName.size: 39
*Bonjour_Msg_Task: Feb 23 16:22:02.374: Updating updateBonjourSrPtrDb:
*Bonjour_Msg_Task: Feb 23 16:22:02.374: aType: 12, aClass: 1, aTTL: 4500, aDataLen: 2, ptr: 0x327a9d93, end: 0x327aa100
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : .. < SP-SR_PTR PKT >...
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : SERVICE NAME ......... = AppleTV
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : SERVICE STRING ....... = _airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : SERVICE PROVIDER ..... = Wireless Team (4)._airplay._tcp.local.
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : aTTL ................. = 4500n
*Bonjour_Msg_Task: Feb 23 16:22:02.374: bgProcessServiceAdvRsp : 1546 msg : 0x327a9bda, ptr : 0x327a9d93, end : 0x327aa100, pld_len : 877
步骤3:WLC监听客户端针对对应服务的query
之后,在任何时间点,无线客户端(192.168.232.98)发送一个请求airplay service的query报文(通常在客户端打开一个具有播放功能的应用程序时),如图所示:
*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d Parsing 2 bonjour questions
*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d Query Service Name: _airplay._tcp.local., RR-Type: TYPE_DOMAIN_NAME_PTR , Class: 1
*Bonjour_Msg_Task: Feb 27 17:03:15.603: processBonjourPacket : 1017 qNameStr : _airplay._tcp.local., bonjServiceNameStr : _airplay._tcp.local., bonjSpNameStr : _airplay._tcp.local.
*Bonjour_Msg_Task: Feb 27 17:03:15.603: Service Name : AppleTV Service String : _airplay._tcp.local. is supported in MSAL-DB
*Bonjour_Msg_Task: Feb 27 17:03:15.603: 00:6d:52:5d:5a:7d SRV : _airplay._tcp.local. is supported by client profile : default-mdns-profile
步骤4:WLC发送对应Bonjour服务的单播响应给客户端
WLC使用缓存服务Wireless Team(4)._ airplay._tcp.local进行响应。 内部数据包的源IP是客户端vlan的动态接口,在本例中为192.168.232.11,如图所示。
如下是debug片段:
BONJOUR_AGGREGATED_QUERY_RESPONSE
*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SRV-NAME ..... : AppleTV
*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SP-NAME....... :
*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : SEND TO ...... : BONJOUR_PKT_TO_WIRELESS
*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : VLAN ......... : 232
*Bonjour_Process_Task: Feb 27 17:03:45.229: buildBonjourQueryResponsePld : IS MCAST ..... : NO
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : DST-MAC ...... : 00:6D:52:5D:5A:7D
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : DST-IP ....... : 192.168.232.98
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : ALL mDNS-AP .. : 0
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : TTL COUNTER .. : TIMEOUT_RESET
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : RESTART TIME . : 0
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : SNOOP STATUS . : 0
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : LSS STATUS ... : DISABLED
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : RSP SRV NAME . : AppleTV
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : MSG-ID ....... : 0
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld : POLICY STATUS : DISABLED
*Bonjour_Process_Task: Feb 27 17:03:45.230: buildBonjourQueryResponsePld INCLUDING SpData : Wireless Team (4)._airplay._tcp.local. in AGGREGATED QUERY RESPONSE
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SR-PTR RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SD-PTR RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID SRV RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID TXT RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID NSEC RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID DOMAIN RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: fillBonjourDomain : 6055 : attaching SP-DOMAIN RR
*Bonjour_Process_Task: Feb 27 17:03:45.233: VALID DOMAIN-NSEC RR FOUND, attaching.....
*Bonjour_Process_Task: Feb 27 17:03:45.233: buildBonjourPacket DST-IP ADDR = 192.168.232.98
*Bonjour_Process_Task: Feb 27 17:03:45.233: Transmitting bonjour Pkt to STA: 00:6D:52:5D:5A:7D
*Bonjour_Process_Task: Feb 27 17:03:45.233: Unicast Packet sent to client 00:6D:52:5D:5A:7D success.
第六部分:验证和故障排查
本节提供了可用于确认和排除配置故障的信息。
为了识别和隔离mDNS中的问题,需要配置正确,因此只需要很少的基本检查。
步骤1:mDNS必须全局开启
WLC的GUI界面,Controller>mDNS
CLI界面查看:
show network summary (snippet)
mDNS snooping............................... Enabled
mDNS Query Interval......................... 15 minutes
步骤2:如果你使用的是自定义的mDNS profile,确定所有的所需的服务都被添加进去。
步骤3:保证mDNS在对应的SSID下面开启,并且对应了正确的mDNS profile。
通过GUI界面查看,WLAN>WLAN ID>Advanced
通过CLI查看:
show wlan <ID> (snippet)
mDNS Status...................................... Enabled
mDNS Profile Name................................ default-mdns-profile
步骤4:验证mDNS服务提供者是否在“Domain Names”列表中。
GUI查看:Controller>mDNS>mDNS Domain Name IP>Summary,这里就是WLC缓存的domain names(例如Apple TV,Airprinters)。
CLI查看:
show mdns domain-name-ip summary
Number of Domain Name-IP Entries................. 1
DomainName MAC Address IP Address Vlan Id Type TTL Time left (sec) (sec)
-------------------- ---------------- ---------------- ------- ------ ------ ------
Wireless-Team-3.local. 18:ee:69:11:dc:60 192.168.239.37 239 Wireless 4725 4163
步骤5:验证服务提供者是否在指定的服务下面
GUI查看:Controller>mDNS>General>Service Name
CLI查看:
show mdns service detailed AppleTV
Service Name..................................... AppleTV
Service String................................... _airplay._tcp.local.
Service Id....................................... 3
Service query status............................. Enabled
Service LSS status............................... Disabled
Service learn origin............................. Wireless and Wired
Number of Profiles............................... 1
Profile.......................................... default-mdns-profile
Number of Service Providers ..................... 1
Number of priority MAC addresses ................ 0
ServiceProvider MAC Address AP Radio MAC Vlan Id Type TTL Time left(sec) (sec)
-------------------- ---------------- ---------------- ------- ------ ----- ---------
Wireless Team (4)._airplay._tcp.local. 18:EE:69:11:DC:60 A4:6C:2A:7C:8F:80 239 Wireless 4500 3841
步骤6:如果WLC未发现该服务,则检查是否在Bonjour browser(Controller >> mDNS >> mDNS browser)中学到了。 Bonjour browser是在WLC上看到的所有服务通告的缓存,由于配置不允许学习而未被发现。 我们可以通过从Bonjour browser中选择服务来添加该服务,这在我们测试和实施新服务时非常方便。
步骤7:如下是debug Bonjour的相关命令(注意,命令开启后,信息很多!)
debug mdns error enable
debug mdns message enable
debug mdns detail enable
debug mdns all enable
Bonjour browser和 show mdns service not-learnt 也可以作为排查根据提供帮助。
步骤8:如前所述,如果WLC和AP位于不同的子网中且AP组播模式被设置为组播,则确保在两个vlan之间的有线网络上启用了组播路由。 在此设置中,vlan是vlan 1(WLC)和vlan 231(AP)。
Conf t
!
interface Vlan1
ip pim sparse-dense-mode
!
interface Vlan231
ip pim sparse-dense-mode
!
组播路由如下所示:
Gateway#sh ip mroute 239.100.100.100
IP Multicast Routing Table
-------snippet--------------------
(*, 239.100.100.100), 2w4d/stopped, RP 10.48.39.5, flags: SJC
Incoming interface: Null, RPF nbr 0.0.0.0
Outgoing interface list:
Vlan231, Forward/Sparse-Dense, 2w0d/00:02:10
Vlan232, Forward/Sparse-Dense, 2w4d/00:02:11
(10.48.39.142, 239.100.100.100), 2w4d/00:02:50, flags: T
Incoming interface: Vlan1, RPF nbr 0.0.0.0, RPF-MFD
Outgoing interface list:
Vlan231, Forward/Sparse-Dense, 2w0d/00:02:10, H
除了这些检查项外,关键是要了解mDNS在WLC上运行时的数据包流。 数据包流和debug有助于深入研究上述验证命令不足的部分。
原文链接:https://www.cisco.com/c/en/us/support/docs/wireless/wireless-lan-controller-software/210835-Troubleshooting-mDNS.html#anc13