一个 Debian 主机可能有很多有不同 Internet协议(IP)地址的网络接口。接口可能有很多种,如:
Loopback:lo
Ethernet:eth0、eth1 ……
Wi-Fi:wlan0、wlan1、wifi0 …… [50]
Token Ring:tr0、tr1 ……
PPP:ppp0、ppp1 ……
其他可用的网络设备还有很多,包括 SLIP、PLIP(串行和并行IP)、控制某种网络接口流量的“shaper”设备、帧中继、AX.25、X.25、ARCnet和 LocalTalk。
每个直接连接到 Internet(或任何基于 IP的网络)的网络接口都用唯一的 32 位的 IP 地址来识别。 [51] IP地址可分为网络地址和主机地址两个部分。如果你拿到一个IP 地址,把网络地址部分全部设为1,而主机地址部分全部设为0,则你将得到这个网络的子网掩码。
传统意义上,IP 网络按照网络地址的长度分为 8、16、24位三个组别。这个系统缺乏灵活性,浪费了很多 IP地址,所以现在的 IPv4网络是由可变长度的网络号来分配的。
IP addresses net mask length Class A 1.0.0.0 - 126.255.255.255 255.0.0.0 = /8 Class B 128.0.0.0 - 191.255.255.255 255.255.0.0 = /16 Class C 192.0.0.0 - 223.255.255.255 255.255.255.0 = /24
IP 地址不在这个范围内的被用作特殊目的。
每一个组别中都有保留给本地网络(LANs)使用的地址范围。这些地址不会和Internet上的发生冲突。(同理,如果主机被分配到这类地址的话,这些主机就不能直接访问Internet,需要通过一个作为代理的网关或网络地址转换服务(NAT)才能访问Internet。)这些地址范围在下表中列出,包含每个组别中这些地址范围的数目。
network addresses length how many Class A 10.x.x.x /8 1 Class B 172.16.x.x - 172.31.x.x /16 16 Class C 192.168.0.x - 192.168.255.x /24 256
IP 网络中 IP地址的第一个值就是网络本身,最后一个值是该网络的广播地址。[52] 其余所有的 IP地址都可以分配给网络中的主机。通常 IP地址的第一个和最后一个都会留给该网络的 Internet 网关。
路由表包含了关于内核如何把 IP包发送到它们目的地的信息。这儿有一个位于本地网络(LAN),IP地址为 192.168.50.x/24 的 Debian 主机的路由表。另一台主机192.168.50.1(也在 LAN 中)是公司网络 172.20.x.x/16 的路由器,主机192.168.50.254(也在 LAN 中)是负责访问 Internet 的路由器。
# route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 127.0.0.0 * 255.0.0.0 U 0 0 2 lo 192.168.50.0 * 255.255.255.0 U 0 0 137 eth0 172.20.0.0 192.168.50.1 255.255.0.0 UG 1 0 7 eth0 default 192.168.50.254 0.0.0.0 UG 1 0 36 eth0
第一行说明传送目的地是 127.x.x.x 的话,则会通过lo 回环网络接口来路由。
第二行说明传送目的地是 LAN 的话,则会通过 eth0来路由。
第三行说明传送目的地是公司网络的话,则会通过eth0 来路由,最后发送到网关192.168.50.1。
第四行说明传送目的地是 Internet 的话,则会通过etho 来路由,最后发送到网关192.168.50.254。
路由表中的 IP 地址也可以用名称表示,这些名称从/etc/networks
或通过 resolver(C Library)来获得。
除了路由之外,内核能实现网络地址转换(NAT)、流量控制和包过滤。
参阅 Net-HOWTO
和othernetworking HOWTOs
来了解背后运行的原理。
GNU/Linux 上传统的底层网络设置工具是 ifconfig
和route
,它们在 net-tools
这个软件包中。目前这些工具被软将包 iproute
中的ip
代替。ip
可以在 Linux 2.2或更新的内核上运行,有着比老的工具更好的兼容性。然而,这些传统的设置工具还是能用的而且大家也更加熟悉。
ifconfig
和 route
下面演示如何把网络接口 eth0 的 IP 地址从192.168.0.3 改为 192.168.0.111;设置eth0 的路由,通过 192.168.0.1 访问10.0.0.0 这个网络。 执行 ifconfi
和route
时不带网络接口参数,则显示所有网络接口和路由的现状。
# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:46:7A:02:B0 inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:23363 errors:0 dropped:0 overruns:0 frame:0 TX packets:21798 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:13479541 (12.8 MiB) TX bytes:20262643 (19.3 MiB) Interrupt:9 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:230172 errors:0 dropped:0 overruns:0 frame:0 TX packets:230172 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:22685256 (21.6 MiB) TX bytes:22685256 (21.6 MiB) # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.0.0 U 0 0 0 eth0 default 192.168.0.1 255.255.255.255 UG 0 0 0 eth0
首先我们关闭网络接口。
# ifconfig eth0 inet down # ifconfig lo Link encap:Local Loopback ... (没有 eth0 这个条目了) # route ... (没有路由表了)
接下来我们启动 eth0 并给予其新的 IP 地址和路由。
# ifconfig eth0 inet up 192.168.0.111 \ netmask 255.255.255.0 broadcast 192.168.0.255 # route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.0.1 dev eth0
结果是:
# ifconfig eth0 Link encap:Ethernet HWaddr 08:00:46:7A:02:B0 inet addr:192.168.0.111 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 ... lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 ... # route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 192.168.0.0 * 255.255.255.0 U 0 0 0 eth0 10.0.0.0 192.168.0.1 255.0.0.0 UG 0 0 0 eth0
更多信息请参阅 ifconfig(8)
和 route(8)
.
ip
ip
和先前的 ifconfig
和 route
有相同功能的命令如下:
ip link show
ip route list
ip link set eth0 down
ip addr del dev eth0 local 192.168.0.3
ip addr add dev eth0 local 192.168.0.111/24 broadcast192.168.0.255
ip link set eth0 up
ip route add dev eth0 to 10.0.0.0/8 src 192.168.0.111 via192.168.0.1
运行的时候使用 help 参数,能让 ip
打印出命令的语法。 例如,ip link help 打印出:
Usage: ip link set DEVICE { up | down | arp { on | off } | dynamic { on | off } | multicast { on | off } | txqueuelen PACKETS | name NEWNAME | address LLADDR | broadcast LLADDR | mtu MTU } ip link show [ DEVICE ]
参阅 ip(8)
.
对于无线网卡(Wi-Fi)接口,除了 ifconfig
或ip
之外,你还需要 iwconfig
这个程序。此程序在 wireless-tools
中。
参阅 iwconfig(8)
.
域名解析器的工作是查找某个域名所对应的 IP地址。大部分常用的域名解析器是 GNU C Library 中的 resovler提供的功能(resolver(3)
)。另一个是由libfiredns
软件包提供的 FireDNSresolver。还有其他的。
GNU LIBC 的域名解析器对域名的解析是由/etc/nsswitch.conf
中的 hosts这一行配置决定的。该行列出了解析域名用的服务:例如dns、files、nis、nisplus。参阅nsswitch.conf(5)
。 即使在使用 files的情况下,域名解析器的行为也是由 /etc/hosts
这个配置文件控制的。参阅 hosts(5)
。
上述文件都是静态的,你可以用你喜欢的编辑器修改。
在使用 dns服务的情况下,域名解释器的行为也是由/etc/resolv.conf
这个配置文件控制的。参阅resolv.conf(5)
。resolv.conf
的一个重要功能就是提供一个域名服务器的 IP地址列表,通过查询这些服务器来获得域名解析。这一列表常常依赖于网络环境,而且在你机器运行的时候,网络环境时常发生变化。pppd
和 dhclient
这类程序都能添加或删除resolv.conf
中的信息。但是这些功能不是每次都能正常工作而且两者还会有冲突。软件包resolvconf
采用了更好的方法解决了这个问题,并提供了一个标准的框架来更新resolv.conf
。参阅管理域名服务器信息 –resolvconf
, 第 10.4.2 节。
resolvconf
软件包 resolvconf
提供了一个框架,能动态的管理关于可用域名服务器的信息。它解决了长久以来如何维护一个给域名解析器和DNS 缓存使用的动态的域名服务器列表的问题。Resolvconf把它自己设为控制网络接口和提供域名服务信息的程序与需要域名服务信息的应用程序的中间媒介。
resolvconf
被设计成不需要任何手动设置就能工作。但是,这个软件包还是很新的,可能需要一些手工的干预才能正常的工作。如果你曾经定制过软件包,而且它们更新了/etc/resolv.conf
的话:你就需要去掉这部分定制。更多信息参阅 file:///usr/share/doc/resolvconf/README.gz
。
nscd
、dnsmasq
、pdnsd
、bind9
如果你的域名服务器响应速度非常慢,你可能需要使用nscd
来缓存域名解析器 libc6
查询到的结果。
如果你希望为你本地网络中的其他主机缓存结果的话,你可能要去运行一个缓存转发域名服务器(cachingforwarding nameserver)。就像 dnsmasq
或 pdnsd
。
如果你愿意,你也可以用软件包 bind9
中的named
来做缓存转发域名服务器(caching forwardingnameserver)。但是这是一个很庞大的程序,除非你需要它高级功能,否则还是使用上面提到的那些程序比较好。
所有这些软件包都能和 resolvconf
一起工作。
bind
如果你希望给一个域提供一个权威的域名服务的话,你就需要一个完善的域名服务器,例如软件包bind9
中的 named
。
如果你安装了 bind9
,你也应该安装dnsutils
。 你可能还需要安装这样一些工具软件包:bind9-host
; dns-browse
;dnscvsutil
; nslint
。你可能还需要安装说明文档: bind9-doc
。你可能还需要安装开发文档: libbind-dev
;libnet-dns-perl
。
安装 bind9
或者用 dpkg-reconfigure
bind9
来进行基本的设置。设置包括编辑文件name
。在 Debian 中,你可以在 /etc/bind/
找到这个文件,它主要是用来设置基本的 DNS域的;它包含了其他两个文件:named.conf.local
,用来定义本地区域,和named.conf.options
,用来设置选项的。(后者的执行需要resolvconf
来产生 /var/run/bind/named.options
文件,除了 forwarders的说明是一个当前可用的非本地域名服务器列表之外,其余都和原先的一样。要利用这个,可以修改named.conf
中的 include 这一样,使其包含/var/run/bind/named.options
。参阅管理域名服务器信息 –resolvconf
, 第 10.4.2 节。)
在 named.conf*
文件中用到的数据库文件,如果没有指定完整的路径,则该数据库文件会被存储在/var/cache/bind/
。这是一个正确的存储 named
产生的文件的地方。例如:某个域的从服务器使用的数据库文件。/etc/bind/
下面的那些静态的数据库文件,需要在 named.conf
中有完整的路径才能被找到。详情参阅 file:///usr/share/doc/bind9/README.Debian.gz
。
底层的网络接口设置可以用 Dynamic Host Configuration Protocol (DHCP)来自动设置。你的防火墙或路由器或宽带 ISP可能用这个方法来配置 IP 地址和其他参数。
要做这个工作你必须安装下列软件包的其中一个:
dhcp3-client
(version 3, Internet Software Consortium)
dhcpcd
(Yoichi Hariguchi and Sergei Viznyuk)
pump
(Red Hat)
pump
简易且被广泛应用。 dhcp3-client
复杂,但是可配置程度更高。 [54]
ifupdown
进行高级网络设置为了让网络设置更加简单,Debian提供了一个标准的高级网络设置工具,包含 ifup
和ifdown
程序和 /etc/network/interfaces
文件。[55] 如果你选择用ifupdown
来配置你的网络,那么就不要同时使用底层工具去配置。这也意味着你不应该用其他高级配置工具,如whereami
、divine
、intuitively
等。他们调用的也是底层配置工具。ifupdown
程序在设计的时候,是假设仅有这样一个程序会被用来设置网络接口的。
更新接口设置是执行:
# ifdown eth0 # editor /etc/network/interfaces # 做你需要的调整 # ifup eth0
更多信息参阅 interfaces(5)
、 file:///usr/share/doc/ifupdown/examples/network-interfaces.gz
和 ifup(8)
。
假设你要配置一个以太网接口,使其拥有一个固定的 IP 地址192.168.0.111。这个 IP 地址以 192.168.0为开头,所以它肯定在一个 LAN 内。进一步假设192.168.0.1 是 LAN 上面 Internet 网关的地址。编辑/etc/network/interfaces
,使其包含类似下面这段的内容:
iface eth0 inet static address 192.168.0.111 netmask 255.255.255.0 gateway 192.168.0.1
在接口被激活或是在激活之前,你都可以配置接口的其他部分或者进行其他操作。只要你在"up"和"down"那几行中设置合适的命令。
iface eth0 inet static address 192.168.0.111 netmask 255.255.255.0 gateway 192.168.0.1 up route add -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.0.2 dev $IFACE down route del -net 10.0.0.0 netmask 255.0.0.0 gw 192.168.0.2 dev $IFACE up echo Interface $IFACE going up | /usr/bin/logger -t ifup down echo Interface $IFACE Going down | /usr/bin/logger -t ifdown
你也可以选择把命令插入到 /etc/network/if-up.d
和/etc/network/if-down.d
目录下的脚本中。这些脚本也能执行扩展的选项。详情参阅interfaces(5)
。例如,软件包 resolvconf
包含的脚本允许你在接口被激活的同时,往/etc/resolv.conf
添加指定的 DNS 信息:
iface eth0 inet static address 192.168.0.111 netmask 255.255.255.0 gateway 192.168.0.1 dns-search somedomain.org dns-nameservers 195.238.2.21 195.238.2.22
dns-search 选项的参数 somedomain.org 符合resolv.conf(5)
中所说的 search 选项的参数。dns-nameservers 选项的参数 195.238.2.21 和195.238.2.22 符合选项 nameserver的参数。其他可以识别的选项是 dns-domain 和dns-sortlist。参阅管理域名服务器信息 –resolvconf
, 第 10.4.2 节。
为了使用 DHCP 配置接口,请编辑/etc/network/interfaces
,使其包含一下这段内容:
iface eth0 inet dhcp
为了让 DHCP 能工作,你需要安装一个使用DHCP 来配置网络接口, 第 10.5 节中提及的 DHCP客户端程序。
软件包 wireless-tools
包含了一个钩子脚本/etc/network/if-pre-up.d/wireless-tools
,使得在接口被激活之前,对无线网卡(802.11a/b/g)进行设置变为可能。使用iwconfig
程序来完成设置,参阅iwconfig(8)
。任何一个 iwconfig
的有效参数,你都可以把它包含在/etc/network/interfaces
中,并在原有的参数名字前加上“wireless-”这个前缀。例如,要设置eth0, 使得 eth0 在被 DHCP 激活之前, ESSID设定为 myessid,encryption key 设定为123456789e,请编辑/etc/network/interfaces
,加入一下这段内容:
iface eth0 inet dhcp wireless-essid myessid wireless-key 123456789e
注意!如果你使用 waproamd
来设置这个接口的话,你不应该使用这个方法来设置 ESSID 和key。在 ifup
执行时,waproamd
就已经设置好了 ESSID 和 key。参阅使用 waproamd
启动网络设置, 第10.8.4 节。
如果你遇到了问题,首先执行下列命令来检查输出的结果:
# ifconfig # cat /proc/pci # cat /proc/interrupts # dmesg | more