Linux中的网络管理命令(上)
网络连接
主要涉及到对网络连接状态的统计,比如连接打开了哪些端口、TCP/UDP、socket 的状态是什么等等。常用的工具有 netstat、 ss、lsof、 netcat等。
netstat ★★★
netstat 用于查看当前网络的连接情况,能够查看所有的网络连接,包括 unix socket 等,也是集多种工具于一身的组合工具。最常用的就是用来查看本地端口占用情况。
语法
netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>][--ip]
参数
- -a或--all 显示所有连线中的Socket。
- -A<网络类型>或--<网络类型> 列出该网络类型连线中的相关地址。
- -c或--continuous 持续列出网络状态。
- -C或--cache 显示路由器配置的快取信息。
- -e或--extend 显示网络其他相关信息。
- -F或--fib 显示FIB。
- -g或--groups 显示多重广播功能群组组员名单。
- -h或--help 在线帮助。
- -i或--interfaces 显示网络接口信息
- -l或--listening 列出监听中的服务器的Socket。
- -M或--masquerade 显示伪装的网络连线。
- -n或--numeric 直接使用IP地址,而不通过域名服务器。
- -N或--netlink或--symbolic 显示网络硬件外围设备的符号连接名称。
- -o或--timers 显示计时器。
- -p或--programs 显示正在使用Socket的程序识别码和程序名称。
- -r或--route 显示路由表信息
- -s或--statistics 显示所有网络协议栈信息
- -t或--tcp 列出监听 TCP 端口的 socket
- -u或--udp 列出监听 UDP 端口的 socket
- -v或--verbose 显示指令执行过程。
- -V或--version 显示版本信息。
- -w或--raw 显示RAW传输协议的连线状况。
- -x或--unix 列出监听 UNIX 端口的 socket
- --ip或--inet 此参数的效果和指定"-A inet"参数相同。
实际使用时往往多参数配合使用,比如:
netstat -ap | grep ssh 找出程序运行的端口
netstat -an | grep ':80' 找出运行在指定端口的进程
实例
# 显示UDP端口号的使用情况
$ netstat -apu
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
udp 0 0 tttti.testt.com:ntp *:* -
udp 0 0 localhost:ntp *:* -
udp 0 0 *:ntp *:* -
udp 0 0 tttti.testt.com:33020 192.168.0.2:domain ESTABLISHED 9325/nginx
udp 0 0 tttti.testt.com:48541 192.168.0.2:domain ESTABLISHED 9323/nginx
udp 0 0 tttti.testt.com:57262 192.168.0.2:domain ESTABLISHED 9326/nginx
udp 0 0 *:bootpc *:* -
udp 0 0 *:59096 *:* -
udp 0 0 tttti.testt.com:41434 192.168.0.2:domain ESTABLISHED 9324/nginx
udp 0 0 fe80::f816:3eff:fe5b:9a1:ntp *:* -
udp 0 0 localhost:ntp *:* -
udp 0 0 *:ntp *:* -
udp 0 0 *:36861 *:* -
ss ★★
ss 是 Socket Statistics 的缩写。ss 和 netstat 类似,可以用来获取 socket 统计信息,甚至显示更多连接状态信息。
ss 最大的优势在于比 netstat 更快。当服务器的 socket 连接数量变得非常大时,无论是使用 netstat 命令还是直接 cat /proc/net/tcp,执行速度都会很慢。ss 命令利用到了 TCP 协议栈中的一个用于分析统计的模块——tcp_diag,使其可以获得 Linux 内核中第一手的信息,因此 ss 命令的性能会好很多。
语法
ss [参数] [过滤]
常用参数:
- -t, --tcp 显示 TCP 协议的 sockets
- -u, --udp 显示 UDP 协议的 sockets
- -x, --unix 显示 unix domain sockets,与 -f 选项相同
- -n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"
- -l, --listening 查看处于LISTEN状态的连接端口
- -p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
- -a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
- -r, --resolve 把 IP 解释为域名,把端口号解释为协议名称
实例
$ ss -ntlp|grep php
State Recv-Q Send-Q Local Address:Port Peer Address:Port
LISTEN 0 128 127.0.0.1:9000 *:* users:(("php-fpm",2487,7),("php-fpm",13519,0),("php-fpm",27405,0))
LISTEN 0 128 127.0.0.1:9007 *:* users:(("php-fpm",28800,0),("php-fpm",28801,0),("php-fpm",28802,0),("php-fpm",28803,0))
LISTEN 0 128 127.0.0.1:9009 *:* users:(("php-fpm",568,7),("php-fpm",6849,0),("php-fpm",9821,0),("php-fpm",16103,0))
lsof ★★
lsof 可以列出当前系统打开文件、打开文件的进程、进程打开的端口。由于在 Linux 中一切皆文件,所以, lsof 也常用来统计网络相关的文件信息(使用 -i 选项),如 TCP/UDP/Unix socket 的统计信息。
语法
lsof [参数] [文件]
常用参数:
- -a 列出打开文件存在的进程
- -c <进程名> 列出指定进程所打开的文件
- -g 列出GID号进程详情
- -d <文件号> 列出占用该文件号的进程
- +d <目录> 列出目录下被打开的文件
- +D <目录> 递归列出目录下被打开的文件
- -n <目录> 列出使用NFS的文件
- -i <条件> 列出符合条件的进程
- -p <进程号> 列出指定进程号所打开的文件
- -u 列出UID号进程详情
- -h 显示帮助信息
- -v 显示版本信息
实例
使用 lsof
来查看当前系统中 80 端口是否被占用
sudo lsof -i tcp:80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 14863 root 4u IPv6 38693061 0t0 TCP *:http (LISTEN)
然后获取到 PID 之后可以用 lsof 来查看进程
sudo lsof -p 14863
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
docker-pr 14863 root cwd DIR 8,0 4096 2 /
docker-pr 14863 root rtd DIR 8,0 4096 2 /
docker-pr 14863 root txt REG 8,0 3329080 17531 /usr/bin/docker-proxy
docker-pr 14863 root mem REG 8,0 1868984 20743 /lib/x86_64-linux-gnu/libc-2.23.so
docker-pr 14863 root mem REG 8,0 138696 11625 /lib/x86_64-linux-gnu/libpthread-2.23.so
docker-pr 14863 root mem REG 8,0 162632 10738 /lib/x86_64-linux-gnu/ld-2.23.so
docker-pr 14863 root 0r CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 1w CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 2w CHR 1,3 0t0 8085 /dev/null
docker-pr 14863 root 4u IPv6 38693061 0t0 TCP *:http (LISTEN)
docker-pr 14863 root 5u a_inode 0,12 0 8082 [eventpoll]
docker-pr 14863 root 12r REG 0,3 0 4026531993 net
由以上的信息就能看出来我的机器中的 80 端口是 docker 占用的,docker 的位置在系统中的 /usr/bin/docker-proxy
lsof 输出各列信息的意义如下:
- COMMAND:进程的名称
- PID:进程标识符
- PPID:父进程标识符(需要指定 -R 参数)
- USER:进程所有者
- PGID:进程所属组
- FD:文件描述符,应用程序通过文件描述符识别该文件。如 cwd、txt 等
FD 的取值
- cwd:表示 current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
- txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
- lnn:library references (AIX);
- er:FD information error (see NAME column);
- jld:jail directory (FreeBSD);
- ltx:shared library text (code and data);
- mxx :hex memory-mapped type number xx.
- m86:DOS Merge mapped file;
- mem:memory-mapped file;
- mmap:memory-mapped device;
- pd:parent directory;
- rtd:root directory;
- tr:kernel trace file (OpenBSD);
- v86 VP/ix mapped file;
- 0:表示标准输出
- 1:表示标准输入
- 2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u 等
- u:表示该文件被打开并处于读取 / 写入模式
- r:表示该文件被打开并处于只读模式
- w:表示该文件被打开并处于
- 空格:表示该文件的状态模式为 unknow,且没有锁定
- -:表示该文件的状态模式为 unknow,且被锁定
netcat(nc) ★★★
nc 被称为瑞士军刀,非常轻巧但功能强大,能够创建各种不同类型的网络连接、能够实现简单的聊天工具、远程传输文件、debug 分析、扫描端口等。
语法
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
参数说明:
- -g<网关> 设置路由器跃程通信网关,最多可设置8个。
- -G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
- -h 在线帮助。
- -i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
- -l 使用监听模式,管控传入的资料。
- -n 直接使用IP地址,而不通过域名服务器。
- -o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
- -p<通信端口> 设置本地主机使用的通信端口。
- -r 乱数指定本地与远端主机的通信端口。
- -s<来源位址> 设置本地主机送出数据包的IP地址。
- -u 使用UDP传输协议。
- -v 显示指令执行过程。
- -w<超时秒数> 设置等待连线的时间。
- -z 使用0输入/输出模式,只在扫描通信端口时使用。
实例
# TCP端口扫描
# nc -v -z -w2 192.168.0.3 1-100
192.168.0.3: inverse host lookup failed: Unknown host
(UNKNOWN) [192.168.0.3] 80 (http) open
(UNKNOWN) [192.168.0.3] 23 (telnet) open
(UNKNOWN) [192.168.0.3] 22 (ssh) open
# 扫描UDP端口
# nc -u -z -w2 192.168.0.1 1-1000 //扫描192.168.0.3 的端口 范围是 1-1000
# 扫描80端口
# nc -nvv 192.168.3.1 80
流量统计
ifstat ★★★
ifstat 主要用来监测主机网口的网络流量,常用的选项包括:
- -a:监测主机所有网口
- -i:指定要监测的网口
- -t:在每行输出信息前加上时间戳
- -b:以 Kbit/s 显示流量数据,而不是默认的 KB/s
- delay:采样间隔(单位是 s),即每隔 delay 的时间输出一次统计信息
- count:采样次数,即共输出 count 次统计信息
- -p:优化打印
- -e:显示错误信息
- -r:重置历史记录
sar ★★
sar是System Activity Reporter(系统活动情况报告)的缩写。sar工具将对系统当前的状态进行取样,然后通过计算数据和比例来表达系统的当前运行状态。它的特点是可以连续对系统取样,获得大量的取样数据;取样数据和分析的结果都可以存入文件,所需的负载很小。
sar是目前Linux上最为全面的系统性能分析工具之一,可以从14个大方面对系统的活动进行报告,包括 CPU、内存、磁盘 I/O、网络、进程、系统调用等等信息。
常用参数:
- -R 显示内存状态
- -b 显示I/O速率
- -B 显示换页状态
- -d 显示每个块设备的状态
- -i 状态信息刷新的间隔时间
- -u 显示CPU利用率
网络信息通常使用 -n参数来统计,常用几个选项如下:
- -n DEV:网络接口统计信息。
- -n EDEV:网络接口错误。
- -n IP:IP 数据报统计信息。
- -n EIP:IP 错误统计信息。
- -n TCP:TCP 统计信息。
- -n ETCP:TCP 错误统计信息。
- -n SOCK:套接字使用。
iftop ★★★
iftop是一款实时流量监控工具,监控TCP/IP连接等,缺点就是无报表功能。必须以root身份才能运行。
参数
- -i 指定要监控的网卡
- -n 直接显示IP, 不进行DNS反解析
实例
# 默认监控第一块网卡的流量:
[root@linuxcool ~]# iftop
# 监控eth1网卡的流量:
[root@linuxcool ~]# iftop eth1
# 直接显示IP, 不进行DNS反解析:
[root@linuxcool ~]# iftop -n
交换与路由
arp ★★
用来管理主机的 ARP 缓存,增删查改等。
常见用法:
- arp:显示 ARP 缓存所有记录
- arp -i :显示指定接口的 ARP 缓存记录
- arp -d :删除指定主机的 ARP 缓存记录
- arp -s <硬件地址>:添加 ARP 缓存静态项
arping ★★
查看本 LAN 内 IP 对应的主机 MAC 地址,以及 MAC 的占用问题。
arping命令作用是使用arp数据包,通过ping命令检查来测试网络。arping命令能够测试一个ip地址是否是在网络上已经被使用,并能够获取更多设备信息。功能类似于ping。
由于arping命令基于ARP广播机制,所以arping命令只能测试同一网段或子网的网络主机的连通性,ping命令则是基于ICMP协议,是可以路由的,所以使用ping命令可以测试任意网段的主机网络连通性。
vconfig ★★
vconfig命令是 vlan 的配置命令。
比如给某个接口增加两个 vlan :
vconfig add eth0 100
vconfig add eth0 200
删除 vlan :
vconfig rem eth0.100
vconfig rem eth0.200
route ★★
route 用来查看和修改路由表,同样工具还有 netstat-r 和 ip route。
- route-n 查看路由表
- route add/del 增加/删除路由表
比如添加一条默认路由:
route add default gw 192.168.1.1 dev eth0
防火墙
iptables ★★★
iptables 是强大的包过滤工具。 iptables 通过一系列规则来过滤、处理数据包,能够实现防火墙、NAT等功能。
ipatbles 命令仅仅是用户空间的linux内核防火墙管理工具,真正的功能实现是由linux内核模块实现的。在配置服务器策略前必须加载相应的内核模块。
ipatbles命令仅支持ipv4,如果使用的IP协议是ipv6则需要使用专门的管理工具ip6tables。
参数
- -t<表> 指定要操纵的表
- -A 向规则链中追加条目
- -D 从规则链中删除条目
- -I 向规则链中插入条目
- -R 替换规则链中的相应条目
- -L 显示规则链中的已有条目
- -F 清除规则链中的现有条目。不改变规则链的默认目标策略
- -Z 清空规则链中的数据包计数器和字节计数器
- -N 创建新的用户自定义规则链
- -P 定义规则链中的默认目标(策略)
- -h 显示帮助信息
- -p<协议> 指定要匹配的数据包的协议类型
- -s<源地址> 指定要匹配的数据包的源IP地址
- -j<目标> 指定要跳转的目标
- -i<网络接口> 指定数据包进入本机的网络接口
- -o<网络接口> 指定数据包离开本机做使用的网络接口
- -c<包计数> 在执行插入、追加和替换操作时初始化包计数器和字节计数器
实例
# 显示内核当前的filter表
[root@linuxcool ~]# iptables -L
# 显示内核当前的nat表
[root@linuxcool ~]# iptables -L -t nat
# 禁止本机对192.168.20.20地址的访问
[root@linuxcool ~]# iptables -t filter -A OUTPUT -d 192.168.20.20 -j DROP
# 显示filter表的OUTPUT链
[root@linuxcool ~]# iptables -L OUTPUT -t filter
ipset
ipset 是一个辅助 iptables 的工具,通常用在限制多个 IP 的场景下,使用 ipset,可以将多个 IP 放入一个集合,然后 iptables 针对这个集合做限制,这样可以大大提高效率。 ipset除了可以集合 IP 外,还可以集合 网段、MAC、端口、网卡等。
常用操作比如:
创建一个 ipset:
ipset create blacklist hash:ip
- blackliset 是集合名称
- hash 是存储类型,还支持 bitmap、list 等
- ip 是存储类型,可以是 MAC、端口等
往集合中增加项:
ipset add blacklist 192.168.10.2
从集合中移除项:
ipset del blacklist 192.168.10.2
还可以指定超时时间限制:
ipset create blacklist hash:net timeout 60
域名相关
host
host 命令是域名分析查询工具,用来测试域名系统工作是否正常。
比如查看百度域名信息:
[root@by ~] host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 14.215.177.38
www.a.shifen.com has address 14.215.177.39
nslookup
nslookup 用于交互式域名解析,查看域名解析是否正常,在网络故障的时候用来诊断网络问题。
查看 google.com 的 DNS 地址:
# nslookup google.com
Server: 8.8.8.8
Address: 8.8.8.8#53
Name: google.com
Address: 172.217.160.110
查看使用的 DNS 服务器地址:
[root@by ~]# nslookup
> server
Default server: 8.8.8.8
Address: 8.8.8.8#53
Default server: 8.8.4.4
Address: 8.8.4.4#53
dig
dig命令的全称是“domain information groper”,它是一个用来灵活查询DNS的工具,它会打印出DNS域名服务器的回应,dig命令主要用来从DNS域名服务器查询主机地址信息。
dig命令与nslookup命令功能基本相同,但是dig命令灵活性好、易用、输出清晰。
参数:
- @ 指定进行域名解析的域名服务器
- -b 使用指定的本机ip地址向域名服务器发送域名查询请求
- -f 指定dig以批处理的方式运行,指定的文件中保存着需要批处理查询的DNS任务信息
- -p 指定域名服务器所使用端口号
- -t 指定要查询的DNS数据类型(默认为A)
- -x 执行逆向域名查询
- -4 使用ipv4(默认)
- -6 使用ipv6
- -h 显示命令帮助信息
实例
# 查询对应域名的ip
[root@linuxcool ~]# dig www.linuxcool.com
# 对目标ip进行反向解析查询
[root@linuxcool ~]# dig -x 166.111.4.100
# 查询目标域名的MX记录
[root@linuxcool ~]# dig -t MX chinacion.cn
whois
whois 用于查看域名所有者的信息,比如注册邮箱、手机号码、域名服务商等。
Domain Name: chinacion.cn
ROID: 20160314s10001s82632400-cn
Domain Status: clientTransferProhibited
Registrant: 张三
Registrant Contact Email: zhangsan@qq.com
Sponsoring Registrar: 北京新网数码信息技术有限公司
Name Server: f1g1ns1.dnspod.net
Name Server: f1g1ns2.dnspod.net
Registration Time: 2016-03-14 10:32:39
Expiration Time: 2021-03-14 10:32:39
DNSSEC: unsigned
比如,chinacion.cn 这个域名是张三2016年在新网注册的,注册邮箱是 zhangsan@qq.com。