网络故障定位如同医生看病,不像某些“神药“那样包治百病,而是需要“望闻问切”,然后才能对症下药。目前最常见的网络问题包括DNS域名解析异常、地址ping不通、网络丢包等,下面介绍如果出现了网络问题,该如何排查故障和指导用户提供必要信息。
排查网络问题,第一步就是确认用户网络访问的基本信息,包括当前使用的网络类型、电信运营商、源IP地址、需要访问的目的域名、IP地址和端口,具体方法如下:
1)网络类型:询问客户,使用的是宽带还是手机4G;
2)电信运营商、用户源IP地址:可以询问客户,也可以请用户百度搜索ip,查询到当前的运营商和ip信息
3)确认需要访问的是哪个域名或者ip,比如eco.taobao.com或者59.82.122.172。对于涉及到特殊的tcp、udp端口,也需要一并确认下,不过这个应该是应用服务提供者更清楚,必要时刻需要及时联系他们一并排查。
当用户出现故障时,他们一般不会去定位具体是什么问题,而是直接报障,那么如何指导用户排查问题,可以参考以下步骤:
ping以及curl域名,然后提供给TOP这边:
ping示例:
如果是Linux,可执行以下命令看是否正常:
1)查看多少成功数,结果应该 seq的执行次数;
for i in $(seq 200); do
curl -I -sS \
--connect-timeout 3 \
--max-time 10 \
-o /dev/null \
-w '%{http_code} %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}\n' \
'http://gw.api.taobao.com/router/rest'
done | awk '{print; fflush(); if ($1 == 200) c++} END {print "200_count=" c+0}'
2)绑定host再测试,排除域名解析问题;
for i in $(seq 800); do
curl -I -sS \
--connect-timeout 3 \
--max-time 10 \
-H 'Host: gw.api.taobao.com' \
-o /dev/null \
-w '%{http_code} %{time_namelookup}::%{time_connect}::%{time_starttransfer}::%{time_total}\n' \
'http://59.82.23.188/router/rest'
由于目前用户使用的DNS大部分是电信运营商下发或者无线路由器提供的,那经常出现的问题就是域名解析错误。windows客户使用cmd命令提示符(点击开始 -> 运行 -> 输入 cmd 回车)、苹果mac用户使用“终端”,分别输入nslookup。 www.taobao.com和nslookup www.taobao.com 223.5.5.5,查看两者解析出来的IP地址是否一致。用户需要提供的示例如下:
如果不一致,先请用户将dns设置为阿里DNS 223.5.5.5或者223.6.6.6,具体设置方法请见:阿里DNS设置说明。
此时需要测试网络连通性是否正常,最常用的就是mtr工具,可以很快速地定位网络故障,然后请用户把mtr记录截图下来,给网络同学定位哪里存在问题,使用方法和用户需要提供的示例如下:mtr网络链路路由测试工具使用方法及数值结果说明。
有些用户可能不愿意下载软件MTR,或者无法使用,那替代方法是请用户使用命令提示符(windows)或者“终端”(苹果mac),traceroute eco.taobao.com,显示结果后对沿途的每一跳ip地址做ping测试,并将结果截图到word文档中,发给故障排障人员定位问题。用户需要提供的示例如下:
Trace记录
Trace中每一跳IP节点的ping记录。
以此类推。
阿里云网络运维检测工具,通过部署在全国的靶机,测试某个域名或者IP是否存在异常,便于运维人员判断是大网问题,还是个别用户的问题。
其他检测工具
1)https://www.boce.com/hijack/gw.api.taobao.com
2)http://www.ce8.com/ping/http://gw.api.taobao.com?isp=unicom
如果用户是服务商,可以把以下脚本提供给用户,可以让用户在问题服务器上执行以下脚本后把结果发给我们做分析判断 。
#!/bin/bash
function curlAndGetHttpCodeReport(){
declare -A httpCodeMap
for i in `seq 200`;
do
httpCode=$(curl -o /dev/null -s --connect-timeout 5 -w '%{http_code}' $1)
counter=${httpCodeMap[$httpCode]}
if [ ! $counter ]; then
httpCodeMap[$httpCode]="1"
else
let counter=counter+1
httpCodeMap[$httpCode]=$counter
fi
done
for key in ${!httpCodeMap[@]};do
echo "curl report done , http_code : $key , counter: ${httpCodeMap[$key]}, host: $1"
done
}
function mtrHttpReport(){
echo "mtr report for $1"
mtr -c 20 -r $1
}
echo "==== start detect top url ===="
curlAndGetHttpCodeReport "gw.api.taobao.com/router/rest"
curlAndGetHttpCodeReport "qimen.api.taobao.com/router/rest"
curlAndGetHttpCodeReport "https://eco.taobao.com/router/rest"
echo "==== detect top url done ===="
sleep 1
echo "==== start detect network ===="
mtrHttpReport gw.api.taobao.com
mtrHttpReport qimen.api.taobao.com
mtrHttpReport eco.taobao.com
echo "==== detect network done ===="