Top

D13:常见任务和基本工具之三

网络

本章涉及的命令有:
一些术语:
目录:

检查和监控网络

即使对于非系统管理员,检查网络的性能和操作,通常也是很有帮助的。

ping

ping是最基本的网络命令。
ping命令向指定主机发送一个称为ICMP ECHO_REQUEST的特殊网络数据包,大多数接收到该数据包的网络设备都会回复该数据包,从而可以验证网络连接。

出于安全原因,可以将大多数网络设备(包括Linux主机)——尤其是防火墙——配置为忽略这些数据包,以使主机不会遭受潜在攻击者的攻击。

要确定是否能到达linuxcommand.org,可以使用以下命令:
[me@linuxbox ~]$ ping linuxcommand.org
一旦开始,ping会持续发送(默认间隔一秒)数据包,直到被终止。
[me@linuxbox ~]$ ping linuxcommand.org
PING linuxcommand.org (66.35.250.210) 56(84) bytes of data.
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=1 ttl=43 time=107 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=2 ttl=43 time=108 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=3 ttl=43 time=106 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=4 ttl=43 time=106 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=5 ttl=43 time=105 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=6 ttl=43 time=107 ms

--- linuxcommand.org ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 6010ms
rtt min/avg/max/mdev = 105.647/107.052/108.118/0.824 ms		
按Ctrl-c中断后,ping列出性能统计信息。
正常运行的网络将显示0%的数据包丢失。成功的ping表明网络元素(接口卡、网线、路由和网关)总体上出于良好的工作状态。

traceroute

traceroute程序(有些系统使用类似的tracepath程序)列出从本地系统到指定主机的所有”跃点“网络流量。例如:
		
[me@linuxbox ~]$ traceroute slashdot.org		
traceroute to slashdot.org (216.34.181.45), 30 hops max, 40 byte packets
1 ipcop.localdomain (192.168.1.1) 1.066 ms 1.366 ms 1.720 ms
2 * * *
3 ge-4-13-ur01.rockville.md.bad.comcast.net (68.87.130.9) 14.622 ms 14.885 ms 15.169 ms
4 po-30-ur02.rockville.md.bad.comcast.net (68.87.129.154) 17.634 ms 17.626 ms 17.899 ms
5 po-60-ur03.rockville.md.bad.comcast.net (68.87.129.158) 15.992 ms 15.983 ms 16.256 ms
6 po-30-ar01.howardcounty.md.bad.comcast.net (68.87.136.5) 22.835 ms 14.233 ms 14.405 ms
7 po-10-ar02.whitemarsh.md.bad.comcast.net (68.87.129.34) 16.154 ms 13.600 ms 18.867 ms
8 te-0-3-0-1-cr01.philadelphia.pa.ibone.comcast.net (68.86.90.77) 21.951 ms 21.073 ms 21.557 ms
9 pos-0-8-0-0-cr01.newyork.ny.ibone.comcast.net (68.86.85.10) 22.917 ms 21.884 ms 22.126 ms
10 204.70.144.1 (204.70.144.1) 43.110 ms 21.248 ms 21.264 ms
11 cr1-pos-0-7-3-1.newyork.savvis.net (204.70.195.93) 21.857 ms cr2-pos-0-0-3-1.newyork.savvis.net (204.70.204.238) 19.556 ms cr1-pos-0-7-3-1.newyork.savvis.net (204.70.195.93) 19.634 ms
12 cr2-pos-0-7-3-0.chicago.savvis.net (204.70.192.109) 41.586 ms 42.843 ms cr2-tengig-0-0-2-0.chicago.savvis.net (204.70.196.242) 43.115 ms
13 hr2-tengigabitethernet-12-1.elkgrovech3.savvis.net (204.70.195.122) 44.215 ms 41.833 ms 45.658 ms
14 csr1-ve241.elkgrovech3.savvis.net (216.64.194.42) 46.840 ms 43.372 ms 47.041 ms
15 64.27.160.194 (64.27.160.194) 56.137 ms 55.887 ms 52.810 ms 
16 slashdot.org (216.34.181.45) 42.727 ms 42.016 ms 41.437 ms	
从以上结果中我们可以看到从测试系统连接到slashdot.org需要穿过16个路由器。
对于提供识别信息的路由器,我们可以看到它们的主机名、IP地址和性能数据,其中包括从本地系统到路由器的三个往返时间样本。
对于未提供识别信息的路由器(由于路由器配置、网络拥塞、防火墙等原因),像第二跳那样显示星号。
在路由信息被阻塞的情况下,有时可以通过在traceroute命令中添加-T-I(大写的i)选项来克服这一问题。

ip

ip程序是一个多用途的网络配置工具,它利用了现代Linux内核提供的全套联网功能。
以前的ifconfig程序已经被弃用。使用ip可以检查系统的网络接口和路由表。
[me@linuxbox ~]$ ip a
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN
group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0:  mtu 1500 qdisc pfifo_fast
state UP group default qlen 1000
    link/ether ac:22:0b:52:cf:84 brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.14/24 brd 192.168.1.255 scope global eth0
      valid_lft forever preferred_lft forever
    inet6 fe80::ae22:bff:fe52:cf84/64 scope link
      valid_lft forever preferred_lft forever		
以上例子中,系统有两个网络接口,第一个被称为lo,这是环回接口(loopback interface),系统用“自我对话”的虚拟接口。第二个被称为eth0,是以太网接口。

在执行临时网络诊断时,需要查找的重要内容是每个接口的第一行中是否存在UP一词,这表明网络接口已启用
以及第三行的inet字段中是否存在有效的IP地址。对于使用DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)的系统,此字段中的有效IP地址将验证DHCP是否正常工作。

netstat

netstat程序用于检查各种网络设置和统计数据。
通过使用它的许多选项,可以查看网络设置中的各种功能。使用-ie选项,可以检查系统中的网络接口。
[me@linuxbox ~]$ netstat -ie
eth0    Link encap:Ethernet   HWaddr 00:1d:09:9b:99:67
        inet addr:192.168.1.2 Bcast:192.168.1.255 Mask:255.255.255.0
        inet6 addr: fe80::21d:9ff:fe9b:9967/64 Scope:Link
        UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
        RX packets:238488 errors:0 dropped:0 overruns:0 frame:0
        TX packets:403217 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:100
        RX bytes:153098921 (146.0 MB) TX bytes:261035246 (248.9 MB)
        Memory:fdfc0000-fdfe0000
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:2208 errors:0 dropped:0 overruns:0 frame:0
        TX packets:2208 errors:0 dropped:0 overruns:0 carrier:0
        collisions:0 txqueuelen:0
        RX bytes:111490 (108.8 KB) TX bytes:111490 (108.8 KB)		
使用-r选项将显示内核的网络路由表。这显示了如何将网络配置为在网络之间发送数据包。
[me@linuxbox ~]$ netstat -r
Kernel IP routing table
Destination  Gateway     Genmask       Flags MSS Window irtt Iface

192.168.1.0  *           255.255.255.0 U       0 0         0 eth0
default      192.168.1.1 0.0.0.0       UG      0 0         0 eth0		
这是一个简单的例子,是防火墙/路由器后面局域网(LAN)上客户机的典型路由表。
第一行显示了目标192.168.1.0。以0结尾的IP地址指的是网络,而不是单个主机,所以这个目的地指的是LAN上的任何主机。
第二个字段Gatway是用于从当前主机到目标网络的网关(路由器)的名称或IP地址。此字段如果是星号则表示不需要网关。

最后一行保姆目标默认值。这意味着任何发送到网络的流量都没有在列表中列出。
网关被定义为192.168.1.1的路由器,它可能知道如何处理目标流量。

通过网络传递文件

ftp

真正最基本的程序,ftp得名于它使用的协议:File Transfer Protocol(网络传输协议)。
在URI中以ftp://开头。
在web浏览器诞生之前就已经有ftp程序了。
FTP不安全,因为它使用明文发送账号和密码,任何网络探测都能看到它们。所以互联上几乎所有FTP都是匿名FTP服务器。匿名服务器允许所有人使用“anonymous”名称和无意义的密码登录。
下面的实例中展示一个ftp程序下载Ubuntu iso映像的典型会话,该映像位于匿名ftp服务器fileserver上:
[me@linuxbox ~]$ ftp fileserver                                       调用ftp程序并将其连接到ftp服务器fileserver
Connected to fileserver.localdomain.
220 (vsFTPd 2.0.1)
Name (fileserver:me): anonymous                                       登录名
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> cd pub/cd_images/Ubuntu-18.04                                    切换到远程系统的指定目录。多数提供下载的匿名FTP的公共目录是pub目录
250 Directory successfully changed.
ftp> ls                                                               查看远程系统中目录里的内容
200 PORT command successful. Consider using PASV.
150 Here comes the directory listing.
-rw-rw-r-- 1 500 500 733079552 Apr 25 03:53 ubuntu-
18.04-desktop-amd64.iso
226 Directory send OK.
ftp> lcd Desktop                                                      切换本地目录到~/Desktop。
Local directory now /home/me/Desktop
ftp> get ubuntu-18.04-desktop-amd64.iso                               告诉远程系统将指定文件传递到本地的~/Desktop目录中
local: ubuntu-18.04-desktop-amd64.iso remote: ubuntu-18.04-desktopamd64.
iso
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ubuntu-18.04-desktopamd64.
iso (733079552 bytes).
226 File send OK.
733079552 bytes received in 68.56 secs (10441.5 kB/s)
ftp> bye                                                              登出远程服务器并结束ftp程序进程。或许也可以用quit和exit。
在ftp>提示符下输入help可以显示素有支持的命令的列表。
在已授予足够权限的服务器上使用ftp,可以执行许多普通的文件管理任务。虽然很笨拙,但确实能用。

lftp——更好的ftp

ftp不是唯一的命令行ftp客户端。更好且更受欢迎的是lftp。
它的工作原理与传统的ftp非常相似,但有许多额外的便利功能,包括多协议支持(包括HTTP)、下载失败时自动重试、后台进程、tab键补全路径名等。

wget

wget对于从web和ftp站点下载内容都很有用。可以下载单个文件、多个文件,甚至整个网站。例如:
[me@linuxbox ~]$ wget http://linuxcommand.org/index.php
--11:02:51-- http://linuxcommand.org/index.php
           => `index.php'
Resolving linuxcommand.org... 66.35.250.210
Connecting to linuxcommand.org|66.35.250.210|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: unspecified [text/html]

     [ <=>                           ] 3,120        --.--K/s
11:02:51 (161.75 MB/s) - `index.php' saved [3120]		
此程序的许多选项允许递归下载、在后台下载(允许注销但继续下载)、断点续传(?)。

安全连接到远程主机

互联网普及之前,有两个流行的程序用来登录远程主机:rlogin和telnet。
然而它们与ftp一样有着相同的致命缺陷:以明文传输所有通信。这使得它们完全不适合在互联网时代使用。

ssh

SSH——Secure Shell,解决了与远程主机安全通信的两个基本问题: SSH由两部分组成: 大多数Linux发行版都从OpenBSD项目中提供的名为OpenSSH的SSH实现。
一些发行版默认包括客户端和服务器包(例如RedHat),而其他发行版(例如Ubuntu)只提供客户端。
为了使系统能接收远程连接,必须安装、配置并运行OpenSSH服务器包。
如果系统正在运行或在防火墙后面,则必须配置防火墙允许TCP端口22上的传入网络连接。

以下例子连接到远程SSH服务器remote-sys:
[me@linuxbox ~]$ ssh remote-sys
The authenticity of host 'remote-sys (192.168.1.4)' can't be
established.
RSA key fingerprint is
41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb.
Are you sure you want to continue connecting (yes/no)?		
第一次连接时,将显示一条消息,指示无法确定远程主机的真实性。这是因为客户端程序以前从未见过这个远程主机。
要接受远程主机的凭据,在出现提示时输入“yes”。建立连接后,系统会提示用户输入密码:
Warning: Permanently added 'remote-sys,192.168.1.4' (RSA) to the list
of known hosts.
me@remote-sys's password:		
成功登录后,将收到远程系统的shell提示符:
Last login: Sat Aug 30 13:00:48 2016
[me@remote-sys ~]$		
远程shell会话将会持续,直到用户在远程shell提示符下输入exit命令关闭远程连接。此时,本地shell会话将继续。

也可以使用不同的用户名连接到远程系统:
[me@linuxbox ~]$ ssh bob@remote-sys
bob@remote-sys's password:
Last login: Sat Aug 30 13:03:21 2016
[bob@remote-sys ~]$		

如前所述,ssh验证远程主机的真实性。如果远程主机未成功进行身份验证,将显示以下信息:
[me@linuxbox ~]$ ssh remote-sys
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@     WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!    @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle
attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
41:ed:7a:df:23:19:bf:3c:a5:17:bc:61:b3:7f:d9:bb.
Please contact your system administrator.
Add correct host key in /home/me/.ssh/known_hosts to get rid of this
message.
Offending key in /home/me/.ssh/known_hosts:1
RSA host key for remote-sys has changed and you have requested strict
checking.
Host key verification failed.		
有两种情况会导致以上信息: 所以出现此消息时,务必与远程系统管理员联系。
如果确定是由正常原因引起的,可以在客户端的~/.ssh/known_hosts文件中删除过时的密钥。上面例子中有一行:
Offending key in /home/me/.ssh/known_hosts:1
这意味着known_hosts文件的第一行包含有问题的密钥。从文件中删除这一行,ssh程序将远程系统接受新的身份验证凭据。
除了在远程系统上打开shell会话,ssh还允许我们在远程系统上执行单个命令。以下实例在远程主机remote-sys上执行free命令:
[me@linuxbox ~]$ ssh remote-sys free
me@twin4's password:
             total   used   free shared buffers cached
             
Mem:        775536 507184 268352      0  110068 154596

-/+ buffers/cache: 242520  533016
Swap:      1572856      0   1572856
[me@linuxbox ~]$		
以下实例在远程系统执行ls,并将输出重定向到本系统上的文件:
[me@linuxbox ~]$ ssh remote-sys 'ls *' > dirlist.txt
me@twin4's password:
[me@linuxbox ~]$		
原书中有个ssh隧道的例子,另案学习

scp和sftp

OpenSSH包还包括两个程序,可以利用SSH加密的隧道在网络上复制文件。
首先,scp(secure copy)与常见的cp程序非常相似,用于复制文件。最显著的区别是,源或目标路径前面可能有远程主机名,后面可能有冒号字符。例如:
[me@linuxbox ~]$ scp remote-sys:document.txt .
me@remote-sys's password:
document.txt      100%  5581    5.5KB/s  00:00
[me@linuxbox ~]$		
与ssh一样,如果所需的远程主机账户名与本地系统的账户名不同,则可以在远程主机名的开头应用用户名:
scp bob@remote-sys:document.txt .

另一个SSH文件复制程序是sftp,他是ftp程序的安全替代品。工作原理与ftp很相似,但它没有用明文传输所有内容,而是使用SSH加密的隧道。
它不需要在远程主机上运行ftp服务器,只需要SSH服务器即可。