1、UNIX 网络分析理解 UNIX 系统网络配置通过使用各种不同的工具,您可以深入地了解自己的网络。如果希望了解网络的布局、数据包的目的地以及操作者,就需要使用不同的工具来帮助您描绘一幅网络结构图,从中了解网络以及将要发生事情。本教程探讨了一些技巧,可以帮助监视 UNIX 网络的通信量和内容,以及在网络上发现和诊断问题。开始之前本教程面向有以下需求的 UNIX 系统管理员:他们需要找到一些方法来发现和判断有关其网络结构和配置的信息,包括各个机器上允许的服务和系统有哪些。要从本教程获得最大的收益,您应当具有 UNIX 操作系统的基本知识,以及基本了解网络和 Internet 协议 (IP) 的运作
2、方式。关于本教程在访问一个 UNIX 系统时,甚至是了解现有系统时,有关系统如何运行的一个关键部分就是网络配置。您需要清楚并了解网络的许多方面,以便正确地识别问题并防患于未然。通过使用一些基本的工具和命令,可以确定单个系统的大量配置,理解了这些知识后,就可以很好地确定网络其余部分的配置。通过一些额外的工具,可以将知识扩展到网络中的更多的系统和服务。在本教程中,您将在 UNIX 环境中使用一些基本的工具,挖掘有关系统配置的信息。通过理解这些工具并使用它们获得的信息,您将能够更好地理解系统网络配置和它的工作原理。您还将研究可以涵盖更广泛网络的工具和解决方案,获得有关网络的更详细的信息、其潜在的安全
3、问题,这有助于找出和诊断问题的关键信息点。回页首理解主机的网络配置要更好地理解网络,第一步是理解当前使用的机器的网络配置。这将为您提供许多参考基准,比如当前主机的 IP 地址、DNS 配置以及可以连接并与之通信的其他机器。查找配置信息确定正在使用的机器的当前配置可以使您获得对环境的基本了解。您的第一个任务是确定当前机器的 IP 地址和网络掩码(mask)。通过这两个值,可以确定机器的地址,以及可以与之直接在网络上建立连接的其他机器(比如,不需要使用路由器)。在确定 IP 地址之前,通过使用 hostname 命令获得系统的主机名(参见清单 1)。清单 1. 获得主机名$ hostnamesul
4、aco在选择-a选项时,ifconfig 命令将显示所有已配置的网络设备的当前配置信息。例如,清单 2 展示了 ifconfig 命令在一台 Solaris 机器上的输出。清单 2. ipconfig 在 Solaris 上的输出$ ifconfig -alo0: flags=2001000849 mtu 8232 index 1 inet 127.0.0.1 netmask ff000000 pcn0: flags=201004843 mtu 1500 index 2 inet 192.168.1.25 netmask fffffc00 broadcast 192.168.3.255lo0:
5、 flags=2002000849 mtu 8252 index 1 inet6 :1/128 pcn0: flags=202004841 mtu 1500 index 2 inet6 fe80:20c:29ff:fe7f:dc5/10从这个输出中可以看到,有一个回路(loopback)设备 lo0,本地主机的地址为 127.0.0.1。还可以看到,这个设备还有一个等效的 IPv6 地址。pcn0 设备的配置如下:网络地址为 192.168.1.25,网络掩码为 fffffc00,相当于 255.255.252.0。可以看到,在这里地址是使用 DHCP 设置的(从 DHCP 标记列表)。网络掩
6、码非常重要,只要知道了网络掩码,就可以知道所在网络的大小(通过注册的 IP 地址)。在本例中,255.255.252.0 等同于 4 类 C 地址,因为 256(最大主机数)减去 252 (使用了掩码的主机数)等于 4。通过同时使用掩码和配置后的 IP 地址,可以推测出本地网络中 IP 地址的范围。由于 IP 区块通常按照完整的组进行划分,并且是按顺序进行的,因此可以推测出整个网络中分布的 IP 地址的范围为从 192.168.0.0 到 192.168.3.255。您可以得出这一结论,因为使用 4 类 C 地址,您通常会将整个范围(192.168.0.0-192.168.255.255)划分
7、为相等的区块 其中地址前缀 192.168.1.x 必须位于 4 个地址中的第一个区块中。不同的操作系统使用不同的方式输出信息(和细节)。清单 3 展示了一个 Linux 系统的输出。清单 3. Linux 系统的输出eth0 Link encap:Ethernet HWaddr 00:1d:60:1b:9a:2d inet addr:192.168.0.2 Bcast:192.168.3.255 Mask:255.255.252.0 inet6 addr: fe80:21d:60ff:fe1b:9a2d/64 Scope:Link UP BROADCAST RUNNING MULTICAST
8、 MTU:1500 Metric:1 RX packets:2371085881 errors:36 dropped:0 overruns:0 frame:36 TX packets:2861233776 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:913269364222 (850.5 GiB) TX bytes:3093820025338 (2.8 TiB) Interrupt:23 Base address:0x4000 lo Link encap:Local Loopback
9、 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:279755697 errors:0 dropped:0 overruns:0 frame:0 TX packets:279755697 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:388038389807 (361.3 GiB) TX bytes:388038
10、389807 (361.3 GiB)清单 4 展示了 Mac OS X 系统的输出。清单 4. Mac OS X 系统的输出lo0: flags=8049 mtu 16384 inet6 fe80:1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 inet6 :1 prefixlen 128 gif0: flags=8010 mtu 1280stf0: flags=0 mtu 1280en0: flags=8863 mtu 1500 inet 192.168.0.101 netmask 0xfffffc00 bro
11、adcast 192.168.3.255 ether 00:16:cb:a0:3b:cb media: autoselect (1000baseT ) status: active supported media: autoselect 10baseT/UTP 10baseT/UTP 10baseT/UTP 10baseT/UTP 100baseTX 100baseTX 100baseTX 100baseTX 1000baseT 1000baseT 1000baseT nonefw0: flags=8822 mtu 2030 lladdr 00:17:f2:ff:fe:7b:84:d6 med
12、ia: autoselect status: inactive supported media: autoselect en1: flags=8822 mtu 1500 ether 00:17:f2:9b:3d:38 media: autoselect () supported media: autoselecten5: flags=8963 mtu 1500 inet6 fe80:21c:42ff:fe00:8%en5 prefixlen 64 scopeid 0x7 inet 10.211.55.2 netmask 0xffffff00 broadcast 10.211.55.255 et
13、her 00:1c:42:00:00:08 media: autoselect status: active supported media: autoselecten6: flags=8963 mtu 1500 inet6 fe80:21c:42ff:fe00:9%en6 prefixlen 64 scopeid 0x8 inet 10.37.129.2 netmask 0xffffff00 broadcast 10.37.129.255 ether 00:1c:42:00:00:09 media: autoselect status: active supported media: aut
14、oselect在任何情况下,通常都可以找到所连接的网络设备的 Internet 地址和掩码。显然,如果拥有多个网络设备,那么可以在输出中获得有关每个设备的信息,并且有可能从一个机器中访问各种不同的网络和系统。查找名称解析服务下一步是确定当前机器的配置,这个配置应当与名称服务系统的配置关联起来,名称服务将在您访问另一台机器上的服务时将系统的名称和域名转换为 IP 地址。大多数机器上的这一配置是通过 /etc/nsswitch.conf 文件实现的,该文件包含了各种命名服务(主机、用户等等)以及使用各种服务(DNS、NIS 或本地文件)进行解析的顺序。可以参见清单 5。清单 5. 解析名称服务系统
15、passwd: filesgroup: fileshosts: files dns ipnodes: files dnsnetworks: filesprotocols: filesrpc: filesethers: filesnetmasks: filesbootparams: filespublickey: filesnetgroup: filesautomount: filesaliases: filesservices: filesprinters: user filesauth_attr: filesprof_attr: filesproject: filestnrhtp: file
16、stnrhdb: files例如,在清单 5 中,首先解析主机名信息:在系统中查找本地文件(比如 /etc/hosts),然后再查找域名系统(DNS)。如果 DNS 已经进行了配置,那么 /etc/resolv.conf 文件将告诉您使用哪些机器来将名称转换为 IP 地址。清单 6 展示了一个样例文件。清单 6. 哪些机器将名称转换为 IP 地址domain example.prinameserver 192.168.0.2nameserver 192.168.0.3如果希望直接对机器查询信息,那么这些信息很有用。可以使用 dig 和 nslookup 等工具提取有关名称服务和名称解析以及 I
17、P 地址的信息。检查路由网络以外的主机(即与当前 IP 地址相比,超出了网络掩码的范围之外)被发送到一个路由器,从路由器转发到另一台机器。路由器可以在任何一级网络上使用,包括部门之间、不同物理位置,以及 Internet 之类的公共和外部站点。netstat 命令将告诉您,当您的机器希望与 “本地” 网络以外的机器通信时,将与那些机器或路由器建立联系。例如,下面的清单 7 来自于一台 Solaris 机器。清单 7. netstat 命令$ netstat -rRouting Table: IPv4 Destination Gateway Flags Ref Use Interface - -
18、 - - - - default voyager.example.pri UG 1 139 pcn0 192.168.0.0 solaris2.example.pri U 1 447 pcn0 solaris2 solaris2 UH 1 35 lo0 Routing Table: IPv6 Destination/Mask Gateway Flags Ref Use If - - - - - - fe80:/10 fe80:20c:29ff:fe7f:dc5 U 1 0 pcn0 solaris2 solaris2 UH 1 0 lo0默认路由显示,网关(路由器)过去路由的数据包可以是在当前
19、网络之外的,或者是还没有被另一个路由针对特定 IP 地址或 IP 地址范围进行转换的。由于可能需要在当前名称服务不可用或者没有返回正确信息的情况下确定这些消息,您还可以指定 -n 选项来使用 IP 地址而不是名称来显示信息。检查受支持的服务netstat 命令也可用于确定在当前主机上被共享和公开的服务有哪些。这包括所有网络服务、包括 DNS、NFS、Web 服务和其他信息。显示的信息基于打开的并正在 “侦听” 客户机连接的端口,或已经打开并且与客户机进行通信的端口。这些信息非常宝贵,它可以确定某个服务是否正在运行,并且可以作为标准安全检查的一部分,确定某个机器是否正在共享或公开本身并且带来了更
20、多风险。可以查看清单 8 所示的示例输出,这里使用-a显示所有打开的端口和服务,它们都已经被建立(公开)并侦听新的连接。默认情况下,netstat 还展示打开的 UNIX 域 socket,它只能由当前机器访问。考虑到简洁性,这些内容已经从输出中移除。清单 8. 使用-a的输出$ netstat -aActive Internet connections (servers and established)Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:imaps *:* LISTEN tcp 0 0 *:nfs
21、 *:* LISTEN tcp 0 0 *:vmware-authd *:* LISTEN tcp 0 0 localhost:10024 *:* LISTEN tcp 0 0 localhost:10025 *:* LISTEN tcp 0 0 *:mysql *:* LISTEN tcp 0 0 *:imap *:* LISTEN tcp 0 0 localhost:783 *:* LISTEN tcp 0 0 *:sunrpc *:* LISTEN tcp 0 0 bear.example.pri:http *:* LISTEN tcp 0 0 *:cisco-sccp *:* LIST
22、EN tcp 0 0 *:47506 *:* LISTEN tcp 0 0 *:34452 *:* LISTEN tcp 0 0 172.16.217.1:domain *:* LISTEN tcp 0 0 192.168.92.1:domain *:* LISTEN tcp 0 0 bear.example.pri:domain *:* LISTEN tcp 0 0 localhost:domain *:* LISTEN tcp 0 0 *:53941 *:* LISTEN tcp 0 0 *:3128 *:* LISTEN tcp 0 0 localhost:rndc *:* LISTEN
23、 tcp 0 0 *:smtp *:* LISTEN tcp 0 0 bear.example.pri:imap sulaco.example.p:65452 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65459 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65412 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65417 ESTABLISHEDtcp 0 0 bear.exam
24、ple.pri:mysq bear.example.pri:35475 TIME_WAIT tcp 0 0 bear.example.pri:http sulaco.example.p:49603 FIN_WAIT2 tcp 0 0 bear.example.pri:nfs sulaco.example.p:49552 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65433 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65431 ESTABLISHED
25、tcp 1 0 bear.example.pri:nfs sulaco.example.p:51900 CLOSE_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65415 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65475 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65472 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.
26、p:65429 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65430 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65438 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65443 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65418 ESTABLISHEDtcp 0 0 bear.example.pri:
27、nfs narcissus.exampl:62968 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65448 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65423 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65468 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65445 ESTABLISHEDtcp 0
28、0 bear.example.pri:imap sulaco.example.p:65476 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65453 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65456 ESTABLISHEDtcp 1 0 bear.example.pri:nfs sulaco.example.p:59172 CLOSE_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65416 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65439 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65441 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65446 ESTABLISHEDtcp 0 0 bear.example.pri:imap sulaco.example.p:65470 ESTABLISHEDtcp 0 0 bear.ex