由于采用UDP传输协议,不能如TCP在确保连接建立的情况下就能保障数据的传输,因此对从服务器A到B的数据传输过程进行逐段排查。
###使用netstat检查程序端口
$ sudo netstat -aunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 0.0.0.0:68 0.0.0.0:* 712/dhclient
udp 0 0 0.0.0.0:57461 0.0.0.0:* 712/dhclient
netstat 能够查看本机的所有网络端口连接情况,使用-p
选项能够将端口与进程pid关联起来。 其他一些有用的选项包括:
- -n 不对端口号进行解析,例如80被解析为http,443被解析为https
- -a 查看所有端口,否则只显示已连接的端口,例如处于listen状态的端口就不显示了。
- -t 查看TCP协议的端口。
- -u 查看UDP协议的端口。
- -p 查看端口对应的进程信息。
因此在当前问题中,使用netstat -aunp
命令来查看所有打开的UDP端口,并检查是否有我们所期望的进程打开了UDP端口。注意,由于UDP socket可以使用sendto来指定发送的目的地址,因此在netstat中不一定能否看到UDP连接的远端地址及端口。
###使用nc检查网络间的联通性
有关 netcat 命令的使用说明请参见:Linux Netcat 命令——网络工具中的瑞士军刀
在此例中主要使用-l
及-u
选项来启动UDP服务端及客户端来确认跨网的UDP通信是否正常。
在服务端运行:
$ nc -ul 60032
在客户端运行:
$ nc -nu 220.181.57.217 60032
再在两端输入字符,看是否能够发送至对端判断是否跨网段UDP通信正常。
###使用tcpdump查看端口数据包接收情况
在排除了程序端口异常及数据跨网段发送异常之后,尝试在服务端的接收端口上抓包,看是否接收到指定IP及端口发送的数据包。
使用命令:
$ tcpdump -nn -v -i eno33554984 'udp port [serverport] and src port [srcport] and src host [src ip address]'
抓取到特定客户程序发送的数据包,还可以使用-w
选项将抓取到得数据包存储在文件中,转存后使用wireshark等工具进行分析。
###总结
此次传输问题的排查过程算是一个小白的Linux网络工具的学习过程,记录下来以备后续回顾。很可惜的是,在第三步排查过程中,依然可以使用tcpdump抓取到相应的数据包,证明服务端的程序端口收到了(当前服务器使用iptables进行包过滤的概率较小)特定客户端发送的数据。未能呈现相应数据很大概率可能是其他配置问题。有待进一步排查。