前言:Linux命令浩如烟海、多如牛毛,但是针对服务器编程,必学的四大网络分析工具:ping、tcpdump、netstat和lsof,为后面编程、调试、分析、运维打下基础。其中ping和netstat是linux、Unix、windows系统所共有的,可以我之前的一篇文章:Windows奇技淫巧之网络命令行
目录
1、ping
命令格式
应用举例:六步法检查网络连通性
2、tcpdump
命令格式
参数详解
表达式中重要关键字
应用举例1:截取指定主机所有数据包
应用举例2:截取某端口上的包
应用举例3:截取指定网卡上的包
3、netstat
命令格式
常用参数
显示解析
应用举例1:列出所有监听端口和未监听端口
应用举例2:列出所有TCP端口
应用举例3:列出所有UDP端口
应用举例4:只显示监听端口
应用举例5:输出中显示PID和进程名称
应用举例6: 显示所有端口的统计信息
应用举例7:列出所有监听的TCP/UDP/UNIX端口
应用举例8:持续输出 netstat 信息
应用举例9:显示核心路由信息
4、lsof
命令格式
常用参数
应用举例1:默认情况显示所有进程打开的所有文件
应用举例2:查看某端口现在的运行情况
应用举例3:查看指定用户进程所打开指定类型的文件
应用举例4:查看指定设备被进程占用的情况
应用举例5:查看指定程序打开的文件
应用举例6:查看指定用户打开的文件
参考:
ping全称Packet Internet Groper,因特网探索包,发送一个ICMP,请求消息给目的地并报告是否收到所希望的ICMP echo,用来检查网络是否畅通和网络连接的速度。
注意:ping是一个端到端连接,通常用来进行网路可用性检查,但是大量的ping会占用大量的网络资源和系统资源,因此是黑客入侵防火墙的基本手段之一。
Linux下ping的语法和windows差不多,但是Linux的ping数据包时64Bytes,windows的是32Bytes,windows下默认发送4次数据包后结束,Linux下ping程序默认不停发送数据包,用Ctrl+c停止运行。
ping [-aAbBdDfhLnOqrRUvV64] [-c count] [-i interval] [-I interface]
[-m mark] [-M pmtudisc_option] [-l preload] [-p pattern] [-Q tos]
[-s packetsize] [-S sndbuf] [-t ttl] [-T timestamp_option]
[-w deadline] [-W timeout] [hop1 ...] destination
ping -6 [-aAbBdDfhLnOqrRUvV] [-c count] [-i interval] [-I interface]
[-l preload] [-m mark] [-M pmtudisc_option]
[-N nodeinfo_option] [-p pattern] [-Q tclass] [-s packetsize]
[-S sndbuf] [-t ttl] [-T timestamp_option] [-w deadline]
[-W timeout] destination
(1)ifconfig检查本地网络设置是否正确,查看本机IP
(2)ping localhost(ping 127.0.0.1)检查本地TCP/IP协议是否设置正确
(3)ping本机IP地址,检查本机IP地址是否设置正确
(4)ping局域网下其他地址,检查局域网是否有问题
(5)ping本地DNS地址,检查本地DNS服务是否正常工作
先查看本机DNS地址:
cat /etc/resolv.conf
会显示主DNS和备用DNS,直接ping即可。通过ping本地DNS地址,可以检查本地DNS服务器是否正常。
(6)ping远程地址
用来检查本机与外部连接是否正常,同时也可以测试网络延时。
ping www.baidu.com
tcpdump是一款经典开源的网络抓包工具,对标wireshark,支持对主机、协议、网络、端口的过滤,并提供and、or、not等语句过滤。但是ubuntu默认没有安装tcpdump软件,通过apt-get install tcpdump安装即可。
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
其中表达式支持正则表达式,强大的正则帮助我们过滤出我需要的需要的数据包。在表达式中有几类关键字,后面详细介绍。
tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
tcpdump host 10.38.31.230
tcpdump port 6666
tcpdump -i eth1
配合其他关键字可以轻松实现指定两个主机之间通信的数据包、指定tcp/ip之间的数据包等等,就不一一举例了。
用于显示IP、TCP、UDP和ICMP相关协议的统计数据,一般用于检测本机各端口的网络连接情况。
netstat [-vWeenNcCF] [] -r netstat {-V|--version|-h|--help}
netstat [-vWnNcaeol] [ ...]
netstat { [-vWeenNac] -i | [-cnNe] -M | -s [-6tuw] }
-a | (all)显示所有选项,默认不显示LISTEN相关 |
-t | (tcp)仅显示tcp相关选项 |
-u | (udp)仅显示udp相关选项 |
-n | 拒绝显示别名,能显示数字的全部转化成数字。 |
-l | 仅列出有在 Listen (监听) 的服務状态 |
-p | 显示建立相关链接的程序名 |
-r | 显示路由信息,路由表 |
-e | 显示扩展信息,例如uid等 |
-s | 按各个协议进行统计 |
-c | 每隔一个固定时间,执行该netstat命令。 |
完整参数:
-r, --route display routing table
-i, --interfaces display interface table
-g, --groups display multicast group memberships
-s, --statistics display networking statistics (like SNMP)
-M, --masquerade display masqueraded connections
-v, --verbose be verbose
-W, --wide don't truncate IP addresses
-n, --numeric don't resolve names
--numeric-hosts don't resolve host names
--numeric-ports don't resolve port names
--numeric-users don't resolve user names
-N, --symbolic resolve hardware names
-e, --extend display other/more information
-p, --programs display PID/Program name for sockets
-o, --timers display timers
-c, --continuous continuous listing
-l, --listening display listening server sockets
-a, --all display all sockets (default: connected)
-F, --fib display Forwarding Information Base (default)
-C, --cache display routing cache instead of FIB
-Z, --context display SELinux security context for sockets
执行默认netstat命令后,会显示:
netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 200 c3c21a5a34d1:ssh 10.38.31.230:59876 ESTABLISHED
tcp 0 0 c3c21a5a34d1:ssh 10.38.31.230:59627 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
可以看出,输出结果分成两部分:
proto | 连接所使用的协议 |
RefCnt | 连接到本套接口上的进程号 |
Types | 套接口类型 |
State | 套接口当前状态 |
Path | 连接到套接口的其他进程所使用的路径名 |
netstat -a
netstat -at
netstat -au
netstat -l
netstat -p
netstat -s
netstat -lt
netstat -lu
netstat -lx
netstat 将每隔一秒输出网络信息。
netstat -c
netstat -r
list of file,列出当前系统打开文件的工具。在Linux当中,万物皆文件!任何事物都是以文件形式存在的。
[-?abhKlnNoOPRtUvVX] [+|-c c] [+|-d s] [+D D] [+|-E] [+|-e s] [+|-f[gG]]
[-F [f]] [-g [s]] [-i [i]] [+|-L [l]] [+m [m]] [+|-M] [-o [o]] [-p s]
[+|-r [t]] [-s [p:s]] [-S [t]] [-T [t]] [-u s] [+|-w] [-x [fl]] [--] [names]
-a | 表示两个参数都满足时候才能显示结果 |
-c<进程名> | 表示COMMON列中必须包含指定字符的进程所有打开的文件 |
-u username | 显示所属username打开的文件 |
-g gid | 显示归属gid进程的情况 |
-d | 显示指定文件描述符的进程 |
-i | 显示符合条件的进程的情况 |
+d<目录> | 显示目录下被进程打开的文件 |
-v | 显示版本信息 |
-p<进程号> | 列出指定进程号所打开的文件 |
-h | 显示帮助信息 |
lsof
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1 root cwd DIR 0,301 4096 158630055 /
bash 1 root rtd DIR 0,301 4096 158630055 /
bash 1 root txt REG 0,301 1113504 151191557 /bin/bash
bash 1 root mem REG 253,0 151191557 /bin/bash (path dev=0,301)
bash 1 root mem REG 253,0 151191941 /lib/x86_64-linux-gnu/libnss_files-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191935 /lib/x86_64-linux-gnu/libnsl-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191945 /lib/x86_64-linux-gnu/libnss_nis-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191937 /lib/x86_64-linux-gnu/libnss_compat-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191899 /lib/x86_64-linux-gnu/libc-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191909 /lib/x86_64-linux-gnu/libdl-2.27.so (path dev=0,301)
bash 1 root mem REG 253,0 151191979 /lib/x86_64-linux-gnu/libtinfo.so.5.9 (path dev=0,301)
bash 1 root mem REG 253,0 151191881 /lib/x86_64-linux-gnu/ld-2.27.so (path dev=0,301)
依次解释各列的参数含义:
lsof -i :54758
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 22431 root 3u IPv4 687393234 0t0 TCP c3c21a5a34d1:ssh->10.38.31.230:54758 (ESTABLISHED)
比如查看查看root所打开txt文件:
lsof -a -u root -d txt
比如查看/dev/null 被那些进程占用:
lsof /dev/null
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
bash 1 root 0u CHR 1,3 0t0 6 /dev/null
sshd 16 root 0u CHR 1,3 0t0 6 /dev/null
sshd 16 root 1u CHR 1,3 0t0 6 /dev/null
sshd 16 root 2u CHR 1,3 0t0 6 /dev/null
screen 7666 root 0r CHR 1,3 0t0 6 /dev/null
screen 7666 root 1w CHR 1,3 0t0 6 /dev/null
screen 7666 root 2w CHR 1,3 0t0 6 /dev/null
sshd 22431 root 0u CHR 1,3 0t0 6 /dev/null
sshd 22431 root 1u CHR 1,3 0t0 6 /dev/null
sshd 22431 root 2u CHR 1,3 0t0 6 /dev/null
screen 22640 root 0r CHR 1,3 0t0 6 /dev/null
screen 22640 root 1w CHR 1,3 0t0 6 /dev/null
screen 22640 root 2w CHR 1,3 0t0 6 /dev/null
screen 23229 root 0r CHR 1,3 0t0 6 /dev/null
screen 23229 root 1w CHR 1,3 0t0 6 /dev/null
screen 23229 root 2w CHR 1,3 0t0 6 /dev/null
sshd 23352 root 0u CHR 1,3 0t0 6 /dev/null
sshd 23352 root 1u CHR 1,3 0t0 6 /dev/null
sshd 23352 root 2u CHR 1,3 0t0 6 /dev/null
sleep 23394 root 0u CHR 1,3 0t0 6 /dev/null
screen 27125 root 0r CHR 1,3 0t0 6 /dev/null
screen 27125 root 1w CHR 1,3 0t0 6 /dev/null
screen 27125 root 2w CHR 1,3 0t0 6 /dev/null
比如查看screen程序打开的文件:
lsof -c screen
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
screen 7666 root cwd DIR 0,247 4096 97591500 /root/Multi-view (10.106.128.106:/mnt/nfs/userdata/2/17020710009)
screen 7666 root rtd DIR 0,301 4096 158630055 /
screen 7666 root txt REG 0,301 465928 158663915 /usr/bin/screen
screen 7666 root mem REG 253,0 158663915 /usr/bin/screen (path dev=0,301)
比如查看root用户打开的文件:
lsof -u root
参考:
- 《Linux多线程服务端编程》
- 《Linux高性能服务器编程》
- 《后台开发核心技术与应用实践》
- https://blog.csdn.net/qq_27870421/article/details/92803453
- https://www.jianshu.com/p/a3aa6b01b2e1
- https://blog.csdn.net/lgh1117/article/details/80213397