Skip to content

网络管理

Linux 作为一个越来越成熟的系统,在服务器市场、嵌入式设备等方面都取得了巨大的成功,在网络上的应用也越来越多。
事实上,从 Linux 诞生时起,其就被赋予了强大的网络功能,所以掌握如何在 Linux 系统中配置、管理网络就变得非常必要。

网络接口配置

使用 ifconfig 检查和配置网卡

如果不使用任何参数,输入 ifconfig 命令时将会输出当前系统中素有处于活动状态的网络接口,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
➜  ~ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.46.254  netmask 255.255.192.0  broadcast 172.17.63.255
        ether 00:16:3e:02:45:7b  txqueuelen 1000  (Ethernet)
        RX packets 44472614  bytes 7199288304 (6.7 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35952545  bytes 34535241316 (32.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1  (Local Loopback)
        RX packets 28588606  bytes 1819114682 (1.6 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 28588606  bytes 1819114682 (1.6 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

图中的 eth0 表示的是以太网的第一块网卡。其中 eth 是 Ethernet 的前三个字母,代表以太网,0 代表是第一块网卡,第二块以太网网卡则是 eth1,以此类推。
ether 是指网卡的硬件地址(MAC 地址);inet 是指该网卡当前的 IP 地址;broadcast 是广播地址(这部分是由系统根据 IP 和掩码算出来的,一般不需要手工设置);
netmask 是指掩码;UP 说明了该网卡目前处于活动状态;MTU 代表最大存储单元,即此网卡一次所能传输的最大分包;
RX 和 TX 分别代表接收和发送的包;collision 代表发生的冲突数,如果发现值不为 0 则很可能网络存在故障;
txqueuelen 代表传输缓冲区长度大小;

第二个设备是 lo,表示主机的环回地址,这个地址是用于本地通信的。

如果在 ifconfig 命令后面跟上具体设备的名称(比如 eth0),则只显示指定设备的相关信息

1
2
3
4
5
6
7
8
➜  ~ ifconfig eth0
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.46.254  netmask 255.255.192.0  broadcast 172.17.63.255
        ether 00:16:3e:02:45:7b  txqueuelen 1000  (Ethernet)
        RX packets 44475937  bytes 7199711635 (6.7 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 35955592  bytes 34536600683 (32.1 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

由于某种原因如果希望手工指定 eth0 的 IP 地址,那么可按如下方式进行修改:

1
2
3
4
5
ifconfig eth0 192.168.159.130 netmak 255.255.255.0
# 上面的命令可以简写为
ifconfig eht0 192.168.159.130/24
# 通过 IP 地址和掩码系统能自行算出广播地址,也可以显式地指定广播地址,不过一般情况下没有必要这么做
ifconfig eth0 192.168.159.130 broadcast 192.168.159.255 netmask 255.255.255.0

有时候需要手工断开/启用网卡,以 eth0 为例,使用方法如下:

1
2
3
4
5
6
ifconfig eth0 down
# 在关闭了网卡后,再使用不加参数的 ifconfig 命令时,将不再显示 eth0,但是可以使用 ifconfig -a 显示所有包括当前不活动的网卡
ifconfig eth0 up
# 启动网卡 eth0,以上关闭和启动网卡的命令等同于乳腺癌两条命令
ifdown eth0
ifup eth0

将 IP 配置信息写入配置文件

ifconfig 命令可以直接配置网卡 IP,但是这属于一种动态的配置,所配置的信息只是保存在当前运行的内核中。一旦系统重启,这些信息将丢失。
为了能在重启后依然生效,可以在相关的配置文件中保存这些信息,这样,系统重启后将从这些配置文件中读取出来。
RedHat 和 CentOS 系统的网络配置文件所处的目录为etc/sysconfig/network-scripts/,eth0 的配置文件为ifcfg-eth0,如果有第二块物理网卡,则配置文件为ifcfg-eth1,以此类推。

一直以来,用于演示的虚拟机的配置文件是安装系统时生成的,内容如下:

1
2
3
4
5
cat ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32LANCE]
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes

其中,DEVICE 变量定义了设备的名称;BOOTPROTO 变量定义了获取 IP 的方式,这里 BOOTPROTO=dhcp 的含义是:系统在启用这块网卡时,IP 将会通过 dhcp 的方式获得;还有个可选的值是 static,表示静态设置的 IP;ONBOOT 变量定义了启动式是否激活使用该设备,yes 表示激活,no 表示不激活。

为了静态化地为该系统配置一个 IP(这里假设 IP 为 192.168.159.129,子网掩码为 255.255.255.0),将配置文件修改如下:

1
2
3
4
5
6
7
cat ifcfg-eth0
# Advanced Micro Devices [AMD] 79c970 [PCnet32LANCE]
DEVICE=eth0
BOOTPROTO=static
ONBOOT=yes
IPADDR=192.168.159.129
NETMASK=255.255.255.0

修改完成后,如果要想立即生效,可以将端口先停用再启用,或者重启网络服务器。
虽然这两种方式和效果是一样的,但是在实际工作中也要注意,第一种方式是不能远程操作的,因为一旦网卡被关闭掉后远程连接就断开了,随后的启用命令也就无法输入了,所以这种方式只能在管理员可以物理地接触到服务器的时候使用(比如说你正坐在被操作的这台服务器面前,使用本地终端操作服务器而不是远程登录)

第二种方式虽然也经过了一次网络断开,但是该命令会在断开后立即启动网络,因此只需要使用新的 IP 重新连接就可以了。

1
2
3
4
ifconfig eth0 down
ifconfig eth0 up
# 或者重启网络服务,也可以立即重启,推荐使用这种方式
service network restart

路由和网关设置

Linux 主机之间是使用 IP 进行通信的,假设 A 主机和 B 主机同在一个网段内且网卡都处于激活状态,则 A 具备和 B 直接通信的能力(通过交换机或简易 HUB)。
但是如果 A 主机和 B 主机处于两个不同的网段,则 A 必须通过路由器才能和 B 通信。
一般来说,路由器属于 IT 设备的基础设施,每一个网段都应该有至少一个网关。
在 Linux 中可使用 route 命令添加默认网关。假设添加的网关是 192.168.159.2,添加方式如下:

1
route add default gw 192.168.159.2

在以上命令中,只需要将 add 改成 del,就能删除刚才添加的路由

1
2
3
route del default gw 192.168.159.2
# 该命令可以简写成如下形式
route del default

添加网关后,可以使用 route -n 查看系统当前的路由表

1
2
3
4
5
6
➜  ~ route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.63.253   0.0.0.0         UG    0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
172.17.0.0      0.0.0.0         255.255.192.0   U     0      0        0 eth0

同样的,如果只使用 route 命令添加网关,一旦系统重启,配置信息就不存在了,必须将这种配置信息写到相关的配置文件中才能永久保存。

可以在网卡配置文件中使用 GATEWAY 变量来定义网关,只需要添加如下部分到 ifcfg-eth0 中即可,当然别忘了重启网络服务使配置生效

1
GATEWAY=192.168.159.2

另外,在配置文件/etc/sysconfig/network中添加这段配置也能达到同样的效果

DNS 客户端配置

/etc/hosts

因特网发明初期,联网的主机数量有限,想要访问对方主机时只需要输入对方的 IP 地址即可。
但是随着主机数量的不断增长,单凭人脑已经无法记忆越来越多的 IP 地址了。
为了解决这个问题,人们使用 hosts 文件来记录主机名和 IP 的对应关系,这样访问对方的主机时,就不需要使用 IP 了,只需要使用主机名。
这个文件在 Linux 下就是/etc/hosts,这种方式确实“可以工作”,但是当主机数量增长到一定数量级的时候仍然无法使用。
wile彻底解决这个问题,人们发明了 DNS 系统。
经过几十年的发展,虽然系统、网络技术都发生了翻天覆地地变化,但是这个文件还是被当作传统保留了下来。
具体来说,hosts 文件的作用主要如下:

  • 加快域名解析。当访问网站时,系统会首先查看 hosts 文件中是否有记录,如果记录存在则直接解析出对应的 IP,这时则不需要请求 DNS 服务器
  • 方便小型局域网用户使用的内部设备。很多单位的局域网中都存在着不少内部应用系统(比如办公自动化 OA、公司论坛等),平时在工作中也都需要访问,但是由于这些局域网太小而不必为此专门设置 DNS 服务器,那么此时使用 hosts 文件则能简单地解决这个问题

假设公司里有 A、B 两台主机,B 主机的 IP 为 10.1.1.145,为了方便访问 B 主机,可以在 A 主机的/etc/hosts文件中添加一条记录

1
10.1.1.145 hostB

完成后在 A 主机上使用 ping 命令测试到 B 主机的连通性,在 ping 的输出中可以看到主机名 hostB 被正确地解析为 10.1.1.145,如果没有之前添加的记录,这里将会显示 ping:unknownhost hostB 的错误:

1
2
3
4
5
6
7
ping hostB -c 1
PING hostB(10.1.1.145) 56(84) bytes of data
64 bytes from hostB(10.1.1.145):icmp_seq=1 ttl=64
time=0.797 ms
--- hostB ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt main/avg/max/mdev=0.797/0.797/0.797/0.000ms

/etc/resolv.conf

使用 hosts 文件毕竟只能做有限的主机记录,无法将所有已知的主机名记录到 hosts 文件中。
因此,当今几乎所有的主机都在使用 DNS 来解析地址,从技术上来说,DNS 就是全互联网上主机名及其 IP 地址对应关系的数据库。
设置主机为 DNS 客户端的配置文件就是/etc/resolv.conf,其中包含nameserver、search、domain这 3 个关键字。

1
2
3
4
cat /etc/resolv.conf
:generated by /sbin/dhclient-script
search localdomain
nameserver 192.168.159.2
1
2
3
4
5
➜  ~ cat /etc/resolv.conf 

nameserver 100.100.2.136
nameserver 100.100.2.138
options timeout:2 attempts:3 rotate single-request-reopen

nameserver 关键字后面紧跟着一个 DNS 主机的 IP 地址,可以设置 2 到 3 个 namerserver,但是主机在查询域名时会首先查询第一个 DNS,当该 DNS 不可用时才会查询第二个 DNS,以此类推。
注意,虽然你可以在该文件中定义多于 3 个的 nameserver,但是这并没有意义,因为系统永远不会用到第四个 nameserver

search 关键字后紧跟的是一个域名。
每个主机严格来说都应该有一个 FQDN(全限定域名),所以往往域名就很长,如果这里写成 search google.com,那么 www 就代表 www.google.com 了,这个关键字后可以跟多个域名。

domain 关键字和 search 类似,不同的是 domain 后面只能跟一个域名。

wget

非交互式网络下载工具

wget 是用于文件下载的命令行程序。
该命令既可以用于从网站上下载内容也可以用于从 FTP 站点下载,单个文件、多个文件甚至整个网络都可以被下载

wget http://linuxconmand.org/index.php

网络测试工具

ping

ping 程序的目的在于测试另一台主机是否可达,一般来说,如果 ping 不到某台主机,就说明对方主机已经出现了问题,但是不排除由于链路中防火墙的因素、ping 包被丢弃等原因而造成 ping 不通的情况。
ping 命令最简单的使用方式是接收一个主机名或 IP 作为其单一的参数,在按回车键后,执行 ping 命令的主机会向端主机发送一个 ICMP 的 echo 请求包,对端主机在接收到这个包后会回应一个 ICMP 的 reply 回应包。
在 Linux 下 ping 命令并不会主动停止,需要使用 Ctrl + C 组合键来停止,ping 命令会对发出的请求包和收到的回应包进行计数,这样就能计算网络丢包率

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
➜  ~ ping www.baidu.com
PING www.a.shifen.com (180.101.49.11) 56(84) bytes of data.
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=1 ttl=48 time=12.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=2 ttl=48 time=12.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=3 ttl=48 time=12.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=4 ttl=48 time=12.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=5 ttl=48 time=12.7 ms
64 bytes from 180.101.49.11 (180.101.49.11): icmp_seq=6 ttl=48 time=12.8 ms
^C
--- www.a.shifen.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5015ms
rtt min/avg/max/mdev = 12.751/12.794/12.861/0.033 ms
➜  ~ 

ping 命令的常用参数

参数 含义
-c 指定 ping 的次数
-i 指定 ping 包的发送间隔
-w 如果 ping 没有回应,则在指定超时时间后退出

host

host 命令是用来查询 DNS 记录的,如果使用域名作为 host 的参数,命令返回该域名的 IP

1
2
3
4
5
6
➜  ~ host www.baidu.com
www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 220.181.38.150
www.a.shifen.com has address 220.181.38.149
www.a.shifen.com has IPv6 address 240e:83:205:58:0:ff:b09f:36bf
www.a.shifen.com has IPv6 address 240e:83:205:59:0:ff:b09b:159e

可以在浏览器中直接输入任意一个查询的 IP 地址,看是不是百度主页。
以上命令还可以有第二个参数,该参数必须是一个可用的 DNS 服务器,也就是使用命令指定的 DNS 查询域名,而不是用/etc/resolv.conf文件中定义的 DNS 查询。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
➜  ~ host www.baidu.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases:

www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com is an alias for www.wshifen.com.
www.wshifen.com has address 104.193.88.123
www.wshifen.com has address 104.193.88.77

traceroute

在 IP 包结构中有一个定义数据包生命周期的 TTL(Time To Live)字段,该字段用于表明 IP 数据包的生命值,当 IP 数据包在网络上传输时,每经过一个路由器该值就减 1,当该值减为 0 时此包就会被路由器丢弃。
这种设计可用于避免出现一些由于某种原因始终无法到达目的地的包不断地在互联网上传递(可以形象地称之为“幽灵包”),减少无谓的网络资源耗用

不过路由器也不是“无声无息”地将 TTL 值为 0 的 IP 包丢弃的,它会同时给发送该 IP 数据包的主机发送一个 ICMP “超时”消息,主机在接收到这个 ICMP 包后就同时能得到该路由的 IP 地址

根据上面两个特点,人们写了一个监测数据包是如何经由路由器的工具--traceroute,我们可以想象一下该工具的工作原理:它先构造出一个 TTL 值为 1 的数据包发送给目的主机,这个数据包在经由第一个路由器时,路由器先将 TTL 值减 1 变为 0,然后将该 IP 包丢弃,同时给发送一个 ICMP 消息,这样就得到了经过的第一台路由器的 IP 地址;
然后再构造出一个 TTL 值为 2 的数据包,以此类推,就能得到该 IP 包经历的整条链路的路由器 IP

这里会有一个问题:traceroute 如何确认该 IP 包成功地被目的主机接收了呢?
因为目的主机即便收到了 TTL 值为 1 的数据包也不会发送 ICMP 通知给源主机的。
这时 traceroute 所做的工作就是发送一个 UDP 包给目的主机,同时制定该 UDP 接收的端口为主机不可能存在的端口,主机在接收到这样的包后,由于端口不可达,则主机会返回一个“端口不可达”的通知,这样就能确认目的主机是否可以接收到数据包

常见网络故障排查

网络是一切系统赖以正常工作的基础设施,所以保证主机的网络连通性是一切工作得以开展的前提。
由于网络协议和设备所具有的复杂性,很多故障解决起来是有难度的,不仅需要工作人员有相应的知识结构来帮助解决问题,有时候还需要他们具有丰富的网络经验。
从大多数情况看,网路故障主要分为硬件故障和软件故障两种。

  • 硬件故障又主要分为网卡物理损坏、链路故障等原因。其中网卡物理损坏是指网卡设备由于使用中发生电子元件损坏而造成网卡设备无法继续使用的情况;链路故障很多时候表现为网线或者水晶头在制作过程中出现线路问题,或由于线路老化等原因造成物理链路断开,从而致使网络无法物理连通的情况。
  • 软件主要表现为网卡驱动故障,也就是操作系统对网卡驱动的不兼容,这个问题往往需要通过安装对应的网卡设备驱动来解决。

基于以上两点,将解决网络在故障时采用的步骤总结如下(不管其中哪一步中出现问题都需要解决当前的问题才能进行下一步测试,当所有测试都通过了则问题也就解决了):

第一步是要确认网卡本身是否能正常工作?
利用 ping 工具可以确认这点。输入ping 127.0.0.1,然后看是否能正常 ping 通?这里的 127.0.0. 被称为主机的回环接口,是 TCP/IP 协议栈正常工作的前提。
如果 ping 不通,一般可以证实为本机 TCP/IP 协议栈有问题,自然就无法连接网络了。

第二步是要确认网卡是否出现了物理或驱动故障,使用 ping 本机 IP 地址的方式,如果能 ping 通则说明本地设备的驱动都正常。

第三步要确认是否能 ping 通同网段的其他主机。
这一步主要是确认二层网络设备(比如交换机或者 HUB)工作是否正常。
如果 ping 不通往往说明二层网络上出现了问题,可能涉及交换机的端口工作模式、vlan 划分等因素。

第四步要确认是否能 ping 通网关 IP。如果数据包能正常到达网关,则说明主机和本地网络都工作正常。

第五步确认是否能 ping 通公网上的 IP,如果可以则说明本地的路由设置正确,否则就要确认路由设备是否做了正确的 nat 或路由设置

第六步确认是否能 ping 通公网上的某个域名,如果能 ping 通则说明 DNS 部分设置正确。

即便实际工作中可能会受到诸如更复杂的网络环境、安全 ACL、防火墙等众多因素的影响,而加大了网络排查的苦难,但以上步骤是排序网络故障的主要环节,在排除不同的网络之间个性化的设置之后,排查的主要步骤都与此类似。