理解debian网络配置文件
2013-12-15 16:13:00 阿炯

Debian系的网卡配置跟Redhat系很不一样,放在一个文件中,而后者放在多个文件中。本文将介绍debian中最为常用的与网络配置相关的配置文件。

1、/etc/resolve.conf
配置系统dns服务器地址,及默认的搜索域。它的格式很简单,每行以一个关键字开头,后接配置参数。resolv.conf的关键字主要有四个,分别是:
nameserver   #定义DNS服务器的IP地址
domain       #定义本地域名
search       #定义域名的搜索列表
sortlist     #对返回的域名进行排序

下面是一个基本的示例:
search freeoa.net
nameserver 192.168.18.1
nameserver 8.8.8.8

2、/etc/hosts
主机名与ip的对照表,包含(本地网络中)已知主机的一个列表。如果系统的 IP 不是动态获取,就可以使用它。对于简单的主机名解析(点分表示法),在请求 DNS 或 NIS 网络名称服务器之前,/etc/hosts.conf 通常会告诉解析程序先查看这里。
文件格式:
ip地址          主机名          别名
127.0.0.1       localhost.localdomain   localhost

3、/etc/services
Internet网络服务文件,将网络服务名转换为端口号/协议。由 inetd、telnet、tcpdump 和一些其它程序读取。文件中的每一行对应一种服务,它由4个字段组成,中间用TAB或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。

4、/etc/hostname
主机名配置文件,该文件只有一行,记录着本机的主机名。

5、/etc/host.conf
当系统中同时存在DNS域名解析和/etc/hosts主机表机制时,由该/etc/host.conf确定主机名解释顺序。示例:
order hosts,bind    #名称解释顺序
multi on            #允许主机拥有多个IP地址
nospoof on          #禁止IP地址欺骗

order是关键字,定义先用本机hosts主机表进行名称解释,如果不能解释,再搜索bind名称服务器(DNS)。

6、/etc/nsswitch.conf
名称服务交换设定档。它控制了数据库搜寻的工作,包括承认的 主机,使用者,群组等。此外,这个档案还定义了所要搜寻的 数据库,例如此行:
hosts: files dns

指明主机数据库来自两个地方,files (/etc/hosts file) 和 DNS, 并且本机上档案优先于 DNS。文件内容大致如下:
passwd:         compat
group:          compat
shadow:         compat

hosts:          files dns
networks:       files

protocols:      db files
services:       db files
ethers:         db files
rpc:            db files

netgroup:       nis

7、/etc/network/interface
这是系统本机网络配置文件,是最重要也是最基本的。其内容大致如下:
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
 address 192.168.0.42
 network 192.168.0.0
 netmask 255.255.255.0
 broadcast 192.168.0.255
 gateway 192.168.0.1

上页是基本的写法,下面看一个复杂的。
broadcast 192.168.1.0
 up route add -net 192.168.1.128 netmask 255.255.255.128 gw 192.168.1.2
 up route add default gw 192.168.1.200
 down route del default gw 192.168.1.200
 down route del -net 192.168.1.128 netmask 255.255.255.128 gw 192.168.1.2

有一个复杂一些的掩码,和一个比较奇怪的广播地址。 还有就是增加的接口启用、禁用时的路由设置;
两行'up'打头的配置的左右是在接口启用的时候,添加一条静态路由和一个缺省路由;
两行'down'打头的配置会在接口禁用的时候,删掉这两条路由配置。

一个物理网口配置多个ip地址的写法
iface eth0:0 inet static
 address 192.168.0.200
 network 192.168.0.0
 netmask 255.255.255.0

下面介绍pre-up和post-down指令。 这是一组命令(pre-up、up、post-up、pre-down、down、post-down),分别定义在对应的时刻需要执行的命令。示例如下:
auto eth0
iface eth0 inet dhcp
 pre-up [ -f /etc/network/local-network-ok ]

这3行会在激活eth0之前检查/etc/network/local-network-ok文件是否存在,如果不存在,则不会激活eth0。

再看一个示例
auto eth0 eth1
iface eth0 inet static
 address 192.168.42.1
 netmask 255.255.255.0
 pre-up /path/to/check-mac-address.sh eth0 11:22:33:44:55:66
 pre-up /usr/local/sbin/enable-masq
iface eth1 inet dhcp
 pre-up /path/to/check-mac-address.sh eth1 AA:BB:CC:DD:EE:FF
 pre-up /usr/local/sbin/firewall

两个网口的'pre-up'行中的check-mac-address.sh放在/usr/share/doc/ifupdown/examples/目录中, 使用的时候需要给它加上可执行权限。这两行命令会检测两块网卡的MAC地址是否为11:22:33:44:55:66和AA:BB:CC:DD:EE:FF,如果正确,则启用网卡。 如果MAC地址错误,就不会启用这两块网卡。

这种方法主要是用来检测两块网卡的MAC地址交换(If their MAC addresses get swapped),其实就是两块网卡名互换了,这种情况在debian系统上再常见不过了,主要是因为内核识别网卡的顺序发生了变化。当引入了udev,这种情况基本上没有了,或直接修改udev中的配置既可。

两个网口的另一'pre-up'行假定在这两块网卡上分别执行自定义的命令。

再一示例
auto eth0
iface eth0 inet manual
 up ifconfig $IFACE 0.0.0.0 up
 up /usr/local/bin/myconfig
 down ifconfig $IFACE down

这段配置只是启用一个网卡,但是ifupdown不对这个网卡设置任何ip,而是由外部程序来设置ip。

下面的配置启用了网卡的混杂模式,用来当监听接口。
auto eth0
iface eth0 inet manual
 up ifconfig $IFACE 0.0.0.0 up
 up ip link set $IFACE promisc on
 down ip link set $IFACE promisc off
 down ifconfig $IFACE down

文件中一般用auto或者allow-hotplug来定义接口的启动行为,那么它们有什么区别呢。

auto
语法:auto <interface_name>
含义:在系统启动的时候启动网络接口,无论网络接口有无连接(插入网线),如果该接口配置了DHCP,则无论有无网线,系统都会去执行DHCP,如果没有插入网线,则等该接口超时后才会继续。

allow-hotplug
语法:allow-hotplug <interface_name>
含义:只有当内核从该接口检测到热插拔事件后才启动该接口。如果系统开机时该接口没有插入网线,则系统不会启动该接口,系统启动后,如果插入网线,系统会自动启动该接口。也就是将网络接口设置为热插拔模式。

手动重新启动网络
一般修改了网络配置文件后,会用以下命令重新启动网络
# /etc/init.d/networking restart

但从debian 6开始,此命令会有如下提示
Running /etc/init.d/networking restart is deprecated because it may not enable again some interfaces ... (warning).
Reconfiguring network interfaces...done.

如果设置接口为auto,虽然会有如此提示,但接口仍然会正确的启动。如果接口设置为allow-hotplug则没有这么走运了,网络接口不会正确启动。这种情况下必须使用如下命令启动网络接口:
# ifup <interface_name>
而命令
# ifconfig <interface_name> up
也无法正确启动接口

所以allow-hotplug设置的接口最好如下方式重新启动网络接口,当然auto方式的接口也没问题:
# ifdown <interface_name> && ifup <interface_name>

特别是在ssh登录远程主机的情况下,一定要像上面这样在一条命令里执行ifdown和ifup,否则如果先执行ifdown,则再也没有机会执行ifup了。

看来大多数情形下,网络接口还是用auto方式比较省心。

8、/etc/init.d/networking
系统启动时的初始化脚本,当系统以某个级别启动时,它负责初始化所有的已配置的网络接口。


网络设置工具
1、etherconf
Debian 下提供一个名叫 etherconf软件包, 用于配置网络信息,这包括主机名,IP,DHCP,DNS,GATEWAY,NETMASK…等,默认没有安装这一软件包,需要手动安装:
# aptitude install etherconf

安装完毕后运行:
$ dpkg-reconfigure etherconf

进行配置。
这个软件会修改以下配置文件:
/etc/resolv.conf
/etc/network/interfaces
/etc/hosts
/etc/hostname

重复使用这一配置文件的方法是:
# dpkg-reconfigure etherconf

2、ifconfig
用于配置常驻内核的网络接口,它用于在引导成功时设定网络接口。此后,只在需要调试及系统调整时才使用。

测试网络工具
1、ping

向网络主机发送ICMP回显请求(ECHO_REQUEST)分组 程序使用 ICMP 协议的强制回显请求数据报以使主机或网关发送一份 ICMP 的回显应答。回显请求数据报(“ pings IP 及 ICMP 的报头,后跟一个“时间值关键字”然后是一段任意长度的填充字节用于把保持分组长度为16的整数倍。以下是程序的选项:
ping  [-c count ] [-i wait ] [-p pattern ] [-s packetsize ] [ -t ttl]   destination

 -c
count 在发送(和接收)了正好数量为 count 的回显应答分组后停止操作。

-i
wait 在发送每个分组时等待 wait 个秒数。缺省值为每个分组等待一秒。此选项与-f选项不能同时使用。

-p
pattern 可以指定最多16个填充字节用于保持分组长度为16的整数倍。在网络上诊断与数据相关问题时此选项很有用。例如``-p ff''将使发出的分组都用全1填充数据区。

-s
packetsize 指定要发送数据的字节量。缺省值为 56 ,这正好在添加了 8 字节的 ICMP 首部后组装成 64 字节的 ICMP 数据报。

-t
ttl指存活数值TTL的大小默认为255

2、route
Route route 程序对内核的 IP 路由表进行操作。它主要用于给那些已经用 ifconfig(8) 程序配置过的接口指定主机或网络设置静态路由。当使用了 add 或 del 选项的时候, route 修改路由表.如果没有这些选项, route 显示当前路由表的内容.
# route [-nee]
# route add [-net|-host] 目标主机或网络 [netmask] [gw|dev]
# route del [-net|-host] 目标主机或网络 [netmask] [gw|dev]

-n :数字地址形式代替解释主机名形式来显示地址。此项对检测为何你到域名服务器的路由发生故障的原因非常有用。
-ee :将产生包括选路表所有参数在内的大量信息
add :添加一条路由
del :删除一条路由
-net :路由目标 target 为网络。
-host :路由目标 target 为主机。
netmask :为添加的路由指定网络掩码!
gw :通过一个网关进行包路由.

注意:指定的网关首先必须是可达的。也就是说必须为该网关预先指定一条静态路由。如果你为本地接口之一指定这个网关地址的话,那么此网关地址将用于决定此接口上的分组将如何进行路由。这是兼容 BSD 风格。

dev :强制路由与指定的设备关联,否则内核自己会试图检测相应的设备(方法是检查要增加的路由项所处环境中已存在的路由和设备声明)。在多数正常的网络上无需使用。

查看本地路由信息
# route

route add -net 127.0.0.0
加一条普通的回环记录,它使用掩码 255.0.0.0 (从目标地址可以判断它是 A 类网)并与设备 "lo" 相关联 .

route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
给通过 "eth0" 的路由表添加一条指向网络 192.56.76.x 的路由。其中 C 类子网掩码修饰词并不是必须的,因为 192.* 是个 C 类的 IP 地址。这里可省略关键字 "dev"。

route add default gw 192.168.1.1
加入一条缺省路由(如果无法匹配其它路由则用它)。使用此路由的所有包都将通过网关 192.168.1.1进行传输。

route add 224.0.0.0 netmask 240.0.0.0 dev eth0
这是一条模糊的命令,把它记录在案就可以让人们知道如何做了.此命令设定所有 D 类地址(用于组播)的路由通过 "eth0" 进行。

3、traceroute/tracepath
traceroute [ -dFIlnrvx ] [ -f first_ttl ] [ -g gateway ]
 [ -i iface ] [ -m max_ttl ] [ -p port ]
 [ -q nqueries ] [ -s src_addr ] [ -t tos ]
  [ -w waittime ] [ -z pausemsecs ]
  host [ packetlen ]

通过traceroute我们可以知道信息从你的计算机到互联网另一端的主机是走的什么路径。当然每次数据包由某一同样的出发点(source)到达某一同样的目的地(destination)走的路径可能会不一样,但基本上来说大部分时候所走的路由是相同的。UNIX系统中,我们称之为traceroute,Windows中为tracert。

traceroute通过发送小的数据包到目的设备直到其返回,来测量其需要多长时间,一条路径上的每个设备traceroute要测3次。输出结果中包括每次测试的时间(ms)和设备的名称(如有的话)及其IP地址。

-d
指定不对计算机名解析地址。

-h maximum_hops
指定查找目标的跳转的最大数目。

-jcomputer-list
指定在 computer-list 中松散源路由。

-w timeout
等待由 timeout 对每个应答指定的毫秒数。

host
目标计算机的名称。

4、mtr
基于ncurses下的全屏幕路由跟踪工具。
mtr运行时,将检查mtr的运行主机与用户指定的目标主机之间的网络连接。在它检测出两台主机间网络阶跃(network hop)各自的地址后,mtr会向每台主机发送 ICMP ECHO 请求以确定其连接质量。当其完成后,mtr会输出每台主机的统计信息。


参考链接
Debian里的配置文件:网卡配置/etc/network/interfaces

DEBIAN网络相关配置文件介绍