UNIX 網(wǎng)絡(luò)分析
開始之前
本教程面向有以下需求的 Unix 系統(tǒng)管理員:他們需要找到一些方法來發(fā)現(xiàn)和判斷有關(guān)其網(wǎng)絡(luò)結(jié)構(gòu)和配置的信息,包括各個機器上允許的服務(wù)和系統(tǒng)有哪些。要從本教程獲得最大的收益,您應(yīng)當(dāng)具有 UNIX 操作系統(tǒng)的基本知識,以及基本了解網(wǎng)絡(luò)和 Internet 協(xié)議 (IP) 的運作方式。
關(guān)于本教程
在訪問一個 UNIX 系統(tǒng)時,甚至是了解現(xiàn)有系統(tǒng)時,有關(guān)系統(tǒng)如何運行的一個關(guān)鍵部分就是網(wǎng)絡(luò)配置。您需要清楚并了解網(wǎng)絡(luò)的許多方面,以便正確地識別問題并防患于未然。通過使用一些基本的工具和命令,可以確定單個系統(tǒng)的大量配置,理解了這些知識后,就可以很好地確定網(wǎng)絡(luò)其余部分的配置。通過一些額外的工具,可以將知識擴展到網(wǎng)絡(luò)中的更多的系統(tǒng)和服務(wù)。
在本教程中,您將在 UNIX 環(huán)境中使用一些基本的工具,挖掘有關(guān)系統(tǒng)配置的信息。通過理解這些工具并使用它們獲得的信息,您將能夠更好地理解系統(tǒng)網(wǎng)絡(luò)配置和它的工作原理。您還將研究可以涵蓋更廣泛網(wǎng)絡(luò)的工具和解決方案,獲得有關(guān)網(wǎng)絡(luò)的更詳細(xì)的信息、其潛在的安全問題,這有助于找出和診斷問題的關(guān)鍵信息點。
理解主機的網(wǎng)絡(luò)配置
要更好地理解網(wǎng)絡(luò),第一步是理解當(dāng)前使用的機器的網(wǎng)絡(luò)配置。這將為您提供許多參考基準(zhǔn),比如當(dāng)前主機的 IP 地址、DNS 配置以及可以連接并與之通信的其他機器。
查找配置信息
確定正在使用的機器的當(dāng)前配置可以使您獲得對環(huán)境的基本了解。您的第一個任務(wù)是確定當(dāng)前機器的 IP 地址和網(wǎng)絡(luò)掩碼(mask)。通過這兩個值,可以確定機器的地址,以及可以與之直接在網(wǎng)絡(luò)上建立連接的其他機器(比如,不需要使用路由器)。
在確定 IP 地址之前,通過使用 hostname 命令獲得系統(tǒng)的主機名(參見清單 1)。
清單 1. 獲得主機名
$ hostnamesulaco
在選擇 -a 選項時,ifconfig 命令將顯示所有已配置的網(wǎng)絡(luò)設(shè)備的當(dāng)前配置信息。例如,清單 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)設(shè)備 lo0,本地主機的地址為 127.0.0.1。還可以看到,這個設(shè)備還有一個等效的 IPv6 地址。
pcn0 設(shè)備的配置如下:網(wǎng)絡(luò)地址為 192.168.1.25,網(wǎng)絡(luò)掩碼為 fffffc00,相當(dāng)于 255.255.252.0。可以看到,在這里地址是使用 DHCP 設(shè)置的(從 DHCP 標(biāo)記列表)。
網(wǎng)絡(luò)掩碼非常重要,只要知道了網(wǎng)絡(luò)掩碼,就可以知道所在網(wǎng)絡(luò)的大小(通過注冊的 IP 地址)。在本例中,255.255.252.0 等同于 4 類 C 地址,因為 256(最大主機數(shù))減去 252 (使用了掩碼的主機數(shù))等于 4。
通過同時使用掩碼和配置后的 IP 地址,可以推測出本地網(wǎng)絡(luò)中 IP 地址的范圍。由于 IP 區(qū)塊通常按照完整的組進行劃分,并且是按順序進行的,因此可以推測出整個網(wǎng)絡(luò)中分布的 IP 地址的范圍為從 192.168.0.0 到 192.168.3.255。您可以得出這一結(jié)論,因為使用 4 類 C 地址,您通常會將整個范圍(192.168.0.0-192.168.255.255)劃分為相等的區(qū)塊 —— 其中地址前綴 192.168.1.x 必須位于 4 個地址中的第一個區(qū)塊中。
不同的操作系統(tǒng)使用不同的方式輸出信息(和細(xì)節(jié))。清單 3 展示了一個 Linux® 系統(tǒng)的輸出。
清單 3. Linux 系統(tǒng)的輸出
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™ 系統(tǒng)的輸出。
清單 4. Mac OS X 系統(tǒng)的輸出
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
在任何情況下,通常都可以找到所連接的網(wǎng)絡(luò)設(shè)備的 Internet 地址和掩碼。顯然,如果擁有多個網(wǎng)絡(luò)設(shè)備,那么可以在輸出中獲得有關(guān)每個設(shè)備的信息,并且有可能從一個機器中訪問各種不同的網(wǎng)絡(luò)和系統(tǒng)。
查找名稱解析服務(wù)
下一步是確定當(dāng)前機器的配置,這個配置應(yīng)當(dāng)與名稱服務(wù)系統(tǒng)的配置關(guān)聯(lián)起來,名稱服務(wù)將在您訪問另一臺機器上的服務(wù)時將系統(tǒng)的名稱和域名轉(zhuǎn)換為 IP 地址。
大多數(shù)機器上的這一配置是通過 /etc/nsswitch.conf 文件實現(xiàn)的,該文件包含了各種命名服務(wù)(主機、用戶等等)以及使用各種服務(wù)(DNS、NIS 或本地文件)進行解析的順序。可以參見清單 5。
清單 5. 解析名稱服務(wù)系統(tǒng)
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 中,首先解析主機名信息:在系統(tǒng)中查找本地文件(比如 /etc/hosts),然后再查找域名系統(tǒng)(DNS)。
如果 DNS 已經(jīng)進行了配置,那么 /etc/resolv.conf 文件將告訴您使用哪些機器來將名稱轉(zhuǎn)換為 IP 地址。清單 6 展示了一個樣例文件。
清單 6. 哪些機器將名稱轉(zhuǎn)換為 IP 地址
domain example.prinameserver 192.168.0.2nameserver 192.168.0.3
如果希望直接對機器查詢信息,那么這些信息很有用。可以使用 dig 和 nslookup 等工具提取有關(guān)名稱服務(wù)和名稱解析以及 IP 地址的信息。
檢查路由
網(wǎng)絡(luò)以外的主機(即與當(dāng)前 IP 地址相比,超出了網(wǎng)絡(luò)掩碼的范圍之外)被發(fā)送到一個路由器,從路由器轉(zhuǎn)發(fā)到另一臺機器。路由器可以在任何一級網(wǎng)絡(luò)上使用,包括部門之間、不同物理位置,以及 Internet 之類的公共和外部站點。
netstat 命令將告訴您,當(dāng)您的機器希望與 “本地 網(wǎng)絡(luò)以外的機器通信時,將與那些機器或路由器建立聯(lián)系。例如,下面的清單 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 服務(wù)號與某個已知的端口號匹配(如 /etc/services 文件中定義的那樣),那么服務(wù)的名稱將被顯示在輸出中。對于主機,將顯示主機名、備用的 IP 地址或 ‘*’ 符號。星號表示服務(wù)和端口是打開的并且正在偵聽所有 IP 地址。
例如,可以從輸出中看到,機器被配置為支持 NFS,并且具有打開的(已經(jīng)建立的)連接,如清單 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 列,進行排序并從列表中移除重復(fù)的內(nèi)容(參見清單 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
如果懷疑有未知的或不希望的用戶或計算機連接到這臺機器上,那么這些信息十分有用。
要查找關(guān)于其他機器的信息,需要查看網(wǎng)絡(luò)上的其他計算機。
查找有關(guān)其他主機的信息
獲得了有關(guān)您的機器的基本信息后,可以進一步查看網(wǎng)絡(luò)中的其他機器,從而判斷它們的可用性和提供的服務(wù)。通過使用正確的工具,甚至可以確定這些機器正在運行的操作系統(tǒng)和它們可能共享的服務(wù)。
檢查主機
檢查遠程機器的最簡單也是最明顯的工具就是使用 ping 工具查看某個特定主機是否啟動并且可用。ping 工具執(zhí)行一些非常簡單的操作。它將一個數(shù)據(jù)包發(fā)送給遠程主機來請求一個響應(yīng)。當(dāng)接收到響應(yīng)后,ping 工具將計算時間差異,發(fā)送并接收包所用的時間可以表明某臺機器與 ping 工具當(dāng)前位置的距離的遠近。
例如,如果 ping 您的網(wǎng)絡(luò)中的某臺機器,那么很可能很快就會得到 ping 包的響應(yīng)(參見清單 11)。
清單 11. ping 自己的網(wǎng)絡(luò)中的機器
$ 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 工具的不同實現(xiàn)使用不同的工作方式。在 Linux 和 Mac OS X 上,此工具在默認(rèn)情況下將不斷發(fā)送包并等待響應(yīng),直到使用 Control-C 強制應(yīng)用程序終止。
在 Solaris™、AIX® 和其他一些 Unix 版本中,ping 工具僅僅表示遠程主機是否發(fā)出響應(yīng)(參見清單 12),而沒有其他進一步的動作。
清單 12. 在 UNIX 系統(tǒng)上僅執(zhí)行 Ping 操作
$ ping bearbear is alive
要執(zhí)行更長的測試,使用 -s 選項,如清單 13 所示。
清單 13. 使用 -s 選項執(zhí)行 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 字段表示每個包的速度和延遲(發(fā)出響應(yīng)之前的延遲,通常表示活動的級別)。當(dāng)停止輸出時,將獲得所發(fā)送和接收的包的數(shù)量的匯總和時間統(tǒng)計數(shù)據(jù)。
ping 包所需傳遞的距離越遠,從遠程主機獲得的響應(yīng)時間越長。例如,如果嘗試 ping Internet 中的一個公共服務(wù)器,那么獲取響應(yīng)包的時間將會顯著增加(參見清單 14)。
清單 14. ping Internet 中的一個公共服務(wù)器
$ 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 服務(wù)所需的時間(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
