您的位置:首页技术文章
文章详情页

UNIX 网络分析

【字号: 日期:2024-06-07 17:25:36浏览:105作者:猪猪

开始之前

本教程面向有以下需求的 Unix 系统管理员:他们需要找到一些方法来发现和判断有关其网络结构和配置的信息,包括各个机器上允许的服务和系统有哪些。要从本教程获得最大的收益,您应当具有 UNIX 操作系统的基本知识,以及基本了解网络和 Internet 协议 (IP) 的运作方式。

关于本教程

在访问一个 UNIX 系统时,甚至是了解现有系统时,有关系统如何运行的一个关键部分就是网络配置。您需要清楚并了解网络的许多方面,以便正确地识别问题并防患于未然。通过使用一些基本的工具和命令,可以确定单个系统的大量配置,理解了这些知识后,就可以很好地确定网络其余部分的配置。通过一些额外的工具,可以将知识扩展到网络中的更多的系统和服务。

在本教程中,您将在 UNIX 环境中使用一些基本的工具,挖掘有关系统配置的信息。通过理解这些工具并使用它们获得的信息,您将能够更好地理解系统网络配置和它的工作原理。您还将研究可以涵盖更广泛网络的工具和解决方案,获得有关网络的更详细的信息、其潜在的安全问题,这有助于找出和诊断问题的关键信息点。

理解主机的网络配置

要更好地理解网络,第一步是理解当前使用的机器的网络配置。这将为您提供许多参考基准,比如当前主机的 IP 地址、DNS 配置以及可以连接并与之通信的其他机器。

查找配置信息

确定正在使用的机器的当前配置可以使您获得对环境的基本了解。您的第一个任务是确定当前机器的 IP 地址和网络掩码(mask)。通过这两个值,可以确定机器的地址,以及可以与之直接在网络上建立连接的其他机器(比如,不需要使用路由器)。

在确定 IP 地址之前,通过使用 hostname 命令获得系统的主机名(参见清单 1)。

清单 1. 获得主机名

$ hostnamesulaco

在选择 -a 选项时,ifconfig 命令将显示所有已配置的网络设备的当前配置信息。例如,清单 2 展示了 ifconfig 命令在一台 Solaris 机器上的输出。

清单 2. ipconfig 在 Solaris 上的输出

$ ifconfig -alo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1inet 127.0.0.1 netmask ff000000 pcn0: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS> mtu 1500 index 2inet 192.168.1.25 netmask fffffc00 broadcast 192.168.3.255lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1inet6 ::1/128 pcn0: flags=202004841<UP,RUNNING,MULTICAST,DHCP,IPv6,CoS> mtu 1500 index 2inet6 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 标记列表)。

网络掩码非常重要,只要知道了网络掩码,就可以知道所在网络的大小(通过注册的 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 loLink 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<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 inet 127.0.0.1 netmask 0xff000000 inet6 ::1 prefixlen 128 gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280stf0: flags=0<> mtu 1280en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500inet 192.168.0.101 netmask 0xfffffc00 broadcast 192.168.3.255ether 00:16:cb:a0:3b:cb media: autoselect (1000baseT <full-duplex,flow-control>) status: activesupported media: autoselect 10baseT/UTP <half-duplex> 10baseT/UTP <full-duplex> 10baseT/UTP <full-duplex,hw-loopback> 10baseT/UTP <full-duplex,flow-control> 100baseTX <half-duplex> 100baseTX <full-duplex> 100baseTX <full-duplex,hw-loopback> 100baseTX <full-duplex,flow-control> 1000baseT <full-duplex> 1000baseT <full-duplex,hw-loopback> 1000baseT <full-duplex,flow-control> nonefw0: flags=8822<BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 2030lladdr 00:17:f2:ff:fe:7b:84:d6 media: autoselect <full-duplex> status: inactivesupported media: autoselect <full-duplex>en1: flags=8822<BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500ether 00:17:f2:9b:3d:38 media: autoselect (<unknown type>)supported media: autoselecten5: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500inet6 fe80::21c:42ff:fe00:8%en5 prefixlen 64 scopeid 0x7 inet 10.211.55.2 netmask 0xffffff00 broadcast 10.211.55.255ether 00:1c:42:00:00:08 media: autoselect status: activesupported media: autoselecten6: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500inet6 fe80::21c:42ff:fe00:9%en6 prefixlen 64 scopeid 0x8 inet 10.37.129.2 netmask 0xffffff00 broadcast 10.37.129.255ether 00:1c:42:00:00:09 media: autoselect status: activesupported media: autoselect

在任何情况下,通常都可以找到所连接的网络设备的 Internet 地址和掩码。显然,如果拥有多个网络设备,那么可以在输出中获得有关每个设备的信息,并且有可能从一个机器中访问各种不同的网络和系统。

查找名称解析服务

下一步是确定当前机器的配置,这个配置应当与名称服务系统的配置关联起来,名称服务将在您访问另一台机器上的服务时将系统的名称和域名转换为 IP 地址。

大多数机器上的这一配置是通过 /etc/nsswitch.conf 文件实现的,该文件包含了各种命名服务(主机、用户等等)以及使用各种服务(DNS、NIS 或本地文件)进行解析的顺序。可以参见清单 5。

清单 5. 解析名称服务系统

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: filestnrhdb: 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 等工具提取有关名称服务和名称解析以及 IP 地址的信息。

检查路由

网络以外的主机(即与当前 IP 地址相比,超出了网络掩码的范围之外)被发送到一个路由器,从路由器转发到另一台机器。路由器可以在任何一级网络上使用,包括部门之间、不同物理位置,以及 Internet 之类的公共和外部站点。

netstat 命令将告诉您,当您的机器希望与 “本地 网络以外的机器通信时,将与那些机器或路由器建立联系。例如,下面的清单 7 来自于一台 Solaris 机器。

清单 7. netstat 命令

$ netstat -rRouting Table: IPv4 DestinationGatewayFlags Ref Use Interface -------------------- -------------------- ----- ----- ---------- --------- default voyager.example.pri UG1139 pcn0 192.168.0.0 solaris2.example.pri U 1447 pcn0 solaris2 solaris2 UH1 35 lo0Routing Table: IPv6 Destination/MaskGatewayFlags RefUseIf--------------------------- --------------------------- ----- --- ------- ----- fe80::/10fe80::20c:29ff:fe7f:dc5 U10 pcn0 solaris2solaris2UH 10 lo0

可以从这个输出中看到,机器非常忙碌。第三列显示了使用冒号分隔的主机名和端口,分别针对每个打开的连接或侦听连接。如果 TCP 或 UDP 服务号与某个已知的端口号匹配(如 /etc/services 文件中定义的那样),那么服务的名称将被显示在输出中。对于主机,将显示主机名、备用的 IP 地址或 ‘*’ 符号。星号表示服务和端口是打开的并且正在侦听所有 IP 地址。

例如,可以从输出中看到,机器被配置为支持 NFS,并且具有打开的(已经建立的)连接,如清单 9 所示。

清单 9. 机器被配置为支持 NFS

$ netstat -a|grep nfstcp0 0 *:nfs*:* LISTEN tcp1 0 bear.example.pri:nfs sulaco.example.p:51900 CLOSE_WAIT tcp0 0 bear.example.pri:nfs narcissus.example.p:62968 ESTABLISHEDtcp1 0 bear.example.pri:nfs sulaco.example.p:59172 CLOSE_WAIT tcp0 0 bear.example.pri:nfs sulaco.example.p:65320 ESTABLISHEDtcp1 0 bear.example.pri:nfs sulaco.example.p:53877 CLOSE_WAIT udp0 0 *:nfs*:*

也可以使用这个输出查看哪些机器目前正在和这台机器通信。例如,可以提取一个与这台机器建立连接的机器列表,方法是查看第 5 列,进行排序并从列表中移除重复的内容(参见清单 10)。

清单 10. 提取一个已建立连接的机器列表

$ netstat -a|egrep 'tcp|udp'|grep ESTABLISHED|awk '{ print $5; }'|cut -d: -f1|sort|uniqlocalhostnarcissus.mcslp.pnautilus.wirelesspolarbear.wirelesSolaris2.vmbear.mcssulaco.mcslp.pri

如果怀疑有未知的或不希望的用户或计算机连接到这台机器上,那么这些信息十分有用。

要查找关于其他机器的信息,需要查看网络上的其他计算机。

查找有关其他主机的信息

获得了有关您的机器的基本信息后,可以进一步查看网络中的其他机器,从而判断它们的可用性和提供的服务。通过使用正确的工具,甚至可以确定这些机器正在运行的操作系统和它们可能共享的服务。

检查主机

检查远程机器的最简单也是最明显的工具就是使用 ping 工具查看某个特定主机是否启动并且可用。ping 工具执行一些非常简单的操作。它将一个数据包发送给远程主机来请求一个响应。当接收到响应后,ping 工具将计算时间差异,发送并接收包所用的时间可以表明某台机器与 ping 工具当前位置的距离的远近。

例如,如果 ping 您的网络中的某台机器,那么很可能很快就会得到 ping 包的响应(参见清单 11)。

清单 11. ping 自己的网络中的机器

$ ping bearPING bear.mcslp.pri (192.168.0.2): 56 data bytes64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=0.154 ms64 bytes from 192.168.0.2: icmp_seq=1 ttl=64 time=0.162 ms64 bytes from 192.168.0.2: icmp_seq=2 ttl=64 time=0.149 ms64 bytes from 192.168.0.2: icmp_seq=3 ttl=64 time=0.161 ms64 bytes from 192.168.0.2: icmp_seq=4 ttl=64 time=0.162 ms64 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 lossround-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),而没有其他进一步的动作。

清单 12. 在 UNIX 系统上仅执行 Ping 操作

$ ping bearbear is alive

要执行更长的测试,使用 -s 选项,如清单 13 所示。

清单 13. 使用 -s 选项执行 ping

$ ping -s bearPING bear: 56 data bytes64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=0. time=0.288 ms64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=1. time=0.247 ms64 bytes from bear.mcslp.pri (192.168.0.2): icmp_seq=2. time=0.208 ms64 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 lossround-trip (ms) min/avg/max/stddev = 0.208/0.243/0.288/0.034

每一行的 time 字段表示每个包的速度和延迟(发出响应之前的延迟,通常表示活动的级别)。当停止输出时,将获得所发送和接收的包的数量的汇总和时间统计数据。

ping 包所需传递的距离越远,从远程主机获得的响应时间越长。例如,如果尝试 ping Internet 中的一个公共服务器,那么获取响应包的时间将会显著增加(参见清单 14)。

清单 14. ping Internet 中的一个公共服务器

$ ping www.example.comPING www.example.com (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 ms64 bytes from mcslp.com (67.205.21.169): icmp_seq=2 ttl=44 time=194 ms64 bytes from mcslp.com (67.205.21.169): icmp_seq=3 ttl=44 time=197 ms64 bytes from mcslp.com (67.205.21.169): icmp_seq=4 ttl=44 time=194 ms^C--- www.example.com ping statistics ---4 packets transmitted, 4 received, 0% packet loss, time 3039msrtt min/avg/max/mdev = 193.737/195.120/197.123/1.353 ms

将这个连接到 Internet 服务所需的时间(193 毫秒)与连接本地主机所需时间(0.23 毫秒)进行比较。

ping 工具还可以快速判断您是否能够到达您希望连接到的远程主机。在实际上不存在的主机上运行 ping 将返回一个非常具体的错误(参见清单 15)。

清单 15. 在实际上不存在的主机上运行 ping

$ ping notinherePING 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

标签: Unix系统