D13:常见任务和基本工具之三
网络
本章涉及的命令有:
- ping —— 发送ICMP ECHO_REQUEST到网络主机
- traceroute —— 列出到网络主机的路由数据包跟踪
- ip —— 显示/操作路由、设备、策略路由和隧道
- netstat —— 显示网络连接、路由表、接口统计信息、伪装连接和多播成员身份
- ftp —— 互联网文件传输程序
- wget —— 非交互式网络下载程序
- ssh —— OpenSSH SSH客户端(远程登录程序)
一些术语:
- internet protocol address —— 互联网协议(IP)地址
- host and domain name —— 主机名和域名
- uniform resource identifier —— 统一资源标识符(URI)
目录:
检查和监控网络
即使对于非系统管理员,检查网络的性能和操作,通常也是很有帮助的。
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由两部分组成:
- SSH服务器在远程主机上运行,默认在22端口上监听传入连接
- 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服务器重新安装了
所以出现此消息时,务必与远程系统管理员联系。
如果确定是由正常原因引起的,可以在客户端的~/.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服务器即可。