文明之精神,野蛮之体魄。
全部博文(64)
分类: LINUX
2013-05-24 17:20:32
开始之前
本教程面向有以下需求的 UNIX 系统管理员:他们需要找到一些方法来发现和判断有关其网络结构和配置的信息,包括各个机器上允许的服务和系统有哪些。要从本教程获得最大的收益,您应当具有 Linux/UNIX 操作系统的基本知识,以及基本了解网络和 Internet 协议 (IP) 的运作方式。
关于本教程
在访问一个Linux/UNIX 系统时,甚至是了解现有系统时,有关系统如何运行的一个关键部分就是网络配置。您需要清楚并了解网络的许多方面,以便正确地识别问题并防患于未然。通过使用一些基本的工具和命令,可以确定单个系统的大量配置,理解了这些知识后,就可以很好地确定网络其余部分的配置。通过一些额外的工具,可以将知识扩展到网络中的更多的系统和服务。
在本教程中,您将在 Linux/UNIX 环境中使用一些基本的工具,挖掘有关系统配置的信息。通过理解这些工具并使用它们获得的信息,您将能够更好地理解系统网络配置和它的工作原理。您还将研究可以涵盖更广泛网络的工具和解决方案,获得有关网络的更详细的信息、其潜在的安全问题,这有助于找出和诊断问题的关键信息点。
理解主机的网络配置
要更好地理解网络,第一步是理解当前使用的机器的网络配置。这将为您提供许多参考基准,比如当前主机的 IP 地址、DNS 配置以及可以连接并与之通信的其他机器。
查找配置信息
确定正在使用的机器的当前配置可以使您获得对环境的基本了解。您的第一个任务是确定当前机器的 IP 地址和网络掩码(mask)。通过这两个值,可以确定机器的地址,以及可以与之直接在网络上建立连接的其他机器(比如,不需要使用路由器)。
在确定 IP 地址之前,通过使用 hostname 命令获得系统的主机名(参见清单 1)。
$ hostname sulaco |
在选择 -a 选项时,ifconfig 命令将显示所有已配置的网络设备的当前配置信息。例如,清单 2 展示了 ifconfig 命令在一台 Solaris 机器上的输出。
清单 2. ipconfig 在 Solaris 上的输出
$ ifconfig -a lo0: flags=2001000849 |
从这个输出中可以看到,有一个回路(loopback)设备 lo0,本地主机的地址为 127.0.0.1。还可以看到,这个设备还有一个等效的 IPv6 地址。
pcn0 设备的配置如下:网络地址为 192.168.1.25,网络掩码为 fffffc00,相当于 255.255.252.0。可以看到,在这里地址是使用 DHCP 设置的(从 DHCP 标记列表)。
网络掩码非常重要,只要知道了网络掩码,就可以知道所在网络的大小(通过注册的 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)划分为相等的区块 —— 其中地址前缀 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 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 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:388038389807 (361.3 GiB) |
清单 4 展示了 Mac OS X? 系统的输出。
清单 4. Mac OS X 系统的输出
lo0: flags=8049 |
在任何情况下,通常都可以找到所连接的网络设备的 Internet 地址和掩码。显然,如果拥有多个网络设备,那么可以在输出中获得有关每个设备的信息,并且有可能从一个机器中访问各种不同的网络和系统。
查找名称解析服务
下一步是确定当前机器的配置,这个配置应当与名称服务系统的配置关联起来,名称服务将在您访问另一台机器上的服务时将系统的名称和域名转换为 IP 地址。
大多数机器上的这一配置是通过 /etc/nsswitch.conf 文件实现的,该文件包含了各种命名服务(主机、用户等等)以及使用各种服务(DNS、NIS 或本地文件)进行解析的顺序。可以参见清单 5。
清单 5. 解析名称服务系统
passwd: files group: files hosts: files dns ipnodes: files dns networks: files protocols: files rpc: files ethers: files netmasks: files bootparams: files publickey: files netgroup: files automount: files aliases: files services: files printers: user files auth_attr: files prof_attr: files project: files tnrhtp: files tnrhdb: files |
例如,在清单 5 中,首先解析主机名信息:在系统中查找本地文件(比如 /etc/hosts),然后再查找域名系统(DNS)。
如果 DNS 已经进行了配置,那么 /etc/resolv.conf 文件将告诉您使用哪些机器来将名称转换为 IP 地址。清单 6 展示了一个样例文件。
清单 6. 哪些机器将名称转换为 IP 地址
domain example.pri nameserver 192.168.0.2 nameserver 192.168.0.3 |
如果希望直接对机器查询信息,那么这些信息很有用。可以使用 dig 和 nslookup 等工具提取有关名称服务和名称解析以及 IP 地址的信息。
检查路由
网络以外的主机(即与当前 IP 地址相比,超出了网络掩码的范围之外)被发送到一个路由器,从路由器转发到另一台机器。路由器可以在任何一级网络上使用,包括部门之间、不同物理位置,以及 Internet 之类的公共和外部站点。
netstat 命令将告诉您,当您的机器希望与 “本地” 网络以外的机器通信时,将与那些机器或路由器建立联系。例如,下面的清单 7 来自于一台 Solaris 机器。
清单 7. netstat 命令
$ netstat -r Routing Table: IPv4 Destination Gateway Flags Ref Use Interface -------------------- -------------------- ----- ----- ---------- --------- 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 |
默认路由显示,网关(路由器)过去路由的数据包可以是在当前网络之外的,或者是还没有被另一个路由针对特定 IP 地址或 IP 地址范围进行转换的。
由于可能需要在当前名称服务不可用或者没有返回正确信息的情况下确定这些消息,您还可以指定 -n 选项来使用 IP 地址而不是名称来显示信息。
检查受支持的服务
netstat 命令也可用于确定在当前主机上被共享和公开的服务有哪些。这包括所有网络服务、包括 DNS、NFS、Web 服务和其他信息。显示的信息基于打开的并正在 “侦听” 客户机连接的端口,或已经打开并且与客户机进行通信的端口。
这些信息非常宝贵,它可以确定某个服务是否正在运行,并且可以作为标准安全检查的一部分,确定某个机器是否正在共享或公开本身并且带来了更多风险。
可以查看清单 8 所示的示例输出,这里使用 -a 显示所有打开的端口和服务,它们都已经被建立(公开)并侦听新的连接。默认情况下,netstat 还展示打开的 UNIX 域 socket,它只能由当前机器访问。考虑到简洁性,这些内容已经从输出中移除。
$ netstat -a Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 *:imaps *:* LISTEN tcp 0 0 *:nfs *:* 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 *:* LISTEN 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 tcp 0 0 *:smtp *:* LISTEN tcp 0 0 bear.example.pri:imap sulaco.example.p:65452 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65459 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65412 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65417 ESTABLISHED tcp 0 0 bear.example.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 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65433 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65431 ESTABLISHED tcp 1 0 bear.example.pri:nfs sulaco.example.p:51900 CLOSE_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65415 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65475 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65472 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65429 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65430 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65438 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65443 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65418 ESTABLISHED tcp 0 0 bear.example.pri:nfs narcissus.exampl:62968 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65448 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65423 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65468 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65445 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65476 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65453 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65456 ESTABLISHED tcp 1 0 bear.example.pri:nfs sulaco.example.p:59172 CLOSE_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65416 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65439 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65441 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65446 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65470 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65450 ESTABLISHED tcp 0 0 bear.example.pri:nfs sulaco.example.p:65320 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65465 ESTABLISHED tcp 0 0 bear.example.pri:36230 solaris2.vmbear.mcs:ssh ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65421 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65464 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65474 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:64955 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65473 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65461 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65454 ESTABLISHED tcp 0 0 bear.example.pri:http sulaco.example.p:49608 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65471 ESTABLISHED tcp 0 0 localhost:50123 localhost:ssh ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65420 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65466 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65463 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65451 ESTABLISHED tcp 0 0 bear.example.pri:35471 bear.example.pri:mysql TIME_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65457 ESTABLISHED tcp 1 0 bear.example.pri:nfs sulaco.example.p:53877 CLOSE_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65432 ESTABLISHED tcp 0 0 bear.example.pri:mysql bear.example.pri:35470 TIME_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65467 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65414 ESTABLISHED tcp 0 0 bear.example.pri:50112 bear.example.pri:imap TIME_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65462 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65460 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65469 ESTABLISHED tcp 0 0 bear.example.pri:imap sulaco.example.p:65422 ESTABLISHED tcp 0 0 bear.example.pri:50110 bear.example.pri:imap TIME_WAIT tcp 0 0 bear.example.pri:50111 bear.example.pri:imap TIME_WAIT tcp 0 0 bear.example.pri:imap sulaco.example.p:65442 ESTABLISHED tcp6 0 0 [::]:imaps [::]:* LISTEN tcp6 0 0 [::]:11211 [::]:* LISTEN tcp6 0 0 [::]:imap [::]:* LISTEN tcp6 0 0 [::]:cisco-sccp [::]:* LISTEN tcp6 0 0 [::]:ssh [::]:* LISTEN tcp6 0 0 localhost:rndc [::]:* LISTEN tcp6 0 0 [::]:https [::]:* LISTEN tcp6 0 0 bear.example.pri:ssh sulaco.example.p:52786 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:56220 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:63895 ESTABLISHED tcp6 0 0 localhost:ssh localhost:50123 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:60914 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:64669 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:56053 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:52268 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:49528 ESTABLISHED tcp6 0 0 bear.example.pri:ssh sulaco.example.p:65408 ESTABLISHED udp 0 0 *:nfs *:* udp 0 0 *:42498 *:* udp 0 0 *:54680 *:* udp 0 0 172.16.217.1:domain *:* udp 0 0 192.168.92.1:domain *:* udp 0 0 bear.example.p:domain *:* udp 0 0 localhost:domain *:* udp 0 0 *:45495 *:* udp 0 0 *:icpv2 *:* udp 0 0 *:bootps *:* udp 0 0 *:964 *:* udp 0 0 *:11211 *:* udp 0 0 *:sunrpc *:* udp 0 0 *:50042 *:* raw 0 0 *:icmp *:* 7 |
可以从这个输出中看到,机器非常忙碌。第三列显示了使用冒号分隔的主机名和端口,分别针对每个打开的连接或侦听连接。如果 TCP 或 UDP 服务号与某个已知的端口号匹配(如 /etc/services 文件中定义的那样),那么服务的名称将被显示在输出中。对于主机,将显示主机名、备用的 IP 地址或 ‘*’ 符号。星号表示服务和端口是打开的并且正在侦听所有 IP 地址。
例如,可以从输出中看到,机器被配置为支持 NFS,并且具有打开的(已经建立的)连接,如清单 9 所示。
清单 9. 机器被配置为支持 NFS
$ netstat -a|grep nfs tcp 0 0 *:nfs *:* LISTEN tcp 1 0 bear.example.pri:nfs sulaco.example.p:51900 CLOSE_WAIT tcp 0 0 bear.example.pri:nfs narcissus.example.p:62968 ESTABLISHED tcp 1 0 bear.example.pri:nfs sulaco.example.p:59172 CLOSE_WAIT tcp 0 0 bear.example.pri:nfs sulaco.example.p:65320 ESTABLISHED tcp 1 0 bear.example.pri:nfs sulaco.example.p:53877 CLOSE_WAIT udp 0 0 *:nfs *:* |
也可以使用这个输出查看哪些机器目前正在和这台机器通信。例如,可以提取一个与这台机器建立连接的机器列表,方法是查看第 5 列,进行排序并从列表中移除重复的内容(参见清单 10)。
清单 10. 提取一个已建立连接的机器列表
$ netstat -a|egrep 'tcp|udp'|grep ESTABLISHED|awk '{ print $5; }'|cut -d: -f1|sort|uniq localhost narcissus.mcslp.p nautilus.wireless polarbear.wireles solaris2.vmbear.mcs sulaco.mcslp.pri |
如果怀疑有未知的或不希望的用户或计算机连接到这台机器上,那么这些信息十分有用。
要查找关于其他机器的信息,需要查看网络上的其他计算机。
查找有关其他主机的信息
获得了有关您的机器的基本信息后,可以进一步查看网络中的其他机器,从而判断它们的可用性和提供的服务。通过使用正确的工具,甚至可以确定这些机器正在运行的操作系统和它们可能共享的服务。
检查主机
检查远程机器的最简单也是最明显的工具就是使用 ping 工具查看某个特定主机是否启动并且可用。ping 工具执行一些非常简单的操作。它将一个数据包发送给远程主机来请求一个响应。当接收到响应后,ping 工具将计算时间差异,发送并接收包所用的时间可以表明某台机器与 ping 工具当前位置的距离的远近。
例如,如果 ping 您的网络中的某台机器,那么很可能很快就会得到 ping 包的响应(参见清单 11)。
$ ping bear PING bear.mcslp.pri (192.168.0.2): 56 data bytes 64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.154 ms 64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.162 ms 64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.149 ms 64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.161 ms 64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.162 ms 64 bytes from 192.168.0.2: icmp_seq=5 ttl=64 time=0.161 ms ^C --- bear.mcslp.pri ping statistics --- 6 packets transmitted, 6 packets received, 0% packet loss round-trip min/avg/max/stddev = 0.149/0.158/0.162/0.005 ms |
ping 工具的不同实现使用不同的工作方式。在 Linux 和 Mac OS X 上,此工具在默认情况下将不断发送包并等待响应,直到使用 Control-C 强制应用程序终止。
在 Solaris?、AIX? 和其他一些 UNIX 版本中,ping 工具仅仅表示远程主机是否发出响应(参见清单 12),而没有其他进一步的动作。
$ ping bear bear is alive |
要执行更长的测试,使用 -s 选项,如清单 13 所示。
清单 13. 使用 -s 选项执行 ping
$ ping -s bear PING bear: 56 data bytes 64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=0. time=0.288 ms 64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=1. time=0.247 ms 64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=2. time=0.208 ms 64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=3. time=0.230 ms ^C ----bear PING Statistics---- 4 packets transmitted, 4 packets received, 0% packet loss round-trip (ms) min/avg/max/stddev = 0.208/0.243/0.288/0.034 |
每一行的 time 字段表示每个包的速度和延迟(发出响应之前的延迟,通常表示活动的级别)。当停止输出时,将获得所发送和接收的包的数量的汇总和时间统计数据。
ping 包所需传递的距离越远,从远程主机获得的响应时间越长。例如,如果尝试 ping Internet 中的一个公共服务器,那么获取响应包的时间将会显著增加(参见清单 14)。
清单 14. ping Internet 中的一个公共服务器
$ ping PING (67.205.21.169) 56(84) bytes of data. 64 bytes from mcslp.com (67.205.21.169): icmp_seq=1 ttl=44 time=193 ms 64 bytes from mcslp.com (67.205.21.169): icmp_seq=2 ttl=44 time=194 ms 64 bytes from mcslp.com (67.205.21.169): icmp_seq=3 ttl=44 time=197 ms 64 bytes from mcslp.com (67.205.21.169): icmp_seq=4 ttl=44 time=194 ms ^C --- ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3039ms rtt min/avg/max/mdev = 193.737/195.120/197.123/1.353 ms |
将这个连接到 Internet 服务所需的时间(193 毫秒)与连接本地主机所需时间(0.23 毫秒)进行比较。
ping 工具还可以快速判断您是否能够到达您希望连接到的远程主机。在实际上不存在的主机上运行 ping 将返回一个非常具体的错误(参见清单 15)。
$ ping notinhere PING notinhere (192.168.0.110) 56(84) bytes of data. >From bear.mcslp.pri (192.168.0.2) icmp_seq=1 Destination Host Unreachable >From bear.mcslp.pri (192.168.0.2) icmp_seq=2 Destination Host Unreachable >From bear.mcslp.pri (192.168.0.2) icmp_seq=3 Destination Host Unreachable ^C --- notinhere ping statistics --- 5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4039ms |
ping 工具需要知道网络上可用的机器有哪些。让我们看一看在不知道主机名或 IP 地址的情况下,如何判断网络上有哪些主机。
发现网络上的主机
在 Ethernet 网络系统(或其他系统)内,网络上的所有设备都具有一个与硬件网络设备相关联的惟一地址。通过使用更高级别的协议,比如可以将 MAC 地址和主机名关联起来的 Internet Protocol,Media Access Control (MAC) 数可以惟一地标识网络设备。
在网络上发送包时,操作系统将使用这种方法(以相反的方式)。当向特定主机名发送包时,操作系统试图将主机名解析为一个 MAC 地址,这样就可以构造将在网络上发送的硬件(Ethernet)包。
Address Resolution Protocol (ARP) 处理这种映射,并且可以使用 arp 工具来显示目前拥有的有关主机及主机名或 IP 地址的信息。
由于网络上的任何一台机器要与其他机器进行通信,必须使用 MAC 地址和 IP 地址发送包,系统在 ARP 缓存中收集到的信息可以有助于查明网络上其他的机器有哪些(参见清单 16)。
清单 16. 使用 arp 命令
$ arp Address HWtype HWaddress Flags Mask Iface gendarme.mcslp.pri ether 00:1B:2F:F0:39:6A C eth0 narcissus.mcslp.pri ether 00:16:CB:85:2D:15 C eth0 solaris2.vmbear.mcslp.p ether 00:0C:29:7F:0D:C5 C eth0 nautilus.wireless.mcslp ether 00:17:F2:40:4D:1B C eth0 sulaco.mcslp.pri ether 00:16:CB:A0:3B:CB C eth0 |
由于现代 Ethernet 交换机取代了旧式的 hub 结构,arp 输出的信息可能被局限于与某个特定主机之间来回传送的包。如果可以在服务器上运行 arp,那么可以获得更长的信息列表,但是这并不总是可行或实用的。
在某些网络交换机中,提供了一个网络管理或监视端口,通过这个端口的所有包都被编码,可以利用这一特性获取有关其他网络设备的信息,进而获得有关网络结构的信息。如果无法访问这类信息,需要使用更厉害的方法来查找网络中的主机。
查找网络中的其他主机
nmap 工具可以跨网络执行各种类型的扫描,从而帮助查明和判断信息的不同级别。从最基础的方面说,它可以用于查找某个给定网络中的所有主机。
本文在前面介绍了如何获得某个主机的当前 IP 地址和网络掩码信息。可以使用这个信息为 nmap 设置基本的搜索参数,从而尝试找到网络上的所有主机。要指定这一信息,必须使用 CIDR 样式的地址。CIDR 格式使用主机的 IP 地址、网络掩码中的位数来判断网络的范围。
对于示例主机,192.168.1.25 为 IP 地址,而网络掩码为 255.255.252.0。这相当于 22 位 —— 8 位用于第一部分,8 位用于第 2 部分,而 6 位用于第三部分。
使用这个地址运行 nmap 将扫描网络范围内的每一个 IP 地址(比如,192.168.0.0 和 192.168.3.255 之间的每一个地址)并判断哪些主机发出响应。
可以执行各种测试,包括使用标准 ping 工具的测试。或在 ping 协议被禁用的情况下尝试其他网络端口的更广泛的测试。例如,ping 测试显示清单 17 所示的主机列表。
清单 17. 运行 nmap 扫描 IP 地址的范围
$ nmap -sP 192.168.1.25/22 Starting Nmap 4.76 ( ) at 2009-03-24 15:59 GMT Host 192.168.0.1 appears to be up. Host bear.mcslp.pri (192.168.0.2) appears to be up. Host narcissus.mcslp.pri (192.168.0.3) appears to be up. Host 192.168.0.10 appears to be up. Host 192.168.0.27 appears to be up. Host sulaco.mcslp.pri (192.168.0.101) appears to be up. Host nautilus.wireless.mcslp.pri (192.168.0.109) appears to be up. Host 192.168.1.1 appears to be up. Host 192.168.1.25 appears to be up. Host gentoo1.vmbear.mcslp.pri (192.168.1.52) appears to be up. Host gentoo2.vmbear.mcslp.pri (192.168.1.53) appears to be up. Nmap done: 1024 IP addresses (11 hosts up) scanned in 5.78 seconds |
ping 检查使您可以很快地了解到网络上都有哪些其他机器。在这个例子中,共发现了 11 台主机,但是,并不是所有主机都可以解析回一个名称。这是 DNS 配置中一个应当被修复的错误,因为有些系统使用相反的查找(从 IP 地址到名称)作为安全检查,确保客户机 IP 地址不是伪造的。
查找网络上的其他服务
ping 检查非常有用,但是如果希望知道某台机器将自身公开给哪些服务,那么应使用 TCP 检查。TCP 检查需要花更长的时间,因为 nmap 尝试使用 TCP/IP 协议从列表的每一个主机中打开端口。这可以更有效地显示网络中有哪些主机,并且提供每个主机的打开的端口的详细信息。可以参见清单 18。
清单 18. 使用 TCP 检查
$ nmap -sT 192.168.1.25/22 Starting Nmap 4.76 ( ) at 2009-03-24 16:03 GMT Interesting ports on 192.168.0.1: Not shown: 997 closed ports PORT STATE SERVICE 80/tcp open http 8080/tcp open http-proxy 49153/tcp open unknown Interesting ports on bear.mcslp.pri (192.168.0.2): Not shown: 987 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 80/tcp open http 111/tcp open rpcbind 143/tcp open imap 443/tcp open https 902/tcp open iss-realsecure 993/tcp open imaps 2000/tcp open callbook 2049/tcp open nfs 3128/tcp open squid-http 3306/tcp open mysql Interesting ports on narcissus.mcslp.pri (192.168.0.3): Not shown: 982 closed ports PORT STATE SERVICE 22/tcp open ssh 80/tcp open http 88/tcp open kerberos-sec 106/tcp open pop3pw 111/tcp open rpcbind 311/tcp open asip-webadmin 389/tcp open ldap 548/tcp open afp 625/tcp open apple-xsrvr-admin 749/tcp open kerberos-adm 1021/tcp open unknown 1022/tcp open unknown 3659/tcp open unknown 3689/tcp open rendezvous 4111/tcp open unknown 5900/tcp open vnc 8086/tcp open unknown 8087/tcp open unknown Interesting ports on 192.168.0.10: Not shown: 997 closed ports PORT STATE SERVICE 23/tcp open telnet 80/tcp open http 443/tcp open https Interesting ports on 192.168.0.27: Not shown: 999 closed ports PORT STATE SERVICE 22/tcp open ssh Interesting ports on sulaco.mcslp.pri (192.168.0.101): Not shown: 995 closed ports PORT STATE SERVICE 22/tcp open ssh 88/tcp open kerberos-sec 548/tcp open afp 631/tcp open ipp 2170/tcp open unknown Interesting ports on nautilus.wireless.mcslp.pri (192.168.0.109): Not shown: 995 closed ports PORT STATE SERVICE 22/tcp open ssh 88/tcp open kerberos-sec 111/tcp open rpcbind 1001/tcp open unknown 5900/tcp open vnc Interesting ports on 192.168.1.1: Not shown: 995 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 23/tcp open telnet 80/tcp open http 5431/tcp open unknown Interesting ports on 192.168.1.25: Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind 4045/tcp open lockd Interesting ports on gentoo1.vmbear.mcslp.pri (192.168.1.52): Not shown: 997 closed ports PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind 3128/tcp open squid-http Interesting ports on gentoo2.vmbear.mcslp.pri (192.168.1.53): Not shown: 998 closed ports PORT STATE SERVICE 22/tcp open ssh 111/tcp open rpcbind Nmap done: 1024 IP addresses (11 hosts up) scanned in 32.27 seconds |
从这个输出中可以看到,网络上存储许多服务。例如,地址为 192.168.0.1 的设备提供了 HTTP 和 HTTP 代理服务。除了 smtp imap、nfs 和 MySQL 服务外,Sp 还提供了 bear.mcslp.pri。
要确定关于这些服务的更具体的信息,可以再次使用 nmap,使用 version 参数获得特定主机上打开的协议和端口的更详细的版本信息列表。
比如,通过检查主服务器(bear)上的内容,可以很好地了解每个端口背后运行的内容(参见清单 19)。
清单 19. 使用 version 参数运行 nmap
$ nmap -sT -sV bear Starting Nmap 4.76 ( ) at 2009-03-24 16:17 GMT Interesting ports on localhost (127.0.0.1): Not shown: 985 closed ports PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 5.1 (protocol 2.0) 25/tcp open smtp Postfix smtpd 53/tcp open domain ISC BIND 9.4.3-P1 111/tcp open rpcbind 143/tcp open imap Cyrus IMAP4 2.3.13-Gentoo 443/tcp open ssl/http Apache httpd 783/tcp open spamassassin SpamAssassin spamd 902/tcp open ssl/vmware-auth VMware Authentication Daemon 1.10 (Uses VNC) 993/tcp open ssl/imap Cyrus imapd 2000/tcp open sieve Cyrus timsieved 2.3.13-Gentoo (included w/cyrus imap) 2049/tcp open rpcbind 3128/tcp open http-proxy Squid webproxy 2.7.STABLE6 3306/tcp open mysql MySQL 5.0.60-log 10024/tcp open smtp amavisd smtpd 10025/tcp open smtp Postfix smtpd Service Info: Hosts: gendarme.mcslp.com, bear, 127.0.0.1 Service detection performed. Please report any incorrect results at /submit/ . Nmap done: 1 IP address (1 host up) scanned in 12.12 seconds |
在这个例子中,可以看到许多具体的服务,这一次显示版本信息,甚至是各种情况下提供的应用程序信息。
确定网络中未被识别出来的主机
在网络上找到一个主机后,特别是您不能立即识别出这个主机的话,您可能需要了解有关这台主机的更多信息。TCP 端口扫描展示这台主机所支持的服务有哪些,但是这不足以了解整体情况。一些设备或系统公开端口的方式可能不能使您立即看到网络上有哪些内容。
nmap 操作系统扫描将检查打开的端口并试图找出不同服务后隐藏的系统。这使识别网络上具有打开端口的服务器和识别新设备有所区别。
例如,如果在服务器 bear 上运行操作系统识别,可以将系统识别为运行传统 Linux 版本,这很可能表示一台标准的计算机,如清单 20 所示。
清单 20. nmap 操作系统扫描
# nmap -sT -O bear Starting Nmap 4.76 ( ) at 2009-03-24 16:20 GMT Interesting ports on localhost (127.0.0.1): Not shown: 985 closed ports PORT STATE SERVICE 22/tcp open ssh 25/tcp open smtp 53/tcp open domain 111/tcp open rpcbind 143/tcp open imap 443/tcp open https 783/tcp open spamassassin 902/tcp open iss-realsecure 993/tcp open imaps 2000/tcp open callbook 2049/tcp open nfs 3128/tcp open squid-http 3306/tcp open mysql 10024/tcp open unknown 10025/tcp open unknown Device type: general purpose Running: Linux 2.6.X OS details: Linux 2.6.17 - 2.6.25 Network Distance: 0 hops OS detection performed. Please report any incorrect results at /submit/ . Nmap done: 1 IP address (1 host up) scanned in 1.71 seconds |
这个 OS 扫描并不理想,因为它需要借助网络指纹(finger printing)技术来判断打开的端口和返回的版本信息的含义。例如,下面清单 21 中的扫描识别出大量可能潜藏在端口类型背后的潜在操作系统。
# nmap -sT -O some.faroffhost.com Starting Nmap 4.76 ( ) at 2009-03-24 16:23 GMT Interesting ports on some.faroffhost.com (205.196.217.20): Not shown: 976 closed ports PORT STATE SERVICE 21/tcp open ftp 22/tcp open ssh 25/tcp open smtp 110/tcp open pop3 111/tcp filtered rpcbind 113/tcp open auth 135/tcp filtered msrpc 139/tcp filtered netbios-ssn 143/tcp open imap 548/tcp open afp 554/tcp open rtsp 555/tcp open dsf 587/tcp open submission 687/tcp open unknown 993/tcp open imaps 995/tcp open pop3s 1720/tcp filtered H.323/Q.931 5222/tcp open unknown 5269/tcp open unknown 5666/tcp open unknown 7070/tcp open realserver 8000/tcp open http-alt 8001/tcp open unknown 8649/tcp open unknown Device type: print server|general purpose|storage-misc|WAP|switch|specialized Running (JUST GUESSING) : HP embedded (92%), Linux 2.6.X|2.4.X (92%), Buffalo embedded (91%), Acorp embedded (89%), Actiontec Linux 2.4.X (89%), Linksys embedded (89%), Netgear embedded (89%), Infoblox NIOS 4.X (89%) Aggressive OS guesses: HP 4200 PSA (Print Server Appliance) model J4117A (92%), Linux 2.6.20 (Ubuntu 7.04 server, x86) (92%), Linux 2.6.9 (92%), Buffalo TeraStation NAS device (91%), Linux 2.6.18 (CentOS 5.1, x86) (91%), OpenWrt 7.09 (Linux 2.4.34) (90%), Acorp W400G or W422G wireless ADSL modem (MontaVista Linux 2.4.17) (89%), HP Brocade 4100 switch; or Actiontec MI-424-WR, Linksys WRVS4400N, or Netgear WNR834B wireless broadband router (89%), HP Brocade 4Gb SAN switch (89%), Infoblox NIOS Release 4.1r2-5-22263 (89%) No exact OS matches for host (test conditions non-ideal). Network Distance: 18 hops OS detection performed. Please report any incorrect results at /submit/ . Nmap done: 1 IP address (1 host up) scanned in 23.66 seconds |
注意,nmap 扫描可以同时用于本地和远程网络。在上面的远程测试中,nmap 确定出包在抵达目的地之前如何通过不同的系统。理解您和网络上其他机器之间的各种设备通常是理解并确定网络布局的最后一部分。
确定网络结构
不论何时在网络上发送 IP 网络包,每当系统将包转发给另一个网络或系统时,一个特殊计数器将执行增量计算。包转发出现在一些不同的系统之间。如果有多个网络交换机彼此相连接,那么每个 hub 可以将自身标识为一个新设备。此外,无线接入点和传统路由器都是可以转发包的设备,因此被认为是包在网络中的路由过程的一部分。
在大多数网络环境中,本地网络中的 hub、交换机和其他组件并不会计算包转发的次数,但是随着网络的不断延伸,网络的规模将不断扩大并更加复杂,因此理解单个包的路由可以帮助您识别性能和连接性问题。
用于显示与主机通信的路由信息的主要工具是 traceroute。它可以确定从当前主机到目的地之间的给定路径中的每个主机的 IP 地址。如果主机位于本地,那么将使用直接路由(参见清单 22)。
清单 22. 使用 traceroute
$ traceroute solaris2 traceroute to solaris2 (192.168.1.25), 30 hops max, 40 byte packets 1 solaris2.mcslp.pri (192.168.1.25) 0.651 ms 0.892 ms 0.969 ms |
对于本地网络中可以通过本地路由器或网桥访问的主机,参见清单 23。
清单 23. 本地网络中的主机
$ traceroute gentoo1 traceroute to gentoo1 (192.168.1.52), 30 hops max, 40 byte packets 1 gendarme.mcslp.pri (192.168.0.1) 3.163 ms 3.159 ms 6.618 ms 2 gentoo1.mcslp.pri (192.168.1.52) 34.336 ms 34.341 ms 34.341 ms |
与远程网络的连接可能显示每个路由器和包采用的步骤(参见清单 24)。
清单 24. 与远程网络的连接
$ traceroute traceroute to (129.42.58.216), 30 hops max, 40 byte packets 1 gendarme.mcslp.pri (192.168.0.1) 3.163 ms 3.159 ms 6.618 ms 2 gauthier-dsl1.hq.zen.net.uk (62.3.82.17) 34.336 ms 34.341 ms 34.341 ms 3 lotze-ge-0-0-1-136.hq.zen.net.uk (62.3.80.137) 37.581 ms 47.276 ms 50.548 ms 4 nietzsche-ae2-0.ls.zen.net.uk (62.3.80.70) 43.945 ms 47.239 ms 50.529 ms 5 nozick-ge-3-1-0-0.ls.zen.net.uk (62.3.80.74) 55.343 ms 55.341 ms 55.339 ms 6 lorenz-ge-3-0-0-0.te.zen.net.uk (62.3.80.78) 66.347 ms 63.118 ms 63.105 ms 7 82.195.188.13 (82.195.188.13) 146.039 ms 118.175 ms 124.532 ms 8 sl-bb22-lon-8-0.sprintlink.net (213.206.128.60) 50.460 ms 47.273 ms 40.991 ms 9 sl-bb20-lon-12-0.sprintlink.net (213.206.128.52) 47.107 ms 47.094 ms 43.711 ms 10 sl-crs2-nyc-0-5-3-0.sprintlink.net (144.232.9.164) 111.579 ms 113.173 ms 113.159 ms 11 144.232.18.238 (144.232.18.238) 116.353 ms 111.633 ms 111.619 ms 12 0.xe-5-0-1.XL3.NYC4.ALTER.NET (152.63.3.125) 114.812 ms 111.788 ms 115.000 ms 13 0.so-7-1-0.XT3.STL3.ALTER.NET (152.63.0.6) 151.969 ms 142.573 ms 142.574 ms 14 POS6-0.GW8.STL3.ALTER.NET (152.63.92.37) 142.552 ms 253.001 ms 252.986 ms 15 ibm-gw.customer.alter.net (65.206.180.74) 179.655 ms 228.775 ms 228.751 ms 16 10.16.255.10 (10.16.255.10) 145.847 ms 139.310 ms 142.509 ms 17 * * * 18 129.42.58.216 (129.42.58.216) 143.118 ms 141.181 ms 141.152 ms |
通过使用这种方法,并结合使用 nmap 确定主机列表,您可以更好地理解网络中的主机,以及使用哪些路由器和系统访问这些系统。
小结
在本教程中,您了解了各种不同的 UNIX 工具和技巧。您可以使用这些工具确定相关网络上的主机的各种信息、它们是否是可访问的、它们与哪些机器和其他系统建立了连接,以及它们提供的服务和系统。
通过结合使用这些技巧,您应当能够进入任何 UNIX 环境并实现网络配置,并且通过记录这些信息,您可以确定问题的根源并找到解决办法。