本教程是 7 篇介绍 Linux® 上网络管理系列教程的第 1 篇。在本教程中,David Mertz 将向您介绍如何配置基本的 TCP/IP 网络,内容从硬件层(通常是以太网、modem、ISDN 或 802.11)到网络地址的路由。后续教程中将介绍对这些配置网络进行操作的高级服务器。
关于网络配置
在考虑 Linux 的网络和网络配置时,记住 OSI 7 层参考模型 是非常有用的:
YBeLinux联盟
图 1. OSI 7 层参考模型YBeLinux联盟
YBeLinux联盟

我们所说的 “网络配置” 实际上就存在于第二层和第三层上(也就是数据链路层(Data Link Layer) 和网络层(Network Layer))以及这两层之间的接口上。实际上,对于数据链路层来说这就相当于以太网或 modem 之类的串口,对于网络层来说就相当于 Internet 协议(IP)。本系列的后续教程将介绍更高的层,不过所讨论的大部分应用程序都没有明显地划分开这 7 层(甚至连我们可以操作的上面 4 层也划分得不是很严格)。
第一个网络层是物理层(Physical Layer),这是实际的线路(或无线通道)和电路。有经验的网络管理员应该可以随时检查线缆并可以安装新的网络设备(但是这些问题都已经超出了本教程的范围)。然而,线缆松动、以太网卡活动或被错误地拔出都像软件配置不当一样会产生网络问题。
第四层是传输层(Transport Layer);具体来说,在 IP 网络中这就意味着 TCP 或 UDP。TCP 和 UDP 由 Berkeley Socket 接口在高层使用,在所有的现代计算机系统中都可以找到经过良好测试的库。有关应用程序(例如本系列教程后面所讨论的服务)如何使用 TCP 和 UDP 的知识,请参阅教程 “Programming Linux sockets, Part 1” 和 “Programming Linux sockets, Part 2”。
其他资源
像大部分 Linux 工具一样,manpage 中都包含了非常有价值的信息。 有关更多的深入信息,Linux Documentation Project 中就提供了很多有用的文档,特别是 HOWTO 文档。还有很多有关 Linux 网络的书籍也都非常有用,例如 O'Reilly 的 TCP/IP Network Administration(Craig Hunt 著)。在本教程的 参考资料 一节中,可以找到更多的资源和链接。
基本的网络配置
地址解析协议
理解有关以太网设备(802.11a/b/g 无线或更传统的 CAT5/CAT6 有线网络)的第一件事情是每个以太网设备都有一个惟一的 6 个字节的 ID。这些 ID 都是成组分配给制造厂商的;您可以在 IANA 上查看以太网号码的分配。以太网通常 “只在硬件级上工作”,但是系统需要将以太网 ID 映射为一个 IP 地址,然后使用这个 IP 地址来启用 IP 网络。
地址解析协议(Address Resolution Protocol,ARP)让机器可以找到局域以太网中的其他 IP 地址。作为一种协议,ARP 通常都是在网络设备驱动程序(内核模块)中实现的;arp 工具让我们可以检查 ARP 系统的状态,并按照某种方法来利用这些信息。现在,我们假设每台机器都配置为知道自己的 IP 地址,这可以通过静态分配或使用 DHCP 动态分配来实现。
当一个 Linux 系统(或任何具有以太网功能的设备)希望定位一个 IP 地址时,它就会使用以太网广播地址发送一条 ARP 请求消息:“谁是 X.X.X.X,告诉 Y.Y.Y.Y”。目标系统会组成 ARP 响应 “X.X.X.X 是 hh:hh:hh:hh:hh:hh”,并将其发送给请求主机。ARP 响应会在 /proc/net/arp 中缓存很短的时间,从而避免需要持续重建硬件以太网地址与 IP 地址之间的映射。
arp 工具
Linux 工具 arp 让我们可以检查并修改 ARP 映射的状态。简单的状态报告可能如清单 1 所示:
YBeLinux联盟
清单 1. ARP 状态报告YBeLinux联盟
$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.2.1 ether 00:03:2F:09:61:C7 C eth0
|
YBeLinux联盟
这告诉我们,网络上有一个特定的硬件设备被分配了 IP 地址 192.168.2.1(这里的数字让我们联想起路由器/网关,在本例中就是这样的)。此处只列出了这一个映射,但这并不意味着在本地网络上不存在其他的网络设备,而是仅仅说明其他设备的 ARP 记录都已经过期了。ARP 在很短时间之后就会过期 —— 用分钟而不是小时或秒来计时 —— 这样如果在网络上增加或减少了机器,或者对机器的设置发生了变化,网络就可以重新进行配置。通过将 ARP 记录缓存一段很短的时间,在客户机/服务器应用程序的会话过程中可能就不需要进行新的请求。
对局域网上的主机发出的任何种类的 IP 请求都会导致内核发出一个 ARP 请求;如果接收到了 ARP 响应,就将这个主机添加到 ARP 缓存中去(如清单 2 所示):
YBeLinux联盟
清单 2. 与其他 IP 地址进行交互YBeLinux联盟
$ ping -c 1 192.168.2.101 > /dev/null
$ ping -c 1 192.168.2.101 > /dev/null
$ ping -c 1 192.168.2.102 > /dev/null
$ ping -c 1 192.168.32.32 > /dev/null
$ ping -c 1 192.168.32.32 > /dev/null
$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.2.1 ether 00:03:2F:09:61:C7 C eth0
192.168.2.101 ether 00:30:65:2C:01:11 C eth0
192.168.2.100 ether 00:11:24:9D:1E:4B C eth0
192.168.2.102 ether 00:48:54:83:82:AD C eth0
|
YBeLinux联盟
在本例中,前 4 个地址都的确存在于本地以太网上,但是 192.168.32.32 则不存在,因此就不会接收到 ARP 响应。注意通过非本地路由可以成功连接到的地址不会在 ARP 缓存中增加任何内容(请参阅清单 3):
YBeLinux联盟
清单 3. 不会向 ARP 缓存中增加任何内容YBeLinux联盟
$ ping -c 1 google.com
PING google.com (216.239.57.99) 56(84) bytes of data.
64 bytes from 216.239.57.99: icmp_seq=1 ttl=235 time=109 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 109.123/109.123/109.123/0.000 ms
$ arp -n
Address HWtype HWaddress Flags Mask Iface
192.168.2.1 ether 00:03:2F:09:61:C7 C eth0
|
YBeLinux联盟
Google 是可达的(因为已经配置好了路由),但是 216.239.57.99 不是一个本地地址,因此不会向 ARP 添加任何内容。在本系列教程的第 7 篇有关主题 214 的文章中,会介绍网络故障诊断的知识,并展示如何手动设置 ARP。 YBeLinux联盟
PPP、PAP 和 CHAP
点到点协议(PPP)用来通过拨号 modem、直接串口连接、DSL 以及其他类型的点到点的链接来建立 Internet 连接(有时还包括 PPPoE,这是一个在以太网之上的伪层,其功能超过了握手协议)。pppd 守护进程可以与内核的 PPP 驱动程序一起与另外一个系统(称为 “对等方(peer)”)建立并维护一条 PPP 连接,并对该连接的两端协商 Internet 协议(IP)地址。
PPP,具体来说是 pppd,对对等方进行认证,并向它提供认证信息。这种认证可以使用简单的密码系统 PAP(Password Authentication Protocol)或者基于每个会话的 CHAP(Challenge Handshake Authentication Protocol)进行。对于这两种协议来说,如果两端都可以支持,那么 CHAP 更加安全。
PPP 的选项通常保存在 /etc/ppp/options 中。PAP 的配置可以通过 PAP 秘密文件 /etc/ppp/pap-secrets 进行;对于 CHAP 来说,这些选项则保存在 CHAP 秘密文件 /etc/ppp/chap-secrets 中。YBeLinux联盟
PAP/CHAP 秘密文件
/etc/ppp/pap-secrets 文件中包含了使用空格分隔的字段,分别用于客户机、服务器、密码 以及可以接受的本地 IP 地址。最后一个字段可能为空(通常这是为动态 IP 分配而设置的)。应该针对每个对等方分别配置 PAP 秘密文件。尽管 PPP 是一种对等协议,但是为了连接的目的,我们称请求连接机器为客户机,称等待连接的机器为服务器。例如,我的网络上的 bacchus 这台机器的配置如下:
YBeLinux联盟
清单 4. bacchus 上 pap-secrets 文件的配置YBeLinux联盟
# Every regular user can use PPP and uses passwords from /etc/passwd
# INBOUND connections
# client server secret acceptable local IP addresses
* bacchus "" *
chaos bacchus chaos-password
# OUTBOUND connections
bacchus * bacchus-password
|
YBeLinux联盟
机器 bacchus 可以接受普通用户的连接以及来自机器 chaos 上的连接(后一种情况需要使用密码 chaos-password )。对于其他机器来说,bacchus 会简单地使用自己的名字并向每个对等方提供密码 bacchus-password。
我的网络上机器 chaos 的配置如下:=
YBeLinux联盟
清单 5. 机器 chaos 对于连接的选择更加保守YBeLinux联盟
# client server secret acceptable local IP addresses
chaos bacchus chaos-password
bacchus chaos bacchus-password
|
YBeLinux联盟
机器 chaos 对于那些想要连接上来的客户机的要求更加严格。它只希望与 bacchus 交换凭证。不过您可以配置每个 /etc/ppp/options 文件来决定是否需要凭证。
使用 CHAP 秘密文件要求您允许两个对等方机器可以彼此进行认证。只要在 PAP 秘密文件中配置了双向认证,CHAP 秘密文件就可能看起来与上面的例子相同了。YBeLinux联盟
YBeLinux联盟
使用 mgetty 进行连接
PAP 秘密文件可以与 mgetty 的 AUTO_PPP 功能一起使用。mgetty 0.99+ 预先配置为使用 login 选项来启动 pppd。这告诉 pppd 在用户传递这个文件之后来查询 /etc/passwd(以及 /etc/shadow )文件。
通常,getty 程序会被配置为允许来自串口设备的连接,包括 modem 和直接串口。例如,对于硬件线路和控制台 tty 来说,可以在 inittab 中运行:
/sbin/getty 9600 ttyS1
对于老式的采用 9600/2400/1200 波特 modem 的拨入线路来说,可以使用:
/sbin/getty -mt60 ttyS1 9600,2400,1200。YBeLinux联盟
YBeLinux联盟
路由配置
在对地址解析协议的讨论中,我们已经看到在局域网中是如何分配 IP 地址的。然而,为了与局域网外部的机器进行通信,还必须要使用一个网关/路由器。基本来说,网关就是一台连接多个网络的机器,因此可以把在一个网络上传输的报文重新发送到所连接的其他网络上去。这就是 “Internet” 这个名字的由来:它是一个 “网络的网络”,其中每个网关最终都可以连接到声明是 “在 Internet 上” 的其他网络上。
在本教程的第 5 篇教程中,介绍的是主题 210 的内容,其中介绍了网络客户机的管理,并对 DHCP 进行了讨论。DHCP 将分配客户机 IP 地址和网关地址。然而,在具有固定 IP 地址的客户机或调试环境中,Linux 命令 route 可以用来查看并修改路由表。新的命令 ip 让我们还可以使用更强大的语法来修改路由表。
路由表可以用来简单地确定要将报文发送到哪个网关或主机上,它在地址中使用了一种特定的模式。地址模式是使用地址和子网掩码 的组合来指定的。子网掩码是一种位模式,通常使用点号分隔开的 4 部分数字来表示,这告诉内核要将目标中的哪些位当作子网。命令 ip 可以接收更简单的 /NN 格式当作位掩码。通常,在掩码和地址中,0 位就表示 “通配符”。
例如,具有外部网关的简单网络地址可能具有一个类似于清单 6 所示的路由表:
YBeLinux联盟
清单 6. 典型的简单路由表YBeLinux联盟
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
|
YBeLinux联盟
这个路由表的意义非常简单:任何可以匹配 “192.168.2.*” 模式的 IP 地址都在局域网上,它们会被直接转发到适当的主机上(使用 ARP 进行解析)。其他任何地址都会被发送到网关 “192.168.2.1” 上,这对于正确转发报文来说是需要的。机器 192.168.2.1 必须要连接到一个或多个外部网络上。
然而,对于更复杂的情况来说,您可以采用不同的路由模式。在下面这个有点创造性的例子中,让我们假设您希望通过其他网关来路由 /16 子网的地址。您可以使用清单 7 中给出的方法:
YBeLinux联盟
清单 7. 修改 /16 网络的路由YBeLinux联盟
$ route add -net 216.109.0.0 netmask 255.255.0.0 gw 192.168.2.2
$ route add -net 216.239.0.0 netmask 255.255.0.0 gw 192.168.2.3
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
216.109.0.0 192.168.2.2 255.255.0.0 UG 0 0 0 eth0
216.239.0.0 192.168.2.3 255.255.0.0 UG 0 0 0 eth0
0.0.0.0 192.168.2.1 0.0.0.0 UG 0 0 0 eth0
|
YBeLinux联盟
“216.109.*” 和 “216.239.*” 格式的地址现在分别通过网关 192.168.2.2 和 192.168.2.3 进行路由(它们都在局域网上)。局域网上的地址和这个模式范围之外的地址都像以前一样进行路由。您可以使用命令 route delete 删除对应的路由。
高级网络配置和故障诊断
关于网络工具
Linux 中提供了很多标准工具,可以用来对网络配置进行定制和故障诊断。尽管很多 Linux 网络代码都是在内核本身中,但是大部分网络的行为都是可以通过命令行工具来配置的。大部分发行版中都提供了高级或图形化的高级配置工具,但是这些工具几乎都可以使用命令行工具来执行或通过脚本使用。
ping 工具
检查一台 Linux 主机是否可以访问一个 IP 地址(或者一个有名主机,这要配置了 DNS 或 /etc/hosts 文件)的最基本的方法是使用 ping 工具。ping 可以在基本的 IP 层上进行操作,它不会依赖于数据链路层,例如 TCP 或 IP。ping 使用的是 ICMP(Internet 控制消息协议)。如果您使用 ping 没法访问一台主机,就可以假设也无法使用其他协议达到这台主机,因此在判断一个到某台主机的连接是否可用时,ping 总是我们采用的第一个步骤(man ping 可以给出更详细的选项)。
默认情况下,ping 会每秒发送一条消息,直到取消时为止;但是您可以修改时间间隔、限制所发送的消息的数量以及输出信息。在运行 ping 时,它会返回有关来回时间和丢包的详细信息,但是最重要的信息是我们可以 ping 一个主机是否可达。清单 8 给出了几个例子:
YBeLinux联盟
清单 8. 局域网和非局域网上 ping 的例子YBeLinux联盟
$ ping -c 2 -i 2 google.com
PING google.com (216.239.37.99): 56 data bytes
64 bytes from 216.239.37.99: icmp_seq=0 ttl=237 time=43.861 ms
64 bytes from 216.239.37.99: icmp_seq=1 ttl=237 time=36.956 ms
--- google.com ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 36.956/40.408/43.861 ms
$ ping 192.168.2.102
PING 192.168.2.102 (192.168.2.102): 56 data bytes
64 bytes from 192.168.2.102: icmp_seq=0 ttl=255 time=4.64 ms
64 bytes from 192.168.2.102: icmp_seq=1 ttl=255 time=2.176 ms
^C
--- 192.168.2.102 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 2.176/3.408/4.64 ms
|
YBeLinux联盟
ifconfig 工具
网络接口可以使用 ifconfig 工具来配置。通常,这可以作为初始化过程的一部分来运行,但是在有些情况中,接口可以稍后再进行修改和优化(尤其是对于调试来说更是如此)。如果不使用任何开关来运行 ifconfig 命令,就会显示网络接口的当前状态。您可以使用 ifconfig <interface> up 和 ifconfig <interface> down 格式的命令来启动和停止网络接口。有些其他开关可以更改所显示的内容,或者限定为只显示特定接口。详细信息请参阅 man ifconfig 的信息。
所显示的信息可能如清单 9 所示:
YBeLinux联盟
清单 9. 使用 ifconfig 来检查网络接口的状态YBeLinux联盟
$ ifconfig
eth0 Link encap:Ethernet HWaddr 00:12:F0:21:4C:F8
inet addr:192.168.2.103 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::212:f0ff:fe21:4cf8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:540 errors:0 dropped:0 overruns:0 frame:0
TX packets:233 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:1000
RX bytes:49600 (48.4 KiB) TX bytes:42067 (41.0 KiB)
Interrupt:21 Base address:0xc000 Memory:ffcfe000-ffcfefff
ppp0 Link encap:Point-Point Protocol
inet addr:10.144.153.104 P-t-P:10.144.153.51 Mask:255.255.255.0
UP POINTOPOINT RUNNING MTU:552 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0
TX packets:0 errors:0 dropped:0 overruns:0
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:4043 errors:0 dropped:0 overruns:0 frame:0
TX packets:4043 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:368044 (359.4 KiB) TX bytes:368044 (359.4 KiB)
|
YBeLinux联盟
在所显示的信息中,配置了两个网络:一个在以太网上,另外一个在 PPP 上(还有一个本地回环)。在其他情况中,您可能配置了多个以太网接口,或者使用了其他的接口类型。如果是这样,这个系统就称为多宿主 系统。
netstat 工具
Linux 工具通常在功能上都有些重叠。netstat 显示的信息也可以通过其他工具来提供,例如 ifconfig 和 route。使用 netstat 还可以看到有关网络行为的很多的通用信息。例如:
YBeLinux联盟
清单 10. 网络统计报告YBeLinux联盟
$ netstat -s
Ip:
12317 total packets received
0 forwarded
0 incoming packets discarded
12255 incoming packets delivered
11978 requests sent out
Icmp:
1 ICMP messages received
0 input ICMP message failed.
ICMP input histogram:
echo replies: 1
0 ICMP messages sent
0 ICMP messages failed
ICMP output histogram:
Tcp:
7 active connections openings
5 passive connection openings
0 failed connection attempts
0 connection resets received
3 connections established
11987 segments received
11885 segments send out
0 segments retransmitted
0 bad segments received.
3 resets sent
Udp:
101 packets received
0 packets to unknown port received.
0 packet receive errors
92 packets sent
TcpExt:
1 TCP sockets finished time wait in fast timer
1490 delayed acks sent
Quick ack mode was activated 5 times
3632 packets directly queued to recvmsg prequeue.
126114 of bytes directly received from backlog
161977 of bytes directly received from prequeue
1751 packet headers predicted
3469 packets header predicted and directly queued to user
17 acknowledgments not containing data received
4696 predicted acknowledgments
0 TCP data loss events
|
YBeLinux联盟
其他工具
对于网络配置来说,您应该了解其他几个工具。通常,相关的手册页中都包含了完整的使用信息。有关这些内容的详细讨论都在本系列教程第 7 篇介绍主题 214 的文章中进行介绍,其中详细介绍了网络故障诊断的处理。
tcpdump 可以监视通过网络接口的所有报文,也可以将所监视的报文限制到特定的网络接口上,或者根据不同的条件进行过滤。通常我们先保存该报文的摘要信息,然后使用文本处理工具对其进行过滤或摘要,这对于调试网络问题来说非常有用。例如,您可以查看与一个特定远程主机进行通信的报文。
lsof 可以显示在一个运行的 Linux 系统上打开的所有文件。但是具体来说,您可以使用 lsof -i 选项来查看特定 IP 连接或通用的网络连接所使用的伪文件。例如:
YBeLinux联盟
清单 11. 使用 lsof 来查看连接使用的伪文件YBeLinux联盟
$ lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE
NAME
vino-serv 7812 dqm 33u IPv4 12824
TCP *:5900 (LISTEN)
gnome-cup 7832 dqm 18u IPv4 12865
TCP localhost.localdomain:32771->localhost.localdomain:ipp (ESTABLISHED)
telnet 8909 dqm 3u IPv4 15771
TCP 192.168.2.103:32777->192.168.2.102:telnet (ESTABLISHED)
|
YBeLinux联盟
nc 和 netcat 都是别名。netcat 是一个简单的 UNIX 工具,它可以对使用 TCP 或 UDP 协议的网络连接进行读写数据。这是一个 “后端工具”,可以由其他程序和脚本直接使用或进行驱动。从很多方面来讲,netcat 都与 telnet 非常类似,但是在允许 UDP 交互和发送未过滤的二进制数据方面功能更加强大。