The Linux Command Line-WILLIAM(9)-网络

321 阅读10分钟

当谈到网络,没有什么是Linux不能做的。Linux用于构建各种网络系统和设备,包括防火墙,路由,域名服务,网络存储盒 (NAS,network-attached storage)等等。

用来配置和控制命令的数量如同网络这个话题一样十分庞大。下面会讨论经常用到的命令,选择检查的命令包括用于监视网络的命令和用于传输文件的命令。另外,我们将会探索ssh程序,它用来执行远程登录。

  • ping —Send an ICMP ECHO_REQUEST to network hosts.
  • traceroute —Print the route packets trace to a network host.
  • netstat —Print network connections, routing tables, interface statistics, masquerade connections, and multicast memberships.
  • ftp —Internet file transfer program.
  • lftp —An improved Internet file transfer program.
  • wget —Non-interactive network downloader.
  • ssh —OpenSSH SSH client (remote login program).
  • scp —Secure copy (remote file copy program).
  • sftp —Secure file transfer program.

学习本章需要了解以下概念:

  • IP (Internet protocol) address

  • Host and domain name

  • URI (uniform resource identifier)

【注】:一些命令(取决于系统发行版本)可能会要求从仓库中安装额外的包以及一些需要超级用户权限

检查以及监控网络

即使不是系统管理员,检查网络的性能和运行通常也很有帮助。

ping--向网络主机发送特殊数据包

最常用的命令就是ping命令。ping命令发送一个称为 IMCP ECHO_REQUEST 特殊的网络包到指定的域名。收到此数据包的大多数网络设备都会对其进行回复,从而可以验证网络连接。

【注】:可以配置大多数网络设备(包括Linux主机)无视这个称为IMCP ECHO_REQUEST特殊的包。这通常是出于安全的考量,来使部分掩盖主机不被潜在的攻击者发现。配置防火墙禁用IMCP流量也是通常的做法。

例如,为了观察我们能否到达 www.linuxcommand.org/网站;可以使用ping…

[me@linuxbox ~]$ ping linuxcommand.org

一旦开始执行,ping命令在指定的间隔(默认为1秒)不断地发送包,直到命令中断:

[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=10
7 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=2 ttl=43 time=10
8 ms
64 bytes from vhost.sourceforge.net (66.35.250.210): icmp_seq=3 ttl=43 time=10
6 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 程序(一些系统使用类似的跟踪路径程序)显示了从本地系统到指定主机所需的所有“跳跃”网络流量的列表。例如,要查看到达http://www.slashdot.org/的路线,我们可以这样做:


[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.23
3 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.sav
vis.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.21
5 ms 41.833 ms 45.658 ms
14 csr1-ve241.elkgrovech3.savvis.net (216.64.194.42) 46.840 ms 43.372 ms 4
7.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

在输出中可以看到,从我们系统到 http:// www.slashdot.org/要穿过16个路由。对于提供标识信息的路由器,我们将看到其主机名,IP地址和性能数据,其中包括从本地系统到路由器的往返时间的三个样本。对于未提供标识信息的路由器(可能由于路由器的配置,网络拥塞,防火墙等原因)我们将会看到如同在第二跳的行中的星号。

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)

在上面例子中,我们看到系统中有两个网络接口。第一个叫做eth0 为以太网的接口;第二个名为lo ,是一个回送接口(loopback interface),一个系统用来与自身交流的虚拟接口。 当进行网络诊断的时候,要寻找的重要内容是每个接口的第四行开头都有UP字样,意味着网络接口是能够使用的,接下来是在 第二行inet addr域内存在可用的IP地址。对于使用 动态主机配置协议(DHCP,Dynamic Host Configuration Protocol )系统来讲,域内存在可用的IP地址将会确认DHCP正在运行。

使用 -r 选项将会展示内核的网络路由表。这说明了如何配置网络将数据包从一个网络发向另一个网络:

[me@linuxbox ~]$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.1.0     *               255.255.192.0   U         0 0          0 eth0
default         192.168.1.1     0.0.0.0         UG        0 0          0 eth0

在这个简单的示例中,我们看到了防火墙/路由器后面的局域网(LAN, local area network)上客户端计算机的典型路由表。清单的第一行显示目标192.168.1.0。 以零结尾的IP地址是指网络,而不是单个主机,因此,此目的地表示LAN上的任何主机。 下一个字段Gateway,是用来从现在主机到目标网络网关(路由)的名称或者IP地址,该字段中的星号表示不需要网关。

最后一行包含destination字段为default。意味着没有在表中列出的任何以此网络为目标的流量。在我们的示例中,我们看到网关被定义为地址为192.168.1.1的路由器,它知道如何处理目标流量。

netstat程序有很多选择,我们只看了几个。 查看netstat手册页以获取完整列表。

在网络上传输文件

除非我们知道如何在网络上移动文件,否则网络没有用。有许多程序可以通过网络移动数据。 我们现在将讨论其中的两个,在后面的部分中将涉及更多。

ftp--使用文件传输协议传输文件

作为其中一个十分经典的程序,ftp 来自于它使用的协议名称(File Transfer Protocol)。FTP广泛用于因特网上下载文件。大多数情况下,网络浏览器支持它,并且经常会看到以协议ftp://开头的URI。

在网络浏览器出现前,ftp就已经存在了。ftp用来与FTP服务器通信,FTP服务器包含可以通过网络上载和下载的文件。

FTP(原始格式)是不安全的,因为使用明文发送用户名与密码。这意味他们没有被加密并且任何人通过嗅探网络就能够看见他们。因此,几乎所有在因特网上的FTP都为匿名的FTP服务器。一个匿名的服务器允许任何人通过匿名以及无意义的密码登录

在以下示例中,我们展示了一个典型的会话,该会话使用ftp程序下载位于匿名FTP服务器文件服务器的/ pub/cd_images/ Ubuntu-8.04目录中的Ubuntu ISO映像。

[me@linuxbox ~]$ 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-8.04
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-8.04-desktop-
i386.iso
226 Directory send OK.
ftp> lcd Desktop
Local directory now /home/me/Desktop
ftp> get ubuntu-8.04-desktop-i386.iso
local: ubuntu-8.04-desktop-i386.iso remote: ubuntu-8.04-desktop-i386.iso
200 PORT command successful. Consider using PASV.
150 Opening BINARY mode data connection for ubuntu-8.04-desktop-i386.iso
(733079552 bytes).
226 File send OK.
733079552 bytes received in 68.56 secs (10441.5 kB/s)
ftp> bye

Table 16-1: Examples of Interactive ftp Commands

CommandMeaning
ftp fileserverInvoke the ftp program and have it connect to the FTP server fileserver.
anonymousLogin name. After the login prompt, a password prompt will appear. Some servers will accept a blank password. Others will require a password in the form of an email address. In that case, try something like user@example.com.
cd pub/cd_images/Ubuntu-8.04Change to the directory on the remote system containing the desired file. Note that on most anonymous FTP servers, the files for public downloading are found somewhere under the pub directory.
lsList the directory on the remote system.
lcd DesktopChange the directory on the local system to ~/Desktop. In the example, the ftp program was invoked when the working directory was ~. This command changes the working directory to ~/Desktop.
get ubuntu-8.04-desktop-i386.isoTell the remote system to transfer the file ubuntu-8.04-desktop-i386.iso to the local system. Since the working directory on the local system was changed to ~/Desktop, the file will be downloaded there.
byeLog off the remote server and end the ftp program session. The commands quit and exit may also be used.

在 ftp> 提示符后面键入help将会展示支持的命令列表。在一个授予了足够权限的服务器上使用ftp,是可以执行许多常规的文件管理任务。虽然 笨重但是有效。

lftp—改进的ftp

ftp不仅仅是FTP命令行客户端。事实上,它支持很多协议。其中较好的(也是更受欢迎的)是Alexander Lukyanov的lftp。它的工作方式与传统的ftp程序非常相似但是有许多额外的便利特性,包括多协议支持(包括http),下载失败自动重试,后台处理,tab键补全路径名称等等。

wget--非交互的网络下载器

另一个受欢迎的文件下载命令行程序是wget,对于无论是从 FTP还是从网站上的下载内容 都十分有用。单个文件,多个文件,甚至整个站点都可以下载。为了下载 http://www.linuxcommand.org/ 首页,执行下面命令:

[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]

程序的许多选项可以使 wget 递归的下载,在后台下载文件,以及完成一个部分下载的文件的下载。这些功能在其优于平均水平的手册页(man page)中有详细记录。

安全的与远程主机通信

在多年间,类Unix操作系统已经有能力通过远程管理。在早期,在因特网广泛应用之前,曾经有两个受欢迎的用来登陆到远程主机的程序:rlogin和telnet程序。然而,这些程序与ftp一样忍受着相同的缺陷;他们以明文形式传输其所有通信(包括登录名和密码)。这使得它们完全不适用于Internet时代。

ssh -- 安全地登录到远程计算机

为了解决这个问题,开发了一种称为SSH(安全外壳)的新协议。SSH解决了两个有关与主机通讯的两个基本问题。第一,它验证远程主机是它所说的身份(从而防止中间人攻击);第二,它加密了所有在本地与远程主机所有的通信。

SSH由两部分组成。SSH服务器运行在远程主机上,监听在22端口的传入连接;而SSH客户端在本地系统上用于与远程服务器进行通信。

大多数Linux发行版都提供了称为OpenSSH的从BSD项目中的SSH实现。一些发行版默认包括客户端与服务端包(例如Red Hat);而其他的(例如Ubuntu)只提供客户端。为了能够让系统能够接收远程连接,必须安装,配置,运行OpenSSH-server包,并且(如果系统正在运行或在防火墙后面)它必须允许TCP端口22上的传入网络连接。

调用用来连接到远程主机的SSH客户端(准确来说)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)?

首次尝试连接时,显示the authenticity of the remote host cannot be established提示信息。这是因为客户端以前从来没有见过这个远程主机。要接受远程主机的凭据,在出现提示时输入yes。一旦建立起连接,就会提示用户输入密码:

Warning: Permanently added 'remote-sys,192.168.1.4' (RSA) to the list of known
hosts.
me@remote-sys's password:

成功输入密码后,从远程系统收到命令接口提示:

Last login: Tue Aug 30 13:00:48 2011
[me@remote-sys ~]$

远程壳(shell)会话一直持续直到用户在远程壳(shell)提示中输入exit,从而关闭远程连接。此时,本地壳会话恢复,本地壳提示再次出现。

可以使用不同用户名连接远程主机,比如,如果本地用户 me 在远程主机拥有一个名为bob的用户,用户me可以使用以下方式以用户名bob登陆到远程系统:

[me@linuxbox ~]$ ssh bob@remote-sys
bob@remote-sys's password:
Last login: Tue Aug 30 13:03:21 2011
[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服务重新安装。但是,出于安全和保障的考虑,不应不排除第一种可能性。档此信息出现时要跟管理员确认。

在确定该消息是由良性原因引起的之后,可以在客户端上修正该问题。可以使用文本编辑器(如vim)编辑~/.ssh/known_hosts 文件来移除废弃的key。在上面信息中,有下面提示:

Offending key in /home/me/.ssh/known_hosts:1

这意味着在known_hosts文件中第一行包含 offending key。从文件中删除此行,然后ssh程序将能够从远程系统接受新的身份验证凭据。

除了在远程系统上打开一个shell session,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 ~]$

注意单引号的使用是因为不希望在本机上执行路径名称扩展;相反,我们想要它在远程系统上执行。同样地,如果我们希望输出重定向到远程主机文件,我们应该把重定向操作符以及文件名称放置到单引号中。

[me@linuxbox ~]$ ssh remote-sys 'ls * > dirlist.txt'

ssh信道 当通过ssh与远程主机建立连接时,通常会在本机与远程主机间会建立一条加密的信道,此信道用来允许在本地输入的命令安全的传送到远程主机并把结果安全地传送回来。除了这个基本的功能,SSH协议允许大多数类型网络流量通过此加密信道发送,从而在本地和远程系统之间创建一种VPN(虚拟专用网络)。

此功能最常见的用途可能是允许传输X 窗体 系统流量。 在运行X服务器的系统(即计算机显示GUI)上,可以在远程系统上启动并运行X客户端程序(图形应用程序),并使它的窗体出现在本地系统上。例如,假设我们位于一个运行X服务器的Linux系统linuxbox上,我们想在一个名为remote-sys的远程系统上运行xload程序,并在本地系统上查看该程序的图形输出:

[me@linuxbox ~]$ ssh -X remote-sys
me@remote-sys's password:
Last login: Mon Sep 05 13:23:11 2011
[me@remote-sys ~]$ xload

在远程主机执行命令后,在本机系统出现了窗体。在一些系统,可能要使用-y选项来完成此操作。

scp 与 sftp--安全地传输文件

Openssh安装包还包含两个程序,能够在网络上通过SSH加密信道在复制文件。第一个是scp(secure copy),其用法类似于熟悉的cp程序来复制文件。最显着的区别是,源或目标路径名前面可能带有远程主机名,后跟冒号字符。例如,如果想要从远程主机remote-sys的home目录拷贝document.txt 文档到本机现在文件夹下:

[me@linuxbox ~]$ scp remote-sys:document.txt .
me@remote-sys's password:
document.txt 100% 5581 5.5KB/s 00:00
[me@linuxbox ~]$

与ssh一样,如果所需的远程主机帐户名与本地系统的名称不匹配,则可以在远程主机名的开头应用用户名:

[me@linuxbox ~]$ scp bob@remote-sys:document.txt

第二个SSH复制文件程序是sftp,正如名称所示它是ftp程序的安全替代品。sftp的工作方式与我们之前使用的原始ftp程序非常相似;然而,不同于以明文传递信息,它使用SSH加密的信道。sftp与常规ftp相比具有重要的优势,因为它不需要在远程主机上运行FTP服务器。仅需要SSH服务端。这意味着任何可以与SSH客户端连接的远程主机同样也可以作为类似于FTP服务器来运行:

[me@linuxbox ~]$ sftp remote-sys
Connecting to remote-sys...
me@remote-sys's password:
sftp> ls
ubuntu-8.04-desktop-i386.iso
sftp> lcd Desktop
sftp> get ubuntu-8.04-desktop-i386.iso
Fetching /home/me/ubuntu-8.04-desktop-i386.iso to ubuntu-8.04-desktop-i386.iso
/home/me/ubuntu-8.04-desktop-i386.iso 100% 699MB 7.4MB/s 01:35
sftp> bye

注:在Linux发行版本中许多图形化文件管理器支持SFTP协议。使用Nautilus(GNOME)或Konqueror(KDE),我们可以在位置栏输入以sftp://为开头的URI并操作在运行SSH远程服务器的文件。

Windows上SSH客户端

在windows系统上要登陆到Linux远程服务器上。需要做什么?首先获取Windows下的SSH客户端。有许多钟选择。最受欢迎的是 Simon Tatham和其团队 的PuTTY。PuTTY程序表现为一个终端窗体并允许Windows用户在远程主机上打开SSH(或者 telnet)会话。