本文简单介绍一下如何对openstack neutron网络做troubleshooting
1. 如何查看网络设备
1 | # 可以查看网卡设备,以及网卡类型(openvswitch/tap/tun/veth) |
2. 如何监听ovs上patch类型接口的数据包
在linux下tap和veth设备都是正常的linux网络设备,可以使用ip/tcpdump来查看和监控状态。但是在ovs下,对于patch类型的接口,像patch-tun,只能对ovs是可见的,我们就不能够使用tcpdump -i patch-tun
命令,会报错patch-tun设备不存在。
那么对于patch-tun这种patch类型的ovs接口,如何进行数据追踪呢?步骤如下。
- 创建一个
dummpy
类型的端口snooper01
2ip link add name snooper0 type dummy
ip link set dev snooper0 up - 将该端口绑定到
br-int
网桥,因为patch-tun
位于该网桥1
ovs-vsctl add-port br-int snooper0
- 创建端口流量镜像来绑定snooper0和patch-tun
1
2
3
4
5#将进出patch-tun的流量全部镜像到snooper0网卡
ovs-vsctl -- set Bridge br-int mirrors=@m -- --id=@snooper0 \
get Port snooper0 -- --id=@patch-tun get Port patch-tun \
-- --id=@m create Mirror name=mymirror select-dst-port=@patch-tun \
select-src-port=@patch-tun output-port=@snooper0 select_all=1 - 现在就可以通过监控snooper0网卡来获取patch-tun的流量
1
tcpdump -i snooper0
- 清除配置信息
1
2
3ovs-vsctl clear Bridge br-int mirrors
ovs-vsctl del-port br-int snooper0
ip link delete dev snooper0
3. 数据包传输问题定位
我们可以使用ping
命令来快速定位问题
- 从虚拟机ping外部主机,看是否能ping通,如果能,就没有什么问题
- 如果不能ping通外部主机,从虚拟机ping虚拟机所在的主机,如果可以ping通,说明是计算节点和计算节点的gateway之间有什么问题
- 如果不能ping通虚拟机所在的主机,那问题就出现在虚拟机和计算主机之间。This includes the bridge connecting the compute node’s main NIC with the vnet NIC of the instance.
- 最后,在该计算几点再创建一台虚拟机,两台虚拟机相互ping,如果可以ping通,那基本定位为是主机防火墙的问题。
4. tcpdump
另外一个强大的工具是tcpdump
。我们可以使用下面的命令来监控ICMP
数据包
1 | tcpdump -i any -n -v 'icmp[icmptype] = icmp-echoreply or icmp[icmptype] = icmp-echo' |
然后在虚拟机、计算节点主机、外部主机分别运行该命令。然后利用ping来检查哪条链路出现了问题
5. iptables
在OpenStack中,我们的安全组是通过iptables来实现的。我们可以使用下面的命令来获取当前主机的iptables配置
1 | iptables-save |
6. 如何手动解绑定浮动IP
如果在执行解绑定浮动IP的时候,失败了,数据库无法释放该浮动ip,那么可以通过下面的命令,修改数据库来释放浮动IP
1 | mysql> select uuid from instances where hostname = 'hostname'; |
7. DHCP troubleshooting
当我们在openstack中创建网络并开启dhcp功能的时候,neutron会在网络节点创建一个名字为qdhcp-<network-id>
的linux网络命名空间。在该网络明明空间配置一个和subnet同网段的ip,此ip来提供dhcp和dns功能。我们会在该命名空间下启动一个dnsmasq进程,该进程用来提供dhcp和dns服务。
所以在dhcp出现问题的时候,使用如下步骤进行debug
- 查看dhcp的请求是否到达了
qdhcp-<network-id>
命名空间的tapXXXXX
网卡,如果没有到达,网络有问题。可以使用tcpdump来进行数据包的追踪。对于dhcp请求,使用udp协议,client端使用68端口,server端使用67端口1
2
3
4
5
6tcpdump -i br100 -n port 67 or port 68
以下是在openstack网络节点qdhcp-768a8089-ac83-4961-8c08-dc14eaf5f78a网络命名空间的执行结果,可以查看到相应的服务
[root@tstack-con01 log]# ip netns exec qdhcp-768a8089-ac83-4961-8c08-dc14eaf5f78a lsof -i:67
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
dnsmasq 1592657 nobody 4u IPv4 27757858 0t0 UDP *:bootps - 如果请求可以正常到达该命名空间,那查看dnsmasq服务时候正常运行。如果没有运行,重启neutron-dhcp-agent
- 如果dnsmasq正常运行,查看dnsmasq的log,看是否ip已经被分配完了,或者什么其他错误。可以通过
/var/log/syslog
或者/varlog/messages
来查看dnsmasq的日志
8. DNS troubleshooting
对于dns服务,openstack也是利用dnsmasq
来实现。可以使用下面的tcpdump命令来进行数据包的追踪
1 | tcpdump -i br100 -n -v udp port 53 |
以下是在openstack网络节点qdhcp-768a8089-ac83-4961-8c08-dc14eaf5f78a网络命名空间的执行结果,可以查看到相应的dnsmasq服务运行在53端口上
1 | [root@tstack-con01 log]# ip netns exec qdhcp-768a8089-ac83-4961-8c08-dc14eaf5f78a lsof -i:53 |
9. 参考工具
easyOVS 是一个在openstack平台操控linux bridge, ovs,iptables的工具。他可以自动关联虚拟端口、vm的IP/MAC、VLAN tag、网络命名空间以及vm的iptables规则。用起来非常方便。
参考文档