本文将讲述网络相关命令,作者假定读者具备 TCP/IP 协议栈的基础知识。对于相关命令及其输出只介绍它的基本的使用方法和大概的描述,具体协议将不作详细解释。
如今网络无疑是很重要的,linux 系统中提供了丰富的网络测试与管理命令。我们来一起看看它们。
1、ping
发送 TCMP 回显请求报文,并等待返回 TCMP 回显应答。
|
|
这里的目标 destination
可以是目的 IP 地址或者 域名/主机名
选项 -c 指定发送请求报文的次数,当 ping 没有任何选项时,在 linux 中默认将一直发送请求报文直到手动终止。
|
|
首先,ping 程序会向域名服务器 (DNS) 发送请求,解析域名 www.baidu.com
的 IP 地址。DNS 返回域名的一个别名 www.a.shifen.com
以及对应的 IP 地址 61.135.169.121
。之后 ping 程序开始向这个地址发送请求报文,每 1s 发送一个,ping 收到 TCMP 回显应答并将结果显示在终端上,包括 ICMP 序列号 (icmp_seq),生存时间(ttl) 和数据包往返时间(time)。最后,给出汇总信息,包括报文总收发情况,总时间,往返时间最小值、平均值、最大值、平均偏差(越大说明网络越不稳定)。
|
|
当目的域名无法解析出 IP 地址时,会报未知主机的错
|
|
当目的 IP 地址没有路由时不会收到任何 ICMP 回显报文
|
|
当有目的 IP 的路由但无法达到时显示目标不可达错误 (Destination Host Unreachable)。ICMP
回显应答还包括超时 (request time out) 等其他类型。
2、hostname
显示或设置系统主机名
|
|
直接执行命令 hostname
时将显示主机名:
|
|
这个主机名是系统的 gethostname(2) 函数返回的。
可以通过执行命令 hostname NAME
来临时改变主机名:
|
|
这个临时修改实际上是修改了 linux kernel 中一个同为 hostname
的内核参数,它保存在 /proc/sys/kernel/hostname
中。如果需要永久修改则需要修改配置文件 /etc/sysconfig/network
,centos 7 中需要修改 /etc/hostname
。需要注意的是,如果配置文件中的主机名是 localhost
或 localhost.localdomain
时,系统会取得网络接口的 IP 地址,并用这个地址找出 /etc/hosts
文件中对应的主机名,然后将其设置成最终的 hostname
。
3、host
DNS 查询
|
|
host
命令通过配置文件 /etc/resolv.conf
中指定的 DNS 服务器查询 name
的 IP 地址:
|
|
4、dig
DNS 查询
dig
和 host
命令的语法一致,但提供了更详细的信息和更多的选项:
|
|
如只查询域名的 A 记录并以短格式显示:
|
|
或者:
|
|
还可以用 @server
的方式指定 DNS 服务器:
|
|
更多的命令及选项请自行 man
5、traceroute
或 tracepath
路由跟踪
|
|
这里只列出部分输出,表示跟踪到目的地址的路由,每一跳都返回。
6、ifconfig
配置网络接口
当命令没有任何参数时显示所有网络接口的信息:
|
|
本例中显示了两个网卡 ens32
和 ens33
以及环回口 lo 的信息,包括 mtu,ip 地址,掩码,mac 地址,传输和接收数据量等等。
选项 -s
显示精简的信息:
|
|
如给 ens33 增加一个新地址 10.0.1.4:
|
|
命令中 /24
表明接口地址的掩码,up
表示启用此接口。注意如果 ip 地址已经被使用,这里依然会被设置成功,但此地址被访问时,可能会有冲突。
停用某接口:
|
|
如果需要永久增加或修改当前接口的地址,最好直接编辑网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33
(其他系统换成相应文件) 中 IPADDR
字段,然后重启网络 systemctl restart network
或 service network restart
生效。
7、arp
和 arping
命令 arp
显示系统的 arp 缓存,命令 arping
给邻居主机发送 ARP 请求。
|
|
? 表示未知域名,最后的网卡名表示 arp 表项对应的网络接口
如发现某地址不稳定,可以使用 arping 测试该地址是否为 MAC 地址冲突:
|
|
这里两条返回信息中的 MAC 地址不同,说明有两块网卡配置了相同的 IP 地址。选项 -I
指定发送 arp 请求的网络接口。
如果刚刚更改了网卡的 IP 地址,但上游设备 (如交换机) 的 arp 表项还是老的,可以使用 arping
来强制刷新:
|
|
-c 指定发送 arp 请求次数,-s 指定源地址,最后的 IP 表示发送目标 (这里是网关地址)。
8、route
显示或更改路由表
|
|
其中 Destination
表示目的网段或目标主机;Gateway
表示网关地址;Genmask
表示目的网段的掩码;Flags 表示路由标志:U 表示路由是启用 (up) 的、G 表示网关;Metric
表示目标距离,通常用跳数表示;Ref
表示路由的引用数;Use
表示路由查找计数;Iface
表示此条路由的出口。
- 选项
-n
表示用数字形式显示目的网段 - 选项
add
和del
表示添加或删除一条路由。 - 选项
-net
和netmask
表示指定目的网段及掩码。 - 选项
gw
表示指定网关。 - 选项
dev IF
表示指定出口网卡
如增加一条到 192.56.76.x 的路由,使它的出口为 ens32:
|
|
如增加一条默认路由,指明它的网关为 10.0.1.1
|
|
如增加一条到 172.20.70.0 的路由,网关为 10.0.1.2
|
|
如删除默认路由
|
|
9、telnet
提供远程登录功能
由于 telnet 协议使用明文传输,在要求安全登录的环境中并不适用。现在通常用它来进行网络服务的端口测试:
|
|
这里对方的 80 端口是开启并允许通信的。当对端端口没有开启时:
|
|
当对端拒绝连接时:
|
|
10、ssh
远程登录程序
|
|
ssh
的全称是 Secure Shell,在不安全的网络主机间提供安全加密的通信,旨在代替其他远程登录协议。
|
|
当命令 ssh
后直接跟主机 IP 时表示使用默认用户 root
登录,如果是首次登录,需要确认添加该主机的认证 key,当输入 yes 后,即会在本机 /root/.ssh/known_hosts
中增加一条该主机的记录,下一次登录时就不用再次确认了。然后需要输入用户密码,通过验证之后,我们就获得了目的主机的一个 shell,我们就可以在这个 shell 中执行命令了。
在新 shell 中输入 exit
即可退回到原 shell。
如果需要频繁登录某主机,但不想每次都输入密码,可以设置免密码登录:
|
|
其中命令 ssh-keygen
用来生成公钥私钥,选项 -t 指明密钥类型。之后使用命令 ssh-copy-id 将公钥发送至目标主机,这里需要输入目标主机用户密码。然后就可以免密码登录了:
|
|
还可以通过 ssh 远程执行命令:
|
|
或者手动将公钥拷贝至目标主机:
|
|
选项 -p 为登录指定端口:
|
|
端口设置在服务端配置文件 /etc/ssh/sshd_config
中,默认端口号为 22,如更改需将 #Port 22
去掉注释并将 22 更改为需要的端口,然后重启 sshd 服务 service sshd restart
或 systemctl restart sshd
。
如果需要使用另外的用户登录系统则执行 ssh user@host
我们可以用 tar 命令结合 ssh 和管道,将本地 (远程) 文件备份到远程(本地):
|
|
选项 -L [bind_address:]port:host:hostport
设置本地端口转发
|
|
此命令的意思是绑定本地端口 2222
,并将所有发送至此端口的数据通过中间主机 10.0.1.253
转发至目标主机 10.0.1.252
的 22
端口,此时如果用 ssh
登录本机的 2222 端口,则实际登录的是主机 10.0.1.252
|
|
这里默认绑定的是本机的环回口 127.0.0.1
,如绑定到其他地址,则根据语法设置 bind_address
。
选项 -N
表示不执行命令,只设置端口转发时有用
由于上述端口转发命令 ssh -L 2222:10.0.1.252:22 10.0.1.253
会登录到中间主机,并且退出后端口转发也会终止,使用 -N
选项将不会登录,再配合 shell 后台执行,将会是一个不错的设置端口转发的选择 (但要注意对中间主机需要免密码登录):
|
|
命令最后的符号 &
表示此命令将在后台执行,返回的信息中 [1]
表示后台命令编号,12432
表示命令的 PID。(关于 shell 后台命令,以后的文章中会有叙述)
选项 -R [bind_address:]port:host:hostport
设置远程端口转发
如我们在 10.0.1.253
上执行:
|
|
然后在 10.0.1.254
上登录:
|
|
这里的意思是使远程主机 10.0.1.254
(相对 10.0.1.253 来说)监听端口 2222
,然后将所有发送至此端口的数据转发至目标主机 10.0.1.252
的端口 22
。之后再在 10.0.1.254
登录本地 (localhost) 的 2222
端口时,实际通过中间主机 10.0.1.253
登录目标主机 10.0.1.252
。
选项 -o OPTION
指定配置文件 (如 /etc/ssh/sshd_config
) 内选项
如避免第一次登录时输入 yes
确认,可增加 -o StrictHostKeyChecking=no
。
11、scp
远程复制文件
|
|
scp
命令通过 ssh
协议将数据加密传输,和 ssh
登录类似,需要输入远程主机用户密码。
如将远程主机 10.0.1.253
中文件 /root/tcp.sh
复制到本地当前目录下:
|
|
命令会显示传输状态 (传输百分比,大小,速度,用时)。
将本地文件复制到远程无非是将源和目的调换位置。
- 选项
-P
指定远端连接端口 (ssh 服务端口),-o ssh_option
使用 ssh 选项。 - 选项
-l limit
传输限速,limit
单位为 Kbit/s。
和命令 cp
类似,选项 -r
表示复制目录,-p
表示保留文件权限时间等
12、netstat
打印网络信息
选项 -a
显示所有端口信息:
|
|
这里只显示部分信息
- 选项
-t
显示 TCP 连接信息 - 选项
-n
显示 IP 地址而不进行域名转换 - 选项
-p
显示 PID 和程序名
|
|
其中 Proto
表示协议 (包括 TCP、UDP 等);Recv-Q
和 Send-Q
表示接收和发送队列,一般都为 0,如果非 0 则表示本地的接收或发送缓存区有数据等待处理;Local Address
和 Foreign Address
分别表示本地地址和远端地址;State
表示连接状态,对应于 TCP 各种连接状态;PID/Program name
表示进程号和程序名。
选项 -l
表示只显示状态为 LISTEN
的连接
|
|
- 选项
-u
表示显示 UDP 连接信息 - 选项
-r
表示显示路由信息
|
|
选项 -i
显示接口信息
|
|
13、tcpdump
网络抓包工具
命令 tcpdump
捕获某网络接口符合表达式 expression
的数据包,并打印出数据包内容的描述信息。
选项 -i
指定网卡:
|
|
启动命令之后显示出可以使用 -v
或 -vv
显示更详细的信息,开始从 ens33 捕获数据包。输出显示出各个发送或接收数据包包头信息 (包括 ARP、IP、TCP、UDP 等等协议)。此命令并未指定 expression
,所以默认将捕获所有数据包。
如果需要将数据包捕获然后通过其他程序 (如 wireshark) 分析,可以使用选项 -w file
将数据写入文件,同时还需要使用选项 -s 0
指定能够捕获的数据包大小为 65535 字节,以避免数据包被截断而无法被分析。
真实环境中,流经网卡的数据包量是巨大的。可以使用表达式来对数据包进行过滤,对于每个数据包,都要经过表达式的过滤,只有表达式的值为 true 时,才会输出。
expression
中可以包含一到多个关键字指定的条件,可以使用 and
(或 &&
)、or
(或 ||
)、not
(或!
)和括号 ()
表示各个关键字间的逻辑关系,可以用 >、<
表示比较,还可以进行计算。其中关键字包括:
type 类型关键字,如 host
、net
、port
和 portrange
,分别表示主机、网段、端口号、端口段。
direction
方向关键字,如 src
、dst
分别表示源和目的。
proto
协议关键字,如 fddi
、arp
、ip
、tcp
、udp
等分别表示各种网络协议。
由于篇幅所限,下面的例子中将只描述选项和表达式所起到的作用,不再解释输出内容:
|
|
网络相关命令内容较多,下一篇将继续介绍。