一、背景
Horizon集成NSX-V 环境与外网通信正常,但是在访问PCoIP协议时,访问受阻,咨询网络管理人员,相关策略已开放,下图为网络人员反馈的网络策略:
上图中tcp,udp的443和4172均已开通,且公网地址与业务地址关系的映射已成功解析,相关端口也关联正常。但是,内部网络测试访问PcoIP正常,故分析网络故障点依然在外网与业务网络映射部分;遂继续协调相关网络口,对网络路径和策略排查调试验证;因故障定位相对困难,需要在NSX-edge上抓包分析以帮助网络人员更好定位问题,那怎么抓包呢?NSX-edge是vmware封装的系统,非传统linux版本;相关指令不全,诸如route -n,netstat -an | grep 端口,tcpdump -nn -i 网卡 host 源ip;对此,本文就将介绍如何在nsx-edge上抓包及本次故障过程排查处理过程,以便相关类似问题处理参考。
二、处理过程
1、NSX-edge上路由信息:show ip route
2、NSX-edge上我来接口:show interface
3、网络人员反馈的入口策略:
4、vNIc_0端口上捕获流量,执行:debug packet display interface vNic_0
注意: 上述命令会向屏幕输出大量数据,并可能在ESG上导致性能问题,因此不建议在流量很大的生产环境中运行该命令。
5、为避免上述命令刷屏,可将抓包信息以文件形式输出,执行:
edge> debug packet capture interface vNic_0 //该命令实际底层还是使用tcpdump,因此执行时可配合表达式或过滤器,表达式之间使用下划线连接
注: debug packet capture interface vNic可以将流量数据包输出到文件而不再屏幕输出;
eg1:排除某ip在捕获之外
debug packet display interface vNic_0 not_port_22_and_not_host_10.129.37.61
下图是我捕获特定端口的流量:
如果有流量:
6、对文件执行捕获之后,可使用以下命令列出所有捕获文件:debug show files
7、然后利用ftp和scp将该文件复制到本地,供wireshark分析:
debug copy scp root@10.129.37.1:/root/tcpdump_vNic_0.0 tcpdump_vNic_0.0
也可以直接ssh连到nsx-edge上利用软件自带的scp复制到本地,效果如下:
wireshark参看:wireshark操作使用。
8、最后通过排查,网络人员定位4172端口udp相关的端口映射策略未正确配置,导致本次网络端口映射失败,网络无法访问,添加后测试正常。
三、附录:
1)wireshark过滤器
1》捕捉过滤器:
语法: Protocol Direction Host(s) Value LogicalOperations Other expression
eg1:
tcp dst 10.1.1.180 and tcp dst 10.2.2.2 3128
not tcp port 3128 and tcp port 23″与”(not tcp port 3128) and tcp port 23″相同
not tcp port 3128 and tcp port 23″与”not (tcp port 3128 and tcp port 23)”不同
选项:
Protocol(协议):
可能的值: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp and udp;如果没有特别指明是什么协议,则默认使用所有支持的协议。
Direction(方向):
可能的值: src, dst, src and dst, src or dst;如果没有特别指明来源或目的地,则默认使用 “src or dst” 作为关键字。
例如,”host 10.2.2.2″与”src or dst host 10.2.2.2″是一样的。
Host(s):
可能的值: net, port, host, portrange;如果没有指定此值,则默认使用”host”关键字。
例如,”src 10.1.1.1″与”src host 10.1.1.1″相同。
Logical Operations(逻辑运算):
可能的值:not, and, or;否(“not”)具有最高的优先级。或(“or”)和与(“and”)具有相同的优先级,运算时从左至右进行。
常用过滤表达式规则:
ip.src 192.168.1.102 //显示源地址为192.168.1.102,同理ip.dst
ip.src 192.168.1.102 or ip.dst192.168.1.102 //源地址或者目标地址是
tcp.port 80;tcp.srcport == 80
http.request.method"GET"//只显示HTTP GET方法
eth.addr 00:11:22:33:44:55//过滤目标或源地址是00:11:22:33:44:55的数据包t
tcp dst port 3128 //显示目的TCP端口为3128的封包
ip src host 10.1.1.1 //显示来源IP地址为10.1.1.1的封包
host 10.1.2 //显示目的或来源IP地址为10.1.2.3的封包
src portrange 2000-2500 //显示来源为UDP或TCP,且端口号在2000至2500范围内的封包
src host 10.7.2.12 and not dst net 10.200.0.0/16 //显示来源IP地址为10.7.2.12,但目的地不是10.200.0.0/16的封包
(src host 10.4.1.12 or src net 10.6.0.0/16) and tcp dst portrange 200-10000 and dst net 10.0.0.0/8 //显示来源IP为10.4.1.12或者来源网络为10.6.0.0/16,目的地TCP端口号在200至10000之间,且目的位于网络 10.0.0.0/8内的所有封包
src net 192.168.0.0/24 or src net 192.168.0.0 mask 255.255.255.0
ether proto /ip // (与关键字”ip”相同),因与ip关键字相同,它作为值时,需使用反斜杠“/”,同理:
ip proto /icmp” //与关键字”icmp”相同
no broadcast //排除广播请求
2》显示过滤器:
语法:
Protocol.String 1.String 2 Comparison operatorValue LogicalOperations Otherexpression
如果过滤器的语法是正确的,表达式的背景呈绿色。如果呈红色,说明表达式有误。
ip.addr == 10.1.1.1 //显示来源或目的IP地址为10.1.1.1的封包
ip.src != 10.1.2.3 or ip.dst != 10.4.5.6 //显示来源不为10.1.2.3或者目的不为10.4.5.6的封包
ip.src != 10.1.2.3 and ip.dst != 10.4.5.6 //显示来源不为10.1.2.3并且目的IP不为10.4.5.6的封包
tcp.port == 25 //显示来源或目的TCP端口号为25的封包
tcp.dstport == 25 //显示目的TCP端口号为25的封包
tcp.flags //显示包含TCP标志的封包
tcp.flags.syn == 0×02 //显示包含TCP SYN标志的封包
http.request.uri matches “.gif$” //匹配过滤HTTP的请求URI中含有".gif"字符串,并且以.gif结尾(4个字节)的http请求数据包($是正则表达式中的结尾表示符)
http.request.uri contains “.gif$” //匹配过滤HTTP的请求URI中含有".gif$"字符串的http请求数据包(这里$是字符,不是结尾符)
eth.addr[0:3]==00:1e:4f //过滤MAC地址前3个字节是0x001e4f的数据包
udp[8]==14 //过滤udp的数据段payload(14是十六进制0x14)匹配payload第一个字节0x14的UDP数据包;(数字8是表示udp头部有8个字节,数据部分从第9个字节开始udp[8:])
udp[8:2]==14:05 //过滤以udp[8:2]==1405,且只支持2个字节连续,三个以上须使用冒号:分隔表示十六进制。 (相当于 udp[8]==14 and udp[9]==05,1405是0x1405)
2)TCP3次握手
第一次握手数据包
客户端发送一个TCP,标志位为SYN,序列号为0, 代表客户端请求建立连接。
第二次握手的数据包
服务器发回确认包, 标志位为 SYN,ACK. 将确认序号(Acknowledgement Number)设置为客户的初始化序列号(ISN:第一次的seq序列号)加1以,即0+1=1
第三次握手的数据包
客户端再次发送确认包(ACK) SYN标志位为0,ACK标志位为1.并且把服务器发来ACK的序号字段+1,放在确定字段中发送给对方.并且在数据段放写ISN的+1,之后就建立了连接,开始通信.
随后丰富。