Linux 网络接口

在 Linux 中,所有网络通信都发生在软件接口与物理网络设备之间。与网络接口相关的配置文件以及控制网络接口状态的脚本文件都位于 /etc/sysconfig/network-scripts/。虽然在不同系统中,文件的类型和数量不一定相同,但总体来讲,都包含以下几类与网络相关的配置文件:

各种网络设备都需要用到这些文件,以保证设备的正常运作。

网络接口配置文件

在 Linux 中,网络接口配置文件用于控制系统中的网络接口,进而实现对网络设备的控制。系统启动时,通过这些配置文件决定启动哪些接口,以及如何对这些接口进行配置。接口配置文件的名称通常类似于 ifcfg-<name>,其中 <name> 与配置文件所控制的设备的名称相关。

在所有网络接口中,最常用的接口类型是以太网接口。

以太网接口

在所有网络接口配置文件中,最常用的是 ifcfg-eth0,因为它是系统中第一块网卡的配置文件。如果系统中有多块网卡,ifcfg-eth 后面的数字会依次递增。因为每个设备都对应的一个配置文件,所以管理员能单独地控制每个设备。

以下是一个 ifcfg-eth0 配置文件的示例:

DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETWORK=10.0.1.0
NETMASK=255.255.255.0
IPADDR=10.0.1.27
USERCTL=no

在接口配置文件中,某些选项之间存在着关联,如果不像上例中那样使用固定 IP 地址,而是使用 DHCP 获取 IP 地址,那么配置文件就会不一样。以下是通过 DHCP 获取 IP 地址的配置:

DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
使用网络管理工具(system-config-network) 对网络接口文件进行更改是比较方便的方式,但通过手动更改配置文件,能够更好地在各种 Linux 发行版中执行网络配置工作。

下面是以太网接口配置文件中常用的选项:

BOOTPROTO=<protocol>

<protocol> 的值有以下几种:

BROADCAST=<address>

<address> 表示广播地址。ifcalc 程序会自动计算这个地址,不推荐手动对它进行配置。

DEVICE=<name>

<name> 表示物理设备的名称,对于动态寻址的 PPP 设备则是指它的逻辑名称。

DNS{1,2}=<adderss>

<address> 表示名称服务器的 IP 地址。如果 PEERDNS 选项被设置为 yes,这里设置的 IP 地址将会替代 /etc/resolv.conf 中的设置

IPADDR=<address>

<address> 的值是分配给网卡的 IP 地址

NETMASK=<mask>

<mask> 表示子网掩码

GATEWAY=<address>

<address> 的值是路由器或其它网关设备的 IP 地址

ONBOOT=<yes|no>

PEERDNS=<yes|no>

USERCTL=<yes|no>

网络配置文件

在开始对 Linux 进行网络配置之前,需要先了解与网络配置相关的主要配置文件:

/etc/hosts

用于设置主机名与 IP 地址之间的映射关系,为那些无法通过其它方式 (如通过 DNS 服务器) 解析的主机名进行解析,它还能够在没有 DNS 的小型网络中充当主机名解析的角色。无论在何种类型的网络上,hosts 文件中都有关于环回链路(127.0.0.1)的主机记录(localhost.localdomain)。

/etc/resolv.conf

用于设置 DNS 服务器的 IP 地址和搜索域,除非另行配置,否则网络初始化脚本总是使用这个文档中的配置信息。

/etc/sysconfig/network

用于为所有网络接口设置路由和主机信息

/etc/sysconfig/network-scripts/ifcfg-<interface-name>

每个网络接口都有一个与之对应的配置脚本,这些脚本文件为相应的网络接口设置配置信息

以太网接口配置

BONDING_OPTS=<parameters>

这个参数用在 /etc/sysconfig/network-scripts/ifcfg-bond<N> 配置文件中,用于为绑定设备(Bonding Device)设置参数。这些参数与 /sys/class/net/<bonding-device>/bonding 中使用的参数相同。

ETHTOOL_OPTS=<options>

<options> 的值可以是 ethtool 程序所支持的任意值,例如希望将网卡强制配置成百兆全双工工作模式,可以进行以下配置:

ETHTOOL_OPTS="autoneg off speed 100 duplex full"

HWADDR=<MAC-address>

<MAC-address> 的值为以太网设备的 MAC 地址,格式如 AA:BB:CC:DD:EE:FF。当机器上安装多块网卡时,一定要使用这个选项,以确保接口被分配到正确的设备上(为每个 NIC 模块配置了启用顺序的情况除外)。注意不要将这个选项与 MACADDR 选项一起使用。

MACADDR=<MAC-address>

<MAC-address> 的值为以太网设备的 MAC 地址,格式如 AA:BB:CC:DD:EE:FF。这个选项用于替换网卡原有的 MAC 地址。注意不要将这个选项与 HWADDR 选项一起使用。

MASTER=<bond-interface>

<bond-interface> 的值是以太网卡连接到的通道绑定接口的名称,这个指令与 SLAVE 指令配合使用。

SLAVE=<yes|no>

SRCADDR=<address>

<address> 的值为出栈数据包的源 IP 地址

通道绑定接口配置

Fedora/Linux 操作系统允许管理员通过使用“绑定内核模块”(bonding kernel model),将多个网络接口绑定成一个“通道绑定接口”(channel bonding interface),或称之为“绑定接口”。

绑定接口能够让两个或多个网络接口变成一个,从而增加网络带宽,提供网络冗余。

通过在 /etc/sysconfig/network-scripts/ 目录下创建 ifcfg-bond<N> 文件,就能够创建绑定接口。文件名称中的 <N> 为接口的编号,比如,第一个通道绑定接口的名称一般为 ifcfg-bond0。

ifcfg-bond<N> 文件的内容与以太网接口的配置文件(如 ifcfg-eth0)基本相同,只是 DEVICE 选项的值,应该为 bond<N>。

以下是一个绑定接口的配置文件样本:

DEVICE=bond0
BONDING_OPTS="mode=1 miimon=500"
BOOTPROTO=none
ONBOOT=yes
NETWORK=10.0.1.0
NETMASK=255.255.255.0
IPADDR=10.0.1.27
USERCTL=no

通过配置文件创建绑定接口后,还需要在被绑定的网络接口的配置文件中添加从属关系选项(MASTER 和 SLAVE)。例如,将名为 eth0 和 eth1 的两块以太网卡进行绑定,则它们的配置文件内容类似于:

DEVICE=eth<N>
BOOTPROTO=none
ONBOOT=yes
MASTER=bond0
SLAVE=yes
USERCTL=no

别名接口和克隆接口配置文件

别名(Alias)文件和克隆(clone)文件是 Linux 中用得比较少的两类网络接口配置文件。其中别名文件可以将多个 IP 地址绑定到一个网络接口上,克隆文件则用于为接口定义附加选项。

别名文件

别名文件的命名结构为 ifcfg-<if-name>:<alias-value>,如 ifcfg-eth0:0。假设 eth0 接口已经被配置成通过 DHCP 自动获取 IP 地址,可以在 ifcfg-eth0:0 配置文件中定义 DEVICE=eth0:0,并指定 IP 地址为 10.0.0.2。如此一来 eth0 接口既使用 DHCP 分配的动态 IP,同时也能接收到传给 10.0.0.2 的数据。

注意:以太网接口(ifcfg-eth0)能够配置成 DHCP,但别名接口(ifcfg-eth0:0)不能配置成 DHCP。

克隆文件

克隆接口的命名结构为 ifcfg-<if-name>-<clone-name>,克隆文件用于为指定接口添加附加选项。例如,一个使用 DHCP 的网络接口 eth0:

DEVICE=eth0
ONBOOT=yes
BOOTPROTO=dhcp

没有设置 USERCTL 选项,因此 USERCTL 使用默认值 no,即非 root 用户无法控制接口的启用状态。通过将 ifcfg-eth0 文件复制成 ifcfg-eth0-user,并向克隆文件中添加 USERCTL=yes 指令,普通用户就能够通过 /sbin/ifup eth0-user 命令启用 eth0 接口。

使用克隆文件时,实际上是整合了接口配置文件(如 ifcfg-eth0)和克隆文件(如 ifcfg-eth0-user)中的配置。

其它网络接口配置

除了前面讲到的以太网接口、IPSec 接口、通道绑定接口、别名接口、克隆接口的配置文件,Linux 还能够配置以下几种不太常用的网络接口。

ifcfg-lo

本地环回链路接口。环回链路通常用于测试,被不少应用程序使用。任何被发送到环回链路的数据都会立即被返回到主机的网络层。
环回链路接口的配置文件位于 /etc/sysconfig/network-scripts/ifcfg-lo,在任何情况下,都不要手动编辑这个文件,否则可能导致系统不正常。

网络接口控制脚本

在 Linux 中,接口控制脚本用于激活和取消激活系统接口, /sbin/ifdown 和 /sbin/ifup 是最主要的两个接口控制脚本,它们通过调用 /etc/sysconfig/network-scripts/ 目录中的配置文件起作用。

ifup 和 ifdown 接口脚本是指向 /sbin/ 目录的符号链接,在使用这两个脚本时,需要指定接口的名称,如

# ifup eth0
普通用户也能够使用 ifup 和 ifdown 命令,但与接口的配置有关。

网络接口被启动时需要完成许多网络初始化工作,其中大部分工作由 /etc/rc.d/init.d/functions 和 /etc/sysconfig/network-scripts/network-functions 这两个文件实现。

当验证某个接口已经被配置完成,并且用户拥有控制接口的权限之后,相应的脚本会启用或关闭接口。以下是位于 /etc/sysconfig/network-scripts/ 目录中的常用的接口控制脚本:

ifup-aliases

当有别名接口配置文件时,为指定接口配置多个 IP 地。

ifup-ippp 和 ifdown-ippp

启用和关闭 ISDN 接口。

ifup-ipsec 和 ifdown-ipsec

启用和关闭 IPsec 接口。

ifup-ipv6 和 ifdown-ipv6

启用和关闭 IPv6 接口。

ifup-plip

启用 PLIP 接口。

ifup-plusb

为网络连接启用 USB 接口。

ifup-post 和 ifdown-post

包含接口被启用或被关闭后要执行的命令

ifup-ppp 和 ifdown-ppp

启用和关闭 PPP 接口。

ifup-routes

当接口被启用时,为设备添加静态路由。

ifup-sit 和 ifdown-sit

包含在 IPv4 连接中启用和关闭 IPv6 通道所要被调用的函数。

ifup-sl 和 ifdown-sl

启用和关闭 SLIP 接口。

ifup-wireless

启用无线接口。

删除或更改 /etc/sysconfig/network-scripts/ 目录下的任何脚本,都可能导致接口连接出错或失败。所以只在对这些内容非常熟悉的情况下,才对它们进行更改。

操作所有网络脚本的最简单方法是使用 /sbin/service 命令对网络服务(/etc/rc.d/init.d/network)进行操作,如

~]# /sbin/service network <action>

<action> 可以是 start, stop 或 restart(启动、停止或重启)

使用以下命令,可以查看已配置的设备及当前激活的网络接口的状态

~]# /sbin/service network status

配置静态路由

路由功能可以在路由设备上实现,因此在 Fedora/Linux 服务器上配置静态路由不是十分必要。但如果要求为每个接口配置静态路由,也是能够实现的,尤其当机器上的多个接口分别位于不同的网段时,这一功能相当有用。通过 route 命令能够显示当前的 IP 路由表。

静态路由配置存储在 /etc/sysconfig/network-scripts/route-<interface> 文件中,例如,eth0 接口的静态路由配置文件的名称为 route-eth0

route-<interface> 文件的内容有两种格式,一种是 IP 命令行参数格式,别一种是“网段/子网掩码”格式。

IP 命令行参数格式的静态路由配置

这种格式的静态路由配置首先定义接口的默认网关,然后配置文件中的每一行都被单独解析成一条路由条目。以下是一个配置样本:

default x.x.x.x dev <interface>
x.x.x.x/x via x.x.x.x dev <interface>

在第一行中,x.x.x.x 表示默认网关的 IP 地址,<interface> 是连接或通向默认网关的接口名称。后面的条目都是用于定义路由的静态路由条目。

在静态路由条目中,x.x.x.x/x 表示目标网段及其子网掩码,x.x.x.x 和 <interface> 分别表示达到目标网段的网关,以及连接或通向网关的网络接口。

上例中只写了一条路由条目,只要遵循这个格式,可以添加任意多的静态路由条目。

例1:系统中有一个 eth0 接口,它的默认网关为 192.168.0.1,并且可以通过 192.168.0.1 连接到 10.10.10.0/24 和 172.16.1.0/24,则静态路由配置的内容应该如下:

default 192.168.0.1 dev eth0
10.10.10.0/24 via 192.168.0.1 eth0
172.16.1.0/24 via 192.168.0.1 eth0

实际上,因为到达 10.10.10.0/24 和 172.168.1.0/24 的网关,与默认网关相同,因此不配置静态路由也能实现通信,这个例子主要用作说明而已。下面的例 2 则是一个实际的配置情景。

例2:系统中有 eth0、eth1 和 eth2,其中 eth0 连接到默认网关,eth1 和 eth2 分别通过网关 10.10.10.1 和 172.168.1.1 连接到网络 10.10.10.0/24 和 172.168.1.0/24,则静态路由配置的内容应该如下:

default 192.168.0.1 dev eth0
10.10.10.0/24 via 10.10.10.1 eth1
172.16.1.0/24 via 172.16.1.1 eth2

配置静态路由(二)

使用“网段/子网掩码”格式的静态路由配置文件时,每三条记录为一组静态路由配置,并且需要使用相连的数字对静态路由的顺序进行标识,如: ADDRESS0, ADDRESS1, ADDRESS2 ...

网段/子网掩码格式的静态路由配置

ADDRESS0=x.x.x.x 
NETMASK0=x.x.x.x 
GATEWAY0=x.x.x.x

说明:

例:系统中有一个 eth0 接口,它的默认网关为 192.168.0.1,并且可以通过 192.168.0.1 这个网关连接到 10.10.10.0/24 和 172.16.1.0/24,则静态路由配置的内容应该如下:

ADDRESS0=10.10.10.0
NETMASK0=255.255.255.0
GATEWAY0=192.168.0.1
ADDRESS1=172.16.1.0
NETMASK1=255.255.255.0
GATEWAY1=192.168.0.1

在上例中,因为到达 10.10.10.0/24 和 172.168.1.0/24 的网关,与默认网关是相同的,因此不配置静态路由也能实现通信,这个例子主要用作说明罢了。下面的例 2 则是个实际的配置情景。

例 2:系统中有 eth0, eth1 和 eth2,其中 eth0 连接到默认网关,eth1 和 eth2 分别通过网关 10.10.10.1 和 172.168.1.1 连接到网络 10.10.10.0/24 和 172.168.1.0/24,则静态路由配置的内容应该如下:

ADDRESS0=10.10.10.0
NETMASK0=255.255.255.0
GATEWAY0=10.10.10.1
ADDRESS1=172.168.1.0
NETMASK1=255.255.255.0
GATEWAY1=172.168.1.1

对于 Fedora 和其它 Linux 操作系统而言,这些配置均可以通过 DHCP 自行完成,因此没有必要在 Fedora/Linux 服务器上配置静态路由。

网络函数

Linux 将用于启用和停用接口的一些重要的常用函数存放在文件中,例如 /etc/sysconfig/network-scripts/network-functions 文件包含最常用的 IPv4 函数。系统通过这些函数可执行以下功能:获取接口状态及改变信息、设置主机名、寻找网关设备、验证指定设备的启用情况,以及添加静态路由等

而应用 IPv6 的接口所使用的函数与 IPv4 不同,它的函数存储在 /etc/sysconfig/network-scripts/network-functions-ipv6 文件中。