 | 理解主机的网络配置
要更好地理解网络,第一步是理解当前使用的机器的网络配置。这将为您提供许多参考基准,比如当前主机的 IP 地址、DNS 配置以及可以连接并与之通信的其他机器。
查找配置信息
确定正在使用的机器的当前配置可以使您获得对环境的基本了解。您的第一个任务是确定当前机器的 IP 地址和网络掩码(mask)。通过这两个值,可以确定机器的地址,以及可以与之直接在网络上建立连接的其他机器(比如,不需要使用路由器)。
在确定 IP 地址之前,通过使用 hostname 命令获得系统的主机名(参见清单 1)。
清单 1. 获得主机名
在选择 -a 选项时,ifconfig 命令将显示所有已配置的网络设备的当前配置信息。例如,清单 2 展示了 ifconfig 命令在一台 Solaris 机器上的输出。
清单 2. ipconfig 在 Solaris 上的输出
$ ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
pcn0: flags=201004843<UP,BROADCAST,RUNNING,MULTICAST,DHCP,IPv4,CoS>
mtu 1500 index 2
inet 192.168.1.25 netmask fffffc00 broadcast 192.168.3.255
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
inet6 ::1/128
pcn0: flags=202004841<UP,RUNNING,MULTICAST,DHCP,IPv6,CoS> 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 标记列表)。
网络掩码非常重要,只要知道了网络掩码,就可以知道所在网络的大小(通过注册的 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<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
gif0: flags=8010<POINTOPOINT,MULTICAST> mtu 1280
stf0: flags=0<> mtu 1280
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
inet 192.168.0.101 netmask 0xfffffc00 broadcast 192.168.3.255
ether 00:16:cb:a0:3b:cb
media: autoselect (1000baseT <full-duplex,flow-control>) status: active
supported 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> none
fw0: flags=8822<BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 2030
lladdr 00:17:f2:ff:fe:7b:84:d6
media: autoselect <full-duplex> status: inactive
supported media: autoselect <full-duplex>
en1: flags=8822<BROADCAST,SMART,SIMPLEX,MULTICAST> mtu 1500
ether 00:17:f2:9b:3d:38
media: autoselect (<unknown type>)
supported media: autoselect
en5: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> 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
ether 00:1c:42:00:00:08
media: autoselect status: active
supported media: autoselect
en6: flags=8963<UP,BROADCAST,SMART,RUNNING,PROMISC,SIMPLEX,MULTICAST> 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: autoselect
|
在任何情况下,通常都可以找到所连接的网络设备的 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,它只能由当前机器访问。考虑到简洁性,这些内容已经从输出中移除。
清单 8. 使用 -a 的输出
$ 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
|
如果怀疑有未知的或不希望的用户或计算机连接到这台机器上,那么这些信息十分有用。
要查找关于其他机器的信息,需要查看网络上的其他计算机。
|  |