第十六章:网络

说到网络,Linux可能无所不能。Linux用于构建各种网络系统和设备,包括防火墙、路由器、名称服务器、网络连接存储(network-attached storage,NAS)盒等。

正如网络的主题是广泛的一样,可用于配置和控制它的命令数量也是如此。我们将只关注其中一些最常用的命令。选择用于检查的命令包括用于监视网络的命令和用于传输文件的命令。此外,我们将探索用于执行远程登录的 ssh 程序。本章将介绍以下命令:

我们将假设一点网络背景。在这个互联网时代,每个使用电脑的人都需要对网络概念有基本的了解。为了充分利用本章,我们应该熟悉以下术语:

请参阅下面的“进一步阅读”部分,了解有关这些术语的一些有用文章。

注意:我们将介绍的一些命令可能(取决于您的发行版)需要从发行版的存储库安装额外的软件包,有些可能需要超级用户权限才能执行。

第十六章:网络检查和监控网络pingtraceroute ip通过网络传输文件ftplftp —— 一个更好的 ftpcurl —— 传输URLwget —— 非交互式网络下载器与远程主机的安全通信sshSSH隧道scpsftp Windows的SSH客户端?总结

检查和监控网络

即使您不是系统管理员,检查网络的性能和操作通常也会有所帮助。

ping

最基本的网络命令是 pingping 命令向指定主机发送一个名为 ICMP ECHO_REQUEST 的特殊网络数据包。大多数接收此数据包的网络设备都会对其进行回复,从而验证网络连接。

注意:可以将大多数网络设备(包括Linux主机)配置为忽略这些数据包。这通常是出于安全原因,以部分掩盖主机免受潜在攻击者的攻击。防火墙配置为阻止ICMP流量也很常见。

例如,为了查看我们是否可以访问 linuxcommand.org (我们最喜欢的网站之一 ;-),我们可以这样使用 ping

启动后,ping会继续以指定的间隔(默认为1秒)发送数据包,直到中断。

Ctrl-c 中断后(以上示例是在第六个数据包之后), ping 会打印性能统计数据。性能正常的网络将显示0%的数据包丢失。成功的“ping”将表明网络的元素(其接口卡、布线、路由和网关)通常处于良好的工作状态。

traceroute

traceroute 程序(一些系统使用类似的 tracepath 程序)列出了从本地系统到指定主机的所有网络流量的“跳数”(hops)。例如,要查看到达 slashdot.org 的路线,我们可以这样做:

输出看起来像这样:

在输出中,我们可以看到从我们的测试系统连接到 slashdot.org 需要遍历16个路由器。对于提供标识信息的路由器,我们可以看到它们的主机名、IP地址和性能数据,其中包括从本地系统到路由器的三个往返时间样本。对于不提供标识信息的路由器(由于路由器配置、网络拥塞、防火墙等),我们在跳数2的行中看到星号。在路由信息被阻止的情况下,我们有时可以通过在 traceroute 命令中添加 -T-I 选项来克服这一点。

ip

ip 程序是一个多用途的网络配置工具,它利用了现代Linux内核中可用的全部网络功能。它取代了早期且现已弃用的 ifconfig 程序。 ip 程序用于检查各种网络设置和统计数据。通过使用它的许多选项,我们可以查看网络设置中的各种功能。通过 ip ,我们可以检查系统的网络接口和路由表。首先,接口:

在上面的例子中,我们看到我们的测试系统有三个网络接口。第一个称为 lo ,是环回接口(loopback interface),一个系统用来“与自己对话”的虚拟接口,第二个称为 enp1s0 ,是以太网接口(en=Ethernet,以太网),第三个称为 wlp2s0 是无线接口( wl =wireless,无线)...

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

接下来是路由表:

在这个简单的例子中,我们看到了防火墙/路由器后面局域网(LAN)上客户端机器的典型路由表。以零结尾的IP地址指的是网络,而不是单个主机,因此这个目的地意味着可以直接访问局域网上的任何主机。我们看到列出了两个网络:169.254.0.0192.168.1.0 。现在, 192.168.1.0 网络是我们的局域网,但 169.254.0.0 是什么?好吧,这是一种称为自动私有IP寻址(Automatic Private IP Addressing ,APIPA)的网络技巧。它用于在DHCP服务器不可用时自动分配IP地址。

第一行包含目标 default (默认值)。这意味着将任何发往表中未列出的网络的流量发送到此地址。在我们的示例中,我们看到默认网关被定义为地址为192.168.1.1的路由器(家庭路由器的典型地址),它可能知道如何处理目标流量。

ip 命令是一个复杂的程序,有许多选项和命令。命令语法由以下部分组成:

ip [ -options ] object [ command ]

在前面的示例中,我们使用了 show 命令的对象 addressroute 。为了方便起见, ip 允许将对象名称缩短为单个字符,并且由于显示了默认命令,我们可以将命令缩短为 ip aip r ,并获得相同的结果。

通过网络传输文件

除非我们能在网络上移动文件,否则网络有什么用?有许多程序可以通过网络传输数据。我们现在将介绍其中两个,在后面的章节中还会介绍几个。

ftp

作为真正的“经典”程序之一, ftp 的名字来自它使用的协议,即文件传输协议(File Transfer Protocol)。FTP曾经是通过互联网下载文件最广泛使用的方法。一些web浏览器仍然支持它,我们可能会看到URI以协议 ftp:// 开头。

在有网络浏览器之前,就已经有 ftp 程序了。 ftp 用于与 FTP server 通信,FTP服务器包含可以通过网络上传和下载的文件。

FTP(原始形式)不安全,因为它以明文形式发送帐户名和密码。这意味着它们没有加密,任何嗅探(sniffing)网络的人都可以看到它们。因此,几乎所有通过互联网完成的FTP都是由匿名FTP服务器(anonymous FTP servers)完成的。匿名服务器允许任何人使用登录名 anonymous 和无意义的密码登录。

在下面的示例中,我们展示了一个虚构的会话,其中 ftp 程序正在下载位于匿名FTP服务器 fileserver/pub/cd_images/Ubuntu-24.04 目录中的Ubuntu ISO映像:

下表解释了在此会话期间输入的命令:

命令含义
ftp fileserver调用ftp程序并将其连接到FTP服务器 fileserver
anonymous登录名。登录提示后,将出现密码提示。一些服务器将接受空白密码;其他的则需要电子邮件地址形式的密码。那样的话,试试这样的 user@example.com
cd path切换到远程系统上包含所需文件的目录。请注意,在大多数匿名FTP服务器上,公共下载的文件位于 pub 目录下的某个位置。
ls列出远程系统上的目录。
lcd Desktop将本地系统上的目录更改为 ~/Desktop 。在该示例中,当工作目录为 ~ 时调用了 ftp 程序。此命令将工作目录更改为 ~/Desktop
get file告诉远程系统将文件 file 传输到本地系统。由于本地系统上的工作目录已更改为~/Desktop,因此文件将在那里下载。
bye注销远程服务器并结束 ftp 程序会话。也可以使用 quitexit 命令。

ftp> 提示符下键入 help 将显示支持的命令列表。在已授予足够权限的服务器上使用 ftp ,可以执行许多普通的文件管理任务。它很笨拙,但确实有效。

lftp —— 一个更好的 ftp

ftp 不是唯一的命令行FTP客户端。事实上,有很多。其中一个更好(也更受欢迎)的是亚历山大·卢基扬诺夫的 lftp 。它的工作原理与传统的 ftp 程序非常相似,但有许多额外的便利功能,包括多协议支持(包括HTTP)、下载失败时的自动重试、后台进程、路径名的标签完成等等。

curl —— 传输URL

另一个流行的文件传输程序是 curl 。它最基本的用法是这样的:

我们指定一个URL, curl 下载URL的第一页并将其输出到标准输出。可以指定多个URL。 curl支持大多数网络协议,包括HTTP、HTTPS、FTP、IMAP、POP3、SFTP、SMB等。下表列出了 curl 支持的许多选项中的一些:

选项含义
-o,--output file将输出发送到指定 file ,而不是标准输出。
-O,--remote-name类似 -o ,但将本地文件的名称与远程文件的名称相同。
-s,--silent静默方式,抑制进度计和错误消息。
-u,--proxy-user user:passwd指定用户名/密码组合。
-v,--verbose执行时显示详细消息。

curl 手册页涵盖了所有可怕的细节。

wget —— 非交互式网络下载器

另一个用于文件下载的命令行程序是 wget 。它对于从web和FTP站点下载内容都很有用。可以下载单个文件、多个文件,甚至整个网站。要下载 linuxcommand.org 的第一页,我们可以这样做:

该程序的许多选项允许 wget 递归下载,在后台下载文件(允许您注销但继续下载),并完成部分下载文件的下载。这些功能在其优于平均水平的手册页中得到了很好的记录。

与远程主机的安全通信

多年来,类Unix操作系统已经能够通过网络进行远程管理。在互联网普遍采用之前的早期,有几个流行的程序用于登录远程主机。这些是 rlogintelnet 程序。然而,这些程序与 ftp 程序一样存在致命的缺陷;它们以明文形式传输所有通信(包括登录名和密码)。这使得它们完全不适合在互联网时代使用。

ssh

为了解决这个问题,开发了一种名为Secure Shell(SSH)的新协议。SSH解决了与远程主机进行安全通信的两个基本问题。

  1. 它验证远程主机是它所说的主机(从而防止所谓的中间人攻击)。
  2. 它加密本地和远程主机之间的所有通信。

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

大多数Linux发行版都附带了OpenBSD项目中名为OpenSSH的SSH实现。默认情况下,一些发行版包括客户端和服务器端软件包,而另一些发行版只提供客户端。为了使系统能够接收远程连接,它必须安装、配置并运行 OpOpenSSH-server 包,并且(如果系统正在运行或位于防火墙后面)它必须允许TCP端口22上的传入网络连接。

提示:如果您没有要连接的远程系统,但想尝试这些示例,请确保您的系统上安装了 OpenSSH-server 包,并使用 localhost 作为远程主机的名称。这样,您的机器将与自己建立网络连接。

用于连接到远程SSH服务器的SSH客户端程序被恰当地称为SSH。要连接到名为 remote-sys 的远程主机,我们将使用 ssh 客户端程序,如下所示:

首次尝试连接时,将显示一条消息,指示无法建立远程主机的真实性。这是因为客户端程序以前从未见过此远程主机。要接受远程主机的凭据,请在提示时输入 yes 。连接建立后,系统会提示用户输入密码:

成功输入密码后,我们会收到来自远程系统的shell提示:

远程shell会话将继续,直到用户在远程shell提示符处输入 exit 命令,从而关闭远程连接。此时,本地shell会话恢复,本地shell提示符重新出现。

也可以使用不同的用户名连接到远程系统。例如,如果本地用户 me 在远程系统上有一个名为 bob 的帐户,则用户 me 可以按如下方式登录到远程系统上的帐户 bob

如前所述,ssh验证远程主机的真实性。如果远程主机未成功通过身份验证,将显示以下消息:

此消息是由两种可能的情况之一引起的。首先,攻击者可能正在试图进行中间人攻击。这种情况很少见,因为每个人都知道 ssh 会提醒用户注意这一点。更有可能的罪魁祸首是远程系统发生了某种变化;例如,其操作系统或SSH服务器已被重新安装。然而,为了安全起见,不应立即排除第一种可能性。出现此消息时,请务必与远程系统的管理员联系

在确定消息是由良性原因引起的之后,在客户端纠正问题是安全的。这是通过使用警告消息提供的建议来完成的:

如果做不到这一点,我们可以使用文本编辑器(也许是 vim )从 ~/.ssh/known_hosts 文件中删除过时的密钥。在上面的示例消息中,我们看到:

这意味着 known_hosts 文件的第42行包含违规(offending)密钥。从文件中删除此行, ssh 程序将能够接受来自远程系统的新身份验证凭据。

除了在远程系统上打开shell会话外, ssh 还允许我们在远程系统中执行单个命令。例如,要在名为 remotesys 的远程主机上执行 free 命令并在本地系统上显示结果,请使用以下命令:

可以以更有趣的方式使用此技术,例如以下示例,其中我们在远程系统上执行 ls 并将输出重定向到本地系统上的文件:

请注意上面命令中单引号的使用。这样做是因为我们不希望在本地计算机上执行路径名扩展;相反,我们希望它在远程系统上执行。同样,如果我们希望将输出重定向到远程计算机上的文件,我们可以将重定向运算符和文件名放在单引号内:

SSH隧道

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

也许此功能最常见的用途是允许传输X Window系统流量。在仍运行X服务器的系统上(而不是使用Wayland的现代系统),可以在远程系统上启动和运行X客户端程序(图形应用程序),并使其显示在本地系统上。这很容易做到;这里有一个例子。假设我们坐在一个名为 linuxbox 的Linux系统上,该系统运行着一个X服务器,我们想在名为 remote-sys 的远程系统上运行 xload 程序,以查看该程序在本地系统上的图形输出。我们可以这样做:

在远程系统上执行xload命令后,其窗口将出现在本地系统上。在某些系统中,您可能需要使用 -Y 选项而不是 -X 选项来执行此操作。

scpsftp

OpenSSH软件包还包括两个程序,可以利用SSH加密的隧道(SSH-encrypted tunnel)在网络上复制文件。第一个程序 scp(secure copy,安全复制)的使用方式与熟悉的 cp 程序非常相似。最显著的区别是,源或目标路径名前面可能有远程主机的名称,后面跟着冒号字符。例如,如果我们想将名为 document.txt 的文档从远程系统 remote-sys 上的主目录复制到本地系统上的当前工作目录,我们可以这样做:

ssh 一样,如果所需的远程主机帐户名与本地系统的帐户名不匹配,您可以将用户名应用于远程主机名的开头。

第二个SSH文件复制程序是 sftp ,顾名思义,它是 ftp 程序的安全替代品。 sftp 的工作原理与我们之前使用的原始 ftp 程序非常相似;然而,它使用SSH加密的隧道,而不是以明文形式传输所有内容。 sftp 比传统的 ftp 有一个重要的优势,因为它不需要在远程主机上运行FTP服务器。它只需要SSH服务器。这意味着任何可以连接SSH客户端的远程机器也可以用作类似FTP的服务器。以下是一个示例会话:

提示:Linux发行版中的许多图形文件管理器都支持SFTP协议。使用GNOME或KDE,我们可以在位置栏中输入一个以 sftp:// 开头的URI,并对运行SSH服务器的远程系统上存储的文件进行操作。

Windows的SSH客户端?

假设你坐在一台Windows机器上,但你需要登录到你的Linux服务器并完成一些真正的工作;你是做什么的?当然,为您的Windows设备获取SSH客户端程序!这样的例子有很多。最受欢迎的可能是Simon Tatham和他的团队的PuTTY。PuTTY程序显示一个终端窗口,并允许Windows用户在远程主机上打开SSH(或 telnet )会话。该程序还为 scpsftp 程序提供了类似程序。

【Windows命令行和power shell都可以作为ssh客户端工作窗口】

总结

在本章中,我们调查了大多数Linux系统上的一些网络工具。由于Linux在服务器和网络设备中的应用如此广泛,因此可以通过安装其他软件来添加更多内容。但是,即使使用基本的工具集,也可以执行许多有用的网络相关任务。