精通-Linux-网络管理-全-
精通 Linux 网络管理(全)
原文:
zh.annas-archive.org/md5/BC997E7C6B3B022A741EFE162560B1CA
译者:飞龙
前言
在本书中,我们将学习管理真实基于 Linux 的网络所需的概念。目标是帮助读者从初学者或中级水平的 Linux 用户成长为能够管理和支持真实基于 Linux 的网络的人。本书以一些介绍性章节开始,读者将在其中设置他们的环境,然后刷新一些基础知识,这将成为本书其余部分的基础。从那里开始,将涵盖更高级的主题,并提供有用的示例,读者将能够跟随并获得宝贵的实践经验。
在这个旅程中,我们将涵盖网络管理员通常会在工作中执行的任务,如安装 Linux、设置 DHCP、共享文件、IP 地址分配、监控资源等。这些示例不仅涵盖了两种流行的发行版,Debian 和 CentOS。由于这两种发行版在企业中非常流行,读者将能够很好地准备管理基于其中一种或另一种(以及基于它们的无数其他发行版)的网络。
最后几章将涵盖防止入侵和攻击的最佳实践,以及在出现问题时为您提供帮助的故障排除。
本书涵盖了什么
第一章,“设置您的环境”,涵盖了为本书使用设置实验室环境的过程。涵盖了安装 Debian 和 CentOS,以及使用虚拟机的利弊。
第二章,“重新审视 Linux 网络基础”,为读者刷新了提供本书其余部分基础的核心 Linux 概念,如 TCP/IP、主机名解析和 IP 和 net 工具套件。
第三章,“通过 SSH 在节点之间通信”,涵盖了所有与 SSH 有关的内容。在本章中,我们将看看如何使用 SSH 以及如何设置 OpenSSH 服务器以允许其他节点连接。还介绍了scp
命令,允许我们将文件从一台机器传输到另一台机器。
第四章,“设置文件服务器”,涵盖了 Samba 和 NFS。在这里,我们将讨论何时适合使用其中一个,以及配置和挂载这些共享文件。
第五章,“监控系统资源”,涉及监控我们 Linux 系统上的资源,如检查可用磁盘空间、检查可用内存、日志轮转和查看日志。
第六章,“配置网络服务”,涵盖了使我们的网络运行的服务。这里涵盖了 DHCP 和 DNS 服务器等主题。还介绍了 NTP。
第七章,“通过 Apache 托管 HTTP 内容”,涵盖了 Apache,目前是世界上使用最多的 Web 服务器软件。在这里,我们不仅会安装 Apache,还会配置和管理模块。还涵盖了虚拟主机。
第八章,“理解高级网络概念”,将读者带入下一个层次,讨论更高级的主题,如子网划分、服务质量、DHCP 和 DNS 中的冗余等。
第九章,“保护您的网络”,涉及加固系统以防止未经授权访问。在这里,我们将涵盖 iptables、fail2ban、SELinux 等内容。
第十章,“故障排除网络问题”,通过一些故障排除技巧来总结我们的旅程,如果遇到问题,您可以使用这些技巧。
您需要为本书准备什么
这本书要求你至少有一台能够运行 Debian 或 CentOS 的计算机,最好是两者都能运行。你可以在虚拟机或物理硬件上运行它们都没关系,唯一的要求是你应该能够安装这两个发行版并通过终端访问它们。这些安装需要 root 级别的访问权限。
虽然你肯定可以使用你已经拥有的任何 Linux 安装,但强烈建议你有单独的、全新的安装来使用,因为我们的一些主题如果在生产网络上运行可能会有破坏性。如果你有疑问,VirtualBox 或者你可能有闲置的旧机器都可以。需要网络访问,但这是不言而喻的,考虑到本书的主题。
需要一些基本的 Linux 知识。用户不需要是高级用户,因为本书的目的是升级你现有的知识。话虽如此,为了获得最顺利的体验,你应该已经熟悉一些东西。首先,你应该已经知道如何使用文本编辑器修改配置文件。本书不假设你使用哪种文本编辑器,这完全取决于你。只要你了解任何文本编辑器,无论是 nano、vim,甚至 gedit——你都处于良好状态。如果你能打开一个属于 root 的配置文件,然后进行更改并保存它——你就已经准备好了。如果有疑问,nano 是初学者的好文本编辑器,只需要几分钟就能学会。对于更高级的用户,vim 是一个不错的选择。说到 root,你还应该了解以 root 用户或普通用户身份运行命令的区别。此外,你应该能够浏览文件系统并四处浏览。
然而,即使你需要复习文本文件的编辑或切换到 root 用户,也不要让这成为阻碍。在线上有很多知识可以帮助你复习,Linux 可用的大多数文本编辑器都提供了非常好的文档。
这本书是为谁准备的
这本书的目标读者是那些已经了解 Linux 基础知识,想要学习如何管理基于 Linux 的网络或将自己的技能提升到更高水平的用户。这可以是为了支持全 Linux 网络,甚至是混合环境。本书将读者带入从安装 Debian 等较为简单的主题,到子网划分等更为高级的概念。通过本书,你应该有足够的知识来建立一个完全网络化的环境,包括这样一个网络应该具备的所有组件。如果这激发了你的兴趣,那么这本书绝对适合你!
然而,在本书中,我们专注于与 Linux 相关的真实世界例子。如果你的目标是获得思科认证或其他高级认证,那么这可能不是最适合你的地方。在这里,一切都是关于实际例子,而不是过多关注理论。虽然认证复习书很好,但在本书中,我们做的是真实的事情——如果你的老板或客户要求你实施 Linux 网络,那么这些就是你需要做的事情。如果这是你的目标,那么你肯定来对地方了。
惯例
在本书中,你会发现一些文本样式,用于区分不同类型的信息。以下是一些这些样式的例子及其含义的解释。
文本中的代码词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 用户名显示如下:“在大多数情况下,这将是/dev/sda
。”
代码块设置如下:
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
option domain-name "local.lan";
authoritative;
subnet 10.10.96.0 netmask 255.255.252.0 {
range 10.10.99.100 10.10.99.254;
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
}
任何命令行输入或输出都以如下形式书写:
systemctl status httpd
需要以 root 权限运行的任何命令都将以#
字符为前缀,如下所示:
# yum install httpd
新术语和重要单词以粗体显示。例如,屏幕上看到的单词,例如菜单或对话框中的单词,会以这样的方式出现在文本中:"完成后,您可以通过单击扫描,然后保存扫描来保存结果。"
注意
警告或重要说明会以这样的方式出现在框中。
提示
提示和技巧会以这种方式出现。
读者反馈
我们始终欢迎读者的反馈。请告诉我们您对本书的看法——您喜欢或不喜欢的地方。读者的反馈对我们很重要,因为它帮助我们开发您真正能够从中获益的标题。
要向我们发送一般反馈,只需发送电子邮件<feedback@packtpub.com>
,并在消息主题中提及书名。
如果您在某个专题上有专业知识,并且有兴趣撰写或为书籍做出贡献,请参阅我们的作者指南www.packtpub.com/authors。
客户支持
现在您是 Packt 书籍的自豪所有者,我们有一些事情可以帮助您充分利用您的购买。
下载示例代码
您可以从您在www.packtpub.com
的帐户中下载所有您购买的 Packt Publishing 书籍的示例代码文件。如果您在其他地方购买了本书,您可以访问www.packtpub.com/support
并注册,以便文件直接发送到您的电子邮件。
下载本书的彩色图像
我们还为您提供了一个包含本书中使用的屏幕截图/图表的彩色图像的 PDF 文件。彩色图像将帮助您更好地理解输出中的变化。您可以从www.packtpub.com/sites/default/files/downloads/9597OS_ColorImages.pdf
下载此文件。
勘误
尽管我们已经尽一切努力确保内容的准确性,但错误还是会发生。如果您在我们的书中发现错误——可能是文本或代码中的错误——我们将不胜感激,如果您能向我们报告。通过这样做,您可以帮助其他读者避免挫折,并帮助我们改进本书的后续版本。如果您发现任何勘误,请访问www.packtpub.com/submit-errata
报告,选择您的书,点击勘误提交表链接,并输入您的勘误详情。一旦您的勘误经过验证,您的提交将被接受,并且勘误将被上传到我们的网站或添加到该书标题的勘误部分下的任何现有勘误列表中。
要查看先前提交的勘误,请访问www.packtpub.com/books/content/support
,并在搜索字段中输入书名。所需信息将出现在勘误部分下。
盗版
互联网上的版权盗版是所有媒体的持续问题。在 Packt,我们非常重视版权和许可的保护。如果您在互联网上发现我们作品的任何非法副本,请立即向我们提供位置地址或网站名称,以便我们采取补救措施。
请通过<copyright@packtpub.com>
与我们联系,并附上涉嫌盗版材料的链接。
我们感谢您帮助我们保护我们的作者和我们提供有价值内容的能力。
问题
如果您对本书的任何方面有问题,可以通过<questions@packtpub.com>
与我们联系,我们将尽力解决问题。
第一章:设置您的环境
欢迎来到 Linux 网络世界!本书将指导您完善 Linux 网络管理技能。在本章中,我们将讨论启动和运行环境所需的内容。我们将讨论一些对企业网络感兴趣的 Linux 发行版,设置家庭或办公环境时需要注意的事项,以便您可以跟着本书进行学习,并设置一些我们将在本书中使用的 Linux 安装的最佳实践。基本上,我们将奠定您用来发展技能的基础。
在本章中,我们将涵盖:
-
入门
-
要考虑的发行版
-
物理机与虚拟机
-
设置和配置 VirtualBox
-
获取和安装 Debian 8
-
CentOS 7 的获取和安装
入门
在 Linux 中进行网络管理是一个有趣、多样化且不断变化的领域。虽然核心组件通常在多年间保持不变(如TCP/IP协议),但这些服务的管理方式在每一代中都有所发展,比如systemd的兴起。Linux 绝对令人兴奋。
在本章中,我们将看到如何设置您的环境。根据您的经验水平,您可以直接跳转到第二章,重新审视 Linux 网络基础。如果您已经熟悉在物理或虚拟机上安装一个或两个发行版,那么您已经具备了开始的知识。在这里,我们将讨论如何安装本书中练习所需的一些发行版以及一些一般指导。
简而言之,您拥有的 Linux 安装越多,越好。在练习网络概念时,最好尽可能多地拥有节点,这样您可以测试您的配置更改将如何影响您的环境。如果您已经熟悉安装 Linux,可以随意设置一些节点,然后我会在下一章与您见面。
要考虑的发行版
今天存在着一百多个 Linux 发行版。这些包括专门面向工作站或服务器(甚至两者兼顾)的发行版,以及解决特定任务的专业发行版,比如 Kali、Mythbuntu 和 Clonezilla。当学习诸如网络管理之类的概念时,人们可能会首先想到从哪些发行版开始。
让我们不要专注于任何一个发行版。在企业中,没有两个数据中心是相同的。一些利用 Linux 的组织可能会将特定的发行版集(例如 Ubuntu 和 Ubuntu Server)标准化,尽管更常见的情况是看到一种或多种发行版的混合使用。在基于 Linux 的网络中,SUSE Enterprise Linux、Red Hat Enterprise Linux、Ubuntu Server、CentOS和Debian等发行版在服务器中非常常见。根据我的经验,我经常看到使用 Debian(以及其衍生版)和基于 Red Hat 的发行版。
鼓励你尝试并混合你可能喜欢的任何发行版。有很多候选者,像www.distrowatch.com这样的网站会给你列出可能性。特别是为了这本书中的例子,推荐你使用 CentOS 和 Debian。事实上,这两个发行版是一个很好的起点。你将品尝到两种不同形式的软件包管理(rpm和deb软件包),并熟悉两种最流行的发行版。关于 Debian,有很多发行版都是基于它的(Ubuntu,Linux Mint等)。通过学习如何管理 Debian 安装,很多知识都可以转移到其他发行版,如果你考虑切换的话。同样的情况也适用于基于 Red Hat 的 CentOS。Red Hat 是一个非常流行的发行版,而 CentOS 是从其源代码创建的,你基本上也在学习它。虽然Fedora比 Red Hat 或 CentOS 更前沿,但很多知识在那里也会有用;Fedora 作为工作站发行版也很受欢迎。
本书中的示例在 CentOS 和 Debian 中进行了测试。每当指令特定于某个发行版时,我会告诉你。在本书的目的上,拥有 CentOS 和 Debian 的安装将适合你,但请随意尝试。就这些发行版的个别版本而言,都使用了 CentOS 7 和 Debian 8。在你的环境或家庭实验室中安装这些。
物理机器与虚拟机器
在一本网络书中看到虚拟机的部分可能会有些意外。公平地说,这确实有些不合适。除了作为一个重要的企业平台外,虚拟化也可以是一个宝贵的学习工具。在真实的网络中,技术人员可能会在虚拟机中测试服务,然后再将其部署到环境中。例如,一个新的DNS服务器可能首先作为一个VM启动,然后一旦经过测试和验证,就可以移入组织中供使用。这种方法的一个好处是你可以在开发解决方案时拍摄多个快照,如果出错破坏了,你可以恢复快照,从已知工作状态开始。
就我们掌握 Linux 网络技能而言,虚拟机允许你测试不同发行版之间的过程差异。启动虚拟机很容易,而且更容易销毁它。如果你受到物理硬件的限制,那么虚拟机可能为你提供一个机会来构建一个小型虚拟网络进行练习。当然,虚拟机的折衷是它们使用了多少内存。然而,没有图形界面,大多数 Linux 发行版只需 512MB 内存就可以运行得相当舒适。如今,有相当多的计算机配备了 8GB 甚至 16GB 的内存,所以即使是当今可用的预算计算机上也应该能够运行几个虚拟机。
公平地说,使用虚拟机进行练习和学习并不总是理想的。事实上,在学习网络时,通常更喜欢使用物理设备。虽然你当然可以通过在虚拟机中运行 Apache 来练习设置和提供网页,但在这样的环境中你无法练习安装和配置交换机和路由器。在可能的情况下,尽量使用物理设备。然而,虚拟机为你提供了一个独特的机会,可以在你的网络上创建一个小型节点的军队来维护。
当然,并非每个人都有一堆戴尔塔在壁橱里等着安装全新 Linux 的机会。根据你手头的资源,你可以使用所有物理机器或物理和虚拟机器的混合。在这本书中,我们不会对你的库存做任何假设。游戏的关键是管理节点,所以尽可能设置多个节点。
在本书中,讨论了VirtualBox。但这绝不是创建虚拟机的唯一解决方案。还有其他解决方案,如KVM、Xen、VMware等。VirtualBox 的好处是免费、开源和跨平台(适用于 Linux、Mac OS X 和 Windows),因此它很可能在您的环境中运行。在大多数情况下,它甚至比 KVM 或 Xen 更容易设置(但可能没有那么酷)。您不必使用 VirtualBox(或者根本不使用虚拟机)来跟随本书。使用您喜欢的任何解决方案。在本书中,我尽量不限制说明到任何一个特定的解决方案,因此内容适用于尽可能多的人。
设置和配置 VirtualBox
如果您决定在您的环境中使用 VirtualBox(无论是用于学习、测试发行版,还是在实施网络服务之前评估),我们将在本活动中设置我们的 VirtualBox 主机。
获取 VirtualBox
实际上,下载和安装 VirtualBox 相当简单,但每个平台都有其独特的怪癖。在 Windows 中,初始安装只是导航到以下网站,下载安装程序并运行安装向导:
www.virtualbox.org/wiki/Downloads
安装后,您只需要跳转到本章的下载和安装扩展包部分。在 Mac OS X 上安装也很简单。
对于 Linux,有几种安装 VirtualBox 的方法。一种方法是使用您的软件包管理器,如果您的发行版已经在其存储库中提供了它。不幸的是,根据您的发行版版本,可能包含的 VirtualBox 版本很可能已经过时。例如,Debian 通常在其存储库中包含较旧的软件包,但像 Arch 这样的最新发行版更有可能包含最新和最好的软件包。
也许更好的获取 VirtualBox 的方法是将 VirtualBox 本身提供的存储库导入到您的系统中。以下 URL 列出了 Debian 存储库的列表,甚至提供了一种为基于 RPM 的发行版(如 Fedora、Red Hat 等)添加存储库的方法:
www.virtualbox.org/wiki/Linux_Downloads
例如,使用页面上的说明作为指南,我们可以在基于 Debian 的系统上运行以下过程。但是,Oracle 可能随时更改他们的说明和存储库列表;在安装之前始终查阅之前的 URL,以查看过程是否已更改。
为了验证我们将添加正确的版本,我们需要确定要使用哪个存储库。这取决于您正在运行的发行版,因此一定要查阅 VirtualBox 网站上的文档,以确保您导入了正确的存储库。
对于 Debian 8 "Jessie",我们将使用以下命令:
deb http://download.virtualbox.org/virtualbox/debian jessie contrib
要将此存储库添加到我们的 Debian 系统中,我们将使用以下命令:
# echo "deb http://download.virtualbox.org/virtualbox/debian jessie contrib" > /etc/apt/sources.list.d/virtualbox.list
然后,我们可以使用以下命令为存储库添加公钥:
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | apt-key add -
从现在开始,我们可以在我们的存储库中找到 Oracle 的 VirtualBox 软件包并安装它。为此,让我们首先使用以下命令更新我们的软件包列表(作为 root 用户):
# apt-get update
然后使用以下命令安装 VirtualBox:
# apt-get install dkms virtualbox-4.3
注意
只要选择适当的匹配存储库,这种安装方法对于 Ubuntu 也适用。
对于 Fedora、Red Hat Enterprise Linux(RHEL)和 openSUSE 等发行版,Oracle 提供了类似的说明。
可以通过以下命令下载公钥:
# wget -q https://www.virtualbox.org/download/oracle_vbox.asc -O- | rpm --import -
为了将存储库添加到 Fedora 系统中,执行以下命令:
# wget -P /etc/yum/repos.d/ http://download.virtualbox.org/virtualbox/rpm/fedora/virtualbox.repo
添加存储库后,可以使用以下命令安装 VirtualBox:
# yum install VirtualBox-4.3
此外,OpenSUSE 和 RHEL 的说明也可以在 VirtualBox 网站上找到。有关更多详细信息,请参阅 VirtualBox 网站www.virtualbox.org
。
下载和安装扩展包
Oracle 提供了一个扩展包,它可以启用 USB 支持以及预引导执行环境(PXE)引导支持。您可能需要也可能不需要这些功能。如果您认为您可以从主机 PC 插入闪存驱动器并在虚拟机内访问它会有所帮助,那么安装这个扩展包可能是个好主意。
注意
由于许可问题,扩展包并未内置到 VirtualBox 中。如果您希望了解更多信息,请随时查阅 VirtualBox 许可协议。
扩展包的安装过程基本相同,无论您的主机计算机运行的是 Linux、Windows 还是 Mac OS X。但是,如果您的主机运行的是 Linux,则还有一个额外的步骤,即将您的用户帐户添加到vboxusers
组中。
- 当您首次安装 VirtualBox 时,应该已经创建了这个组。要验证,请执行以下命令:
cat /etc/group |grep vboxusers
- 您应该看到类似以下的输出:
vboxusers:x:1000:username
- 如果您看不到输出,请使用以下命令创建组:
# groupadd vboxusers
- 然后,将自己添加到该组:
# usermod -aG vboxusers yourusername
注意
您需要注销然后登录,才能将自己添加到vboxusers
组中。
现在,您可以安装扩展包了。无论您的基础操作系统如何,此过程应该是相同的。首先,从以下 URL 下载扩展包并将其保存在本地:
www.virtualbox.org/wiki/Downloads
下载后,按照以下步骤进行:
- 打开 VirtualBox 并转到文件 | 首选项...。
在 VirtualBox 中访问文件菜单
- 接下来,点击扩展,然后点击右侧的绿色三角形图标。
VirtualBox 设置
- 选择您之前下载的扩展包,然后点击打开。
扩展包选择
- 然后,您将被要求确认安装。点击安装。
扩展包安装的确认
- 将显示 VirtualBox 许可协议。请随意查看。然后,滚动到底部,点击我同意进行确认。
VirtualBox 许可协议
- 如果您运行的是 Linux,可能会要求您输入 root 或 sudo 密码。如果是这样,请输入并继续。经过身份验证后,您应该会看到成功安装扩展包的确认。
成功安装 VirtualBox 扩展包的确认
完成此过程后,VirtualBox 将在您的计算机上运行。
注意
在某些发行版中,密码提示可能不会出现,导致扩展包的安装失败。如果发生这种情况,请使用以下命令以 root 权限运行 VirtualBox:
sudo VirtualBox
然后,尝试重新安装扩展包。完成后,关闭 VirtualBox,然后以普通用户身份重新打开。
获取并安装 Debian 8
为了安装 Debian,我们首先需要获取一个ISO 镜像文件。要做到这一点,请转到以下 URL:
www.debian.org/distrib/netinst
有几个下载选项,但netinst ISO 将是我们的目标。对于大多数计算机来说,64 位(amd64)版本应该足够了——除非你确定你的计算机不支持 64 位。netinst 和完整安装镜像的主要区别在于 netinst 版本将从 Debian 的服务器上通过互联网下载所需的内容。只要你不在带宽受限的地区,这应该不是问题。
当然,ISO 文件本身是没有用的,除非你将它附加到虚拟机上。如果是的话,那么你就准备好了。如果你要设置一个物理机器,你需要使用你选择的光盘制作工具创建一个可引导的光盘,或者创建一个可引导的闪存驱动器。
注意
由于有大量不同的光盘制作工具可用,不可能完全介绍如何在你的环境中创建可引导光盘。在大多数情况下,你的工具应该有一个选项在菜单中烧录 ISO 镜像。如果你只是创建了一个数据光盘,那么光盘将无法作为 Debian 安装媒体使用。
安装 Debian 8 的步骤如下:
- 在 Linux 系统中,你可以使用以下命令创建一个可引导的 Debian 闪存驱动器:
# cp name-of-debian.iso /dev/sd? && sync
- 基本上,我们是直接将下载的 ISO 镜像复制到闪存驱动器上。当然,根据你的系统更改文件名和目标。要确定要使用的设备节点,执行以下命令:
# fdisk -l
- 在输出中,你应该看到你的闪存驱动器的节点指定。该命令的输出将如下所示:
Device Boot Start End Sectors Size Id Type
/dev/sdb1 2048 60563455 60561408 28.9G 83 Linux
- 然后,
/dev/sdb
将是用来创建闪存驱动器的设备。将所有内容放在一起,我们将使用以下命令创建闪存驱动器:
# cp name-of-debian.iso /dev/sdb && sync
提示
下载示例代码
你可以从你在www.packtpub.com
的帐户中为你购买的所有 Packt Publishing 图书下载示例代码文件。如果你在其他地方购买了这本书,你可以访问www.packtpub.com/support
并注册,文件将直接通过电子邮件发送给你。
- 创建了可引导媒体后,将其插入计算机,按照计算机的具体指示访问引导菜单并选择你的 Debian 媒体。加载完成后,第一个屏幕会要求你选择语言。选择你的语言,然后点击继续。
Debian 安装程序的语言选择屏幕
- 选择语言后,下一个屏幕将让你选择你的位置。选择它,然后点击继续。
Debian 安装程序中的语言选择
- 同样,选择适合你键盘的键盘映射,然后点击继续。
Debian 安装程序的键盘选择屏幕
- 此时,Debian 安装程序将检测你的硬件,然后允许你配置主机名。对于这个选项,选择一个在网络上能识别你的设备的唯一主机名。完成后,点击继续。
在 Debian 安装过程中选择主机名
- 然后安装程序将要求你输入你的域名。如果你有域名,请在此处输入;否则,留空。点击继续。
在安装 Debian 时配置域名
- 接下来,你将被要求为root账户设置密码。为此,你应该创建一个唯一的(最好是随机生成的)密码。你可能知道,root 账户对系统有完全访问权限。设置密码后,点击继续。
在 Debian 安装过程中输入 root 密码
- 在接下来的三个屏幕中,您将设置您的用户帐户。首先,输入您的名字和姓氏,然后单击“继续”。
设置主要用户帐户的第一个屏幕
- 然后,输入用户名,然后单击“继续”。
创建用户名
- 用户设置部分的最后一部分将要求您创建一个密码。完成后,再次单击“继续”。
为主要用户设置密码
- 接下来,Debian 将尝试使用网络时间协议(NTP),如果可用,来配置您的时钟。然后,您将看到一个屏幕,以选择您的时区。确保您的时区被突出显示,然后单击“继续”。
配置您的位置,用于时区
- 现在,我们将对磁盘进行分区。随意对磁盘进行分区,因为就本书而言,没有分区要求。为了本说明,选择了 Debian 的默认选项引导-使用整个磁盘。如果您有首选的分区方案,请随意使用。完成后,单击“继续”。
Debian 安装的分区部分的第一个屏幕
- 接下来,您将不得不选择要安装 Debian 的硬盘。在本例中,虚拟机中只有一个可用的硬盘,用于捕获该过程。如果您有多个硬盘,请选择适当的硬盘进行安装,然后单击“继续”。
选择 Debian 的目标磁盘
- 在接下来的部分,Debian 安装程序将询问您是否想要有一个单独的
/home
分区(如果您希望在安装之间保留文件,则建议使用),单独的/home
,/var
和/tmp
分区,或者所有文件在一个分区中。本书没有分区要求,因此选择最符合您偏好的选项。选择完毕后,单击“继续”。
磁盘分区选择
- 接下来,Debian 将显示即将进行的更改摘要。如果这些更改对您来说看起来不错,请确保完成分区并将更改写入磁盘被突出显示,然后单击“继续”。
分区概述
- 然后,您将不得不再次确认详细信息。选择是,然后单击“继续”。
确认分区更改
- 接下来将安装基本系统;这可能需要一些时间,具体取决于您的计算机和硬盘的速度。之后,您将看到一个屏幕,您将在其中选择最接近您的国家,以设置 Debian 的软件包管理器。
选择软件包管理器的位置
- 接下来,您将为 Debian 的软件包存档选择一个镜像。在大多数情况下,默认选择通常是准确的。因此,除非它猜错了,否则保持默认选择不变,然后单击“继续”。
选择 Debian 软件包存档的镜像
- 在下一个屏幕上,Debian 将给您一个机会来配置 HTTP 代理,如果有的话。如果没有,就留空。
HTTP 代理配置
- 接下来,Debian 将配置您的软件包管理器并更新您的源。几个进度条滚动后,您将看到一个新屏幕,询问您是否愿意向 Debian 提交使用统计信息。这些信息对 Debian 的开发人员很有帮助,但并非必需。做出您的选择,然后点击继续。
选择是否向 Debian 开发人员提供匿名统计信息
下一个屏幕将为我们提供可以添加到系统中的附加软件包,但这些并不是必需的(尽管保留标准系统实用程序是个好主意)。所提供的大多数选项允许我们选择桌面环境,但您并不需要安装一个。通常,服务器不会安装桌面环境。但是,如果您正在设置工作站 PC,这可能会有所帮助。
-
GNOME:这是 Debian 的默认桌面环境。GNOME 是最先进的,提供了一种独特的与计算机交互的范式。GNOME 大量使用虚拟工作区,这使您可以在几个桌面之间分割您的工作流程。不幸的是,GNOME 对硬件加速的要求相对较低;这意味着如果您没有现代的显卡,它将无法正常运行。
-
Xfce:它是 GNOME 的一个非常轻量级的替代品,已经存在很长时间了。Xfce 非常适合处理能力较低的计算机。如今,Xfce 的活跃开发不多,因此它在很多情况下更加稳定,尽管可能不会吸引那些喜欢现代功能的人。
-
KDE:它是一个现代的桌面环境,类似于 GNOME,但它更像 Windows 的用户界面。与 GNOME 一样,KDE 的硬件要求相对较低,尽管不像 GNOME 那么严格。KDE 具有备受 Linux 用户尊敬的Dolphin文件管理器。
-
Cinnamon:最初是作为 GNOME 的一个分支创建的,但它已经发展成为一个独立的桌面环境,几乎没有 GNOME 的依赖。Cinnamon 提供了更传统的桌面风格,同时又具有现代感。
-
MATE:它是对较旧的 GNOME 2.x 版本的延续。因此,MATE 在较旧的计算机上运行良好,并且得到比 Xfce 更多的开发。它可能不像 Xfce 那样稳定,但它很接近。
-
LXDEL:它也是较老的计算机的一个不错的选择,类似于 Xfce 但不那么受欢迎。
除了桌面环境的选择之外,建议从此列表中选择SSH 服务器。也可以选择Web 服务器,但最好等到我们讨论 Apache 的部分时再进行安装。
Debian 软件选择
- 进行您的选择,然后等待安装程序的其余部分完成,因为 Debian 会安装您在上一步中选择的软件。然后,是时候配置 GRUB 了。GRUB是Grand Unified Bootloader的缩写,是我们启动系统所必需的。您将被问及是否要将 GRUB 安装到主引导记录中(您很可能会想这样做),因此确保是单选框被选中,然后点击继续。
GRUB 配置
- 接下来,选择要安装 GRUB 的目标。在大多数情况下,这将是
/dev/sda
。
GRUB 目标选择
- 哇!我们终于准备好重启进入新的 Debian 环境了。点击继续最后一次,我们就可以开始了!
Debian 安装过程的最后一个屏幕
获取和安装 CentOS 7
在这个活动中,我们安装 CentOS 7(比 Debian 的步骤要少得多)。要下载 ISO,请转到以下 URL:
DVD ISO 链接应该满足我们的需求。
就像 Debian 的演练一样,我们需要创建一个可引导的光盘或闪存驱动器来开始安装。与 Debian 安装程序不同,现在我们需要一个 DVD-R 光盘,因为镜像太大而无法放入 CD-R 中。
如果您通过闪存驱动器安装,CentOS 维基百科中的以下 URL 描述了该过程:
wiki.centos.org/HowTos/InstallFromUSBkey
从安装媒体引导后,执行以下步骤:
- 您将首先看到一个屏幕,要求您在安装过程中选择要使用的语言。选择您的语言,然后单击继续。
CentOS 安装期间的语言选择
- 接下来出现的屏幕是安装的两个主要部分之一。这里显示的项目(日期和时间,键盘,语言支持,安装源,软件选择,安装目标和网络和主机名)可以按任何顺序完成。正如您在屏幕截图中所看到的,实际上只有一个部分(安装目标)是必需的。基本上,您可以浏览列出的每个部分并完成其任务,然后在完成时单击开始安装。如果选择不完成某个部分,将使用其默认值。
CentOS 安装过程的第一个主要部分
- 对于语言支持,您将选择您的语言。完成后,单击左上角标有完成标签的图标。
语言选择
- 不要跳过网络和主机名部分。默认情况下,网络甚至根本没有启用,所以您可以通过单击接口旁边的切换开关来启用它。在底部附近,您可以输入计算机的所需主机名。完成后,单击完成。
CentOS 安装期间的网络配置
- 在日期和时间部分,您可以设置时钟和位置。请记住,如果您没有在网络和主机名部分启用网络接口,则将无法使用 NTP。
日期和时间配置
- 完成安装目标部分是强制性的。在这里,您将选择要将 CentOS 安装到哪个磁盘,以及您的分区方案。在本演练中,我们将选择一个磁盘并保留默认分区,但如果愿意,可以自定义分区方案。
CentOS 安装程序的磁盘配置部分
- 默认情况下,CentOS 将是最小安装。这意味着没有图形用户界面,只有默认的软件包。如果愿意,您可以选择桌面环境,如 GNOME 或 KDE,选择相应的选项。
CentOS 软件选择
- 单击开始安装后,您将被带到安装过程的第二个主要部分,而 CentOS 将在后台安装到您的系统上。这个部分要小得多,只有两个步骤。我们将设置 root 密码并创建一个标准用户帐户。
CentOS 用户配置
- 对于 root 密码,请选择安全的密码。密码强度计会显示密码的预计强度。完成后单击完成。
输入 root 密码
- 最后,我们将创建一个标准用户。在这个屏幕上,我们将输入全名和用户名字段中的值,并为密码选择一个强密码。如果需要,您还可以选中标记为使此用户成为管理员的复选框。
CentOS 用户创建
- 最后,当安装完成时,点击重新启动,我们就完成了。
确认完成 CentOS 安装
完成这些步骤后,可以随意设置所需的 Linux 安装。在未来的章节中,我们将使用这些安装来配置网络并提高我们的知识。
总结
在本章中,我们通过设置环境进行了工作。我们讨论了虚拟机和物理机作为网络节点,甚至设置了一个或两个 Debian 和 CentOS 安装。
既然我们已经设置好了环境,现在是时候开始了。在第二章中,重新审视 Linux 网络基础,我们将涵盖我们旅程中所需的所有命令,例如配置网络接口,手动连接到网络以及设置网络管理器。敬请关注!
第二章:重新审视 Linux 网络基础知识
无论您对 Linux 网络有很多了解,还是刚刚开始,我们将在本章中总结 Linux 网络的基础知识。虽然 Linux 中的 TCP/IP 堆栈实现了与其他平台相同的功能,但使用特定工具来管理这样的网络。在这里,我们将讨论 Linux 如何处理 IP 地址分配、网络设备命名,以及启用和禁用接口。此外,我们还将讨论用于管理接口的图形和非图形工具。
在本章中,我们将涵盖:
-
理解 TCP/IP 协议套件
-
命名网络设备
-
理解 Linux 主机名解析
-
理解 iproute2 和 net-tools 套件
-
手动管理网络接口
-
使用网络管理器管理连接
理解 TCP/IP 协议套件
TCP/IP 是存在最流行的网络协议。它不仅是互联网的主要协议套件,而且几乎可以在任何支持网络连接的设备上找到。您的计算机非常了解这个套件,但现在您的手机、电视,甚至一两个厨房电器也支持这项技术。它真的无处不在。尽管 TCP/IP 通常被称为协议,但实际上它是由几个单独的协议组成的协议套件。从名称上看,我相信您可以知道其中两个是 TCP 和 IP 协议。此外,还有第三个 UDP,也是这个协议套件的一部分。
TCP是传输控制协议的缩写。它负责将网络传输分解成序列(也称为数据包或段),然后将它们发送到目标节点,并由 TCP 在另一端重新组装成原始消息。除了管理数据包,TCP 还确保它们被正确接收(尽其所能)。它通过错误校正来实现这一点。如果目标节点未收到数据包,TCP 将重新发送。它之所以知道这一点,是因为有重传时间。
在讨论错误校正和重传之前,让我们先看一下 TCP 发送数据时实际使用的过程。在建立连接时,TCP 执行三次握手,这包括在通信节点之间发送的三个特殊数据包。第一个数据包SYN(同步)由发送方发送给接收方。基本上,这是节点宣布它想要开始通信的方式。在接收端,一旦(如果)接收到数据包,就会向发送方发送SYN/ACK(同步确认)数据包。最后,发送方向接收方发送一个ACK(确认)数据包,这是对传输准备就绪的总体验证。从那时起,连接建立,两个节点能够相互发送信息。然后发送更多数据包,这构成了通信的其余部分。
如果我们生活在一个完美的世界,这就是所需要的一切。数据包永远不会在传输中丢失,带宽是无限的,数据包在传输过程中永远不会损坏。不幸的是,我们并不生活在一个完美的世界,数据包经常丢失和/或损坏。TCP 具有内置功能来处理这些问题。错误校正有助于确保接收到的数据包与发送的数据包相同。TCP 数据包包含一个校验和,并使用算法进行验证。如果验证失败,数据包被视为不正确,然后被丢弃。这种验证并不完美,所以您刚刚下载的文件仍然可能有一两个错误,但总比没有好。大多数时候,它运行得很好。
TCP 的流量控制功能处理数据传输的速度。虽然我们大多数极客拥有一套非常好的网络硬件,能够处理大量带宽,但互联网并不是一个一致的地方。您的高端交换机可能能够处理任何您投入其中的东西,但如果连接的上游某个地方存在薄弱环节,那就无关紧要了。网络传输的速度取决于最慢的点。当您向另一个节点发送传输时,您只能发送与其缓冲区能够容纳的数据量相同的数据。在某个时刻,其缓冲区将填满,然后无法接收任何额外的数据包,直到处理已有的数据包。此时发送到接收方的任何额外数据包都将被丢弃。发送方看到它不再收到 ACK 回复,然后减速并减慢传输速度。这是 TCP 用来根据接收节点能够处理的情况调整传输速度的方法。
流量控制通过利用所谓的滑动窗口来实现。接收节点指定了所谓的接收窗口,它告诉发送方在变得不堪重负之前能够接收多少数据。一旦接收窗口用尽,发送方就等待接收方澄清它再次准备好接收数据。当然,如果接收端向发送方发送了一个准备好接收数据的更新,而发送方却没有收到备忘录,如果发送方永远等待在传输中丢失的全清消息,我们可能会遇到真正的问题。幸运的是,我们有一个持续计时器来帮助处理这个问题。基本上,持续计时器表示发送方愿意等待多长时间,然后需要验证连接是否仍然活动。一旦持续计时器到期,发送方向接收方发送另一个数据包,以查看它是否能够处理。如果发送了回复,回复数据包将包含另一个接收窗口,表明它确实准备好继续对话。
IP(即Internet Protocol)处理 TCP 想要发送或接收的数据包的实际发送和接收。在每个数据包中,有一个称为IP 地址的目的地(我们将在本章中进一步讨论)。每个连接的网络接口都将有自己的 IP 地址,IP 协议将使用它来确定数据包需要去哪里,或者它来自哪个设备。TCP 和 IP 共同组成一个强大的团队。TCP 将通信分成数据包,而 IP 负责将它们路由到它们的目的地。
当然,还有UDP(即User Datagram Protocol),它也是套件的一部分。它与 TCP 非常相似,因为它将传输分成数据包。然而,主要区别在于 UDP 是无连接的。这意味着 UDP 不验证任何内容。它发送数据包,但不保证传递。如果目标没有收到数据包,它将不会被重新发送。
初次了解 UDP 的人可能会质疑为什么会考虑使用这样一个不可靠的协议。事实上,在某些情况下,诸如 TCP 这样的面向连接的协议可能会给某些类型的传输增加不必要的开销。Skype 是一个例子,它提供互联网上的音频通话和视频通话。在通信过程中,如果任一端丢失了一个数据包,重新发送它就没有多大意义。您只会听到一两秒钟的杂音,重新发送数据包肯定不会改变您难以听到一两个字的事实。对这样的传输添加错误校正将是毫无意义的,而且会增加开销。
讨论 TCP/IP 的全部内容本身就是一本书。在 Linux 中,这个协议的处理方式与其他平台基本相同,真正的区别在于协议的管理方式。在本书中,我们将讨论我们可以管理这个协议并调整我们的网络的方法。
命名网络设备
如今,一台计算机拥有多个网络接口并不罕见。例如,如果你使用的是笔记本电脑(而不是超极本),很可能你有一个有线和一个无线网络接口。每个网络接口都有自己的 IP 地址,并且它们彼此独立运行。事实上,你甚至可以在多个接口之间路由流量,尽管这在大多数 Linux 发行版中通常默认情况下是禁用的。就像每个接口都有自己的 IP 地址一样,每个接口也会被系统通过自己的设备名称来识别。在我们进一步讨论之前,打开终端并输入以下命令来查看你系统上的设备名称:
ip addr show
你的输出将如下所示:
ip 命令的输出,显示网络接口和地址分配
在这个例子中,我们看到列出了三个网络接口。第一个lo
是本地环回适配器。第二个eth0
是有线接口。最后,wlan0
代表无线接口。根据这个输出,你可以推断出有一个网络电缆插入了(eth0
有一个 IP 地址),并且它目前没有使用无线接口(wlan0
没有列出 IP 地址)。
先前显示的输出来自运行 Debian 系统的系统。现在,让我们来看看在 CentOS 系统上运行相同命令时的输出:
ip 命令的输出,这次是从 CentOS 系统运行的
你看到了区别吗?如果你看有线连接,你会发现它的命名方式与 Debian 示例中的有线连接有很大不同。在 Debian 中,它的名称是eth0
。但在 CentOS 中,它的名称是enp0s3
。这就引出了本节的重点:CentOS 和 Debian 中的网络设备命名方式不同。
过去,有线以太网设备的名称以eth
为前缀,无线设备以wlan
为前缀。例如,第一个有线以太网适配器将被标记为eth0
;第二个将是eth1
,依此类推。无线设备也是类似处理的,第一个设备是wlan0
,第二个将是wlan1
,依此类推。在 Debian 中,这仍然是这种情况(即使在较新的版本中也是如此)。然而,一些使用systemd的发行版为网络设备采用了不同的命名方案。事实上,Debian 9 将在发布时更改其接口的命名方案。
这种更改的原因是因为以前的命名方案有时是不可预测的。当机器重新启动时,可能会出现网络设备名称交叉,导致对接口的混淆。各种发行版以自己的方式处理这个问题,但 systemd 具有内置的命名方案,该方案基于系统总线中卡的位置,而不仅仅使用eth0
、eth1
等名称,因为设备被探测。如前所述,尽管 Debian 8 也使用 systemd,但 Debian 仍然使用较旧的命名方案。在本书中,我们将练习 systemd 命令;但是,在第五章监视系统资源中,我们将更详细地解释 systemd,所以如果你还不知道它是如何工作的,也不用太担心。
在第二个示例中使用的 CentOS 机器上,有线网络卡被指定为enp0s3
。那么,这到底意味着什么呢?首先,我们知道en
代表以太网,这部分指定是给有线网络卡的。给定名称的其余部分代表系统总线上网络卡的位置。由于每个有线卡(如果您有多个)都会驻留在自己的物理位置,因此给定设备的名称是可预测的。如果您要为特定网络接口编写启动脚本,您可以相当肯定地知道您将编写脚本来引用适当的设备。
理解 Linux 主机名解析
在网络上,通过名称查找其他资源要比记住我们连接到的每个资源的 IP 地址方便得多。默认情况下,通过名称查找主机可能需要一些配置才能正常工作。例如,您可以尝试使用ping
命令针对您的 Linux 机器之一的名称,可能会得到响应,也可能不会。这是因为您连接的资源的 DNS 条目可能不存在。如果不存在,您将看到类似以下的错误:
ping: unknown host potato
但是,如果您通过 IP 地址 ping 设备,很可能会得到响应:
64 bytes from 10.10.96.10: icmp_seq=2 ttl=64 time=0.356 ms
注意
按下键盘上的Ctrl + C来中断您的ping
命令,因为如果找到连接,它将永远 ping 下去。
这样做的原因是为了使网络主机能够联系另一个主机,它需要知道其 IP 地址。如果您输入的是名称而不是 IP 地址,机器将尝试主机名解析,如果域名系统(DNS)中有机器的有效条目,您将能够收到回复。在具有基于 Windows 的动态主机配置协议(DHCP)和 DNS 服务器的 Microsoft 网络中,每当服务器分配 IP 地址给主机时,它通常会注册一个动态 DNS条目。Linux 基于的 DHCP 和 DNS 服务器也能够进行动态 DNS,但默认情况下不会配置,管理员也很少启用。在全 Linux 网络或任何不动态分配 DNS 的网络中,此 ping 很可能会失败。我们将在第第六章配置网络服务中更详细地讨论 DNS。
在大多数情况下,DNS 不是 Linux 主机解析主机名的第一个地方。系统上也保存有一个本地文件(/etc/hosts
),您的机器将首先检查该文件。如果您要联系的主机的条目未包含在其中,您的机器将联系其配置的主 DNS 服务器,以查找您输入的名称的 IP 地址。以下是host
文件的示例:
127.0.0.1 localhost
127.0.1.1 trinity-debian
# The following lines are desirable for IPv6 capable hosts
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
在呈现的hosts
文件中,我们可以看到localhost
和trinity-debian
的条目。这两个条目以127.0.x.x
IP 地址开头,代表了机器本身。要测试这一点,请尝试 pinglocalhost
以及您的机器的名称(在本例中为trinity-debian
)。无论哪种方式,您都会得到回复。这是因为机器知道自己的主机名,而localhost
使用环回适配器来访问自己。如果您愿意,您可以在此文件中创建额外的名称到 IP 地址的匹配。例如,如果您有一个名为potato
的计算机,IP 地址为10.10.96.10
,您可以将其添加到hosts
文件的末尾,如下所示:
10.10.96.10 potato
从现在开始,你可以通过输入potato
来访问 IP 地址10.10.96.10
。你可以 ping 它,甚至在浏览器的地址栏中输入它(如果机器正在提供 web 内容)。事实上,主机条目甚至不需要是你网络中的本地资源。你甚至可以输入外部网站的 IP 地址,并通过不同的名称访问它。然而,这只是在理论上有效——一个设计良好的网站可能不会在这种情况下运行。
虽然首先检查/etc/hosts
,但你的 Linux 安装包括一个文件/etc/nsswitch.conf
,它用于确定主机解析的顺序。相关行以hosts
开头,你可以使用以下命令轻松检查你的机器上的主机解析顺序:
cat /etc/nsswitch.conf |grep hosts
你将得到以下输出:
hosts: files mdns4_minimal [NOTFOUND=return] dns
在这里,我们可以看到系统设置为首先检查files
,这代表本地文件,包括/etc/hosts
。如果搜索的是本地域名并且没有找到,NOTFOUND=return
条目会导致搜索的其余部分中止。如果你搜索其他内容,下一个将被使用的资源是 DNS,如最后一个条目所示。除非你改变了这个文件,你的发行版也很可能设置为首先在本地主机文件中查找,如果资源在本地找不到,然后再查找 DNS。
理解 net-tools 和 iproute2 套件
相当长的一段时间以来,net-tools一直是在 Linux 系统上管理网络连接的工具套件。net-tools 套件包括诸如ifconfig
、route
、netstat
等命令(我们将很快讨论)。net-tools 的问题在于,它的开发者已经十多年没有更新了,这使得许多发行版选择放弃它,转而选择iproute2套件,它提供了相同的功能(但使用不同的命令来实现相同的目标)。尽管 net-tools 正在被弃用,仍然有很多发行版包括它。例如,Debian 包括 iproute2 和 net-tools,因此你可以使用任一套件的命令。在 CentOS 中,iproute2 是默认安装的,而 net-tools 则不是。如果你想使用旧的 net-tools,你可以使用以下命令在 CentOS 中安装它:
# yum install net-tools
那么,为什么你要安装net-tools
,如果它正在被弃用?许多系统仍然使用 net-tools 套件的命令,因此它不会很快从 Linux 社区消失。学习 net-tools 以及更新的 iproute2,将使你能够轻松适应任何环境。特别是对于使用旧发行版的旧数据中心来说,情况尤其如此。
让我们看看这些套件的实际操作。首先,要报告有关你的网络连接的基本信息,请输入以下命令:
/sbin/ifconfig
你应该看到以下输出:
ifconfig 命令的输出
在这里,我们可以看到来自内部有线连接(eth0
)和环回适配器(lo
)的统计信息。我们看到HWaddr
,这是网络卡的MAC 地址。我们还有inet addr
,这是网络卡由DHCP 服务器提供的 IP 地址。此外,我们可以看到子网掩码Mask
,在这种情况下是255.255.252.0
。在解决网络问题时,我们会使用这个工具来检查这些基本信息,比如确保我们有一个 IP 地址并且在适当的子网上。此外,我们还可以看到在接口上发送和接收的数据包数量,以及错误的数量。
使用 iproute2 套件,我们可以使用以下命令找到大部分相同的信息:
ip addr show
这是一个参考机器的输出:
ip addr show 命令的输出
正如你所看到的,报告的信息大部分是相同的,尽管布局有些不同。例如,一个区别是你看不到发送和接收的数据包数量,也没有错误计数(默认情况下)。过去,以下命令将显示正在使用的 IP 地址以及发送和接收的数据包:
ip -s addr show
使用添加了-s 标志的 ip addr show 命令的输出
不幸的是,最近版本的 iproute2 套件似乎不再显示这些信息(尽管添加了-s
开关),但我们将在本书的后面看到更多的工具。
注意
在前面的命令中,你也可以输入整个字符串(地址)而不是addr
。
ip address show
输出将是相同的。这些示例中显示的命令是压缩过的,这样可以节省输入时间。
iproute2 套件中有许多其他命令,我们将在本书继续讨论。现在,重要的是要理解这两个命令套件之间的区别,并注意 net-tools 不会永远可用。在本书编写的时间段内,两者都很常见。然而,iproute2 是未来的主流。
在结束本节之前,iproute2 套件中有一个非常简单的命令可能会很有用:
hostname
这个简单的命令只是打印出你的 shell 所连接的机器的主机名。如果你使用默认的 bash 提示符,很可能你已经知道你的机器的主机名。然而,hostname 命令至少可以帮助你验证你的设备是否报告了你认为它应该报告的主机名;当你处理名称解析问题时,这可能是有用的。
手动管理网络接口
在大多数情况下,在安装所需的 Linux 发行版后,它会通过 DHCP 接收一个 IP 地址,然后就可以使用了。无论你是使用图形桌面环境还是没有图形界面的 shell 环境,大部分魔术都是在后台发生的。虽然有图形工具来管理你的网络连接,但任何你可以通过图形工具做的事情,你也可以通过 shell 来做。在服务器的情况下,可能根本没有图形环境,所以学会如何通过 shell 管理你的网络连接非常重要。在本节中,我们将讨论在 Debian 中手动配置接口的方法,然后讨论如何在 CentOS 中做同样的事情。
在上一节中,讨论了两种查找当前 IP 地址的方法。根据你的发行版是否提供了 net-tools 或 iproute2,你可以使用其中一种方法或两种方法(或两者)。当然,这是第一步。你有连接吗?检查你是否有 IP 地址是一个合乎逻辑的起点。你也可以利用一个简单的 ping 测试:
ping www.yahoo.com
如果你得到了回应,很可能你有网络连接。然而,如果你没有得到回应,并不一定意味着你的网络有问题。有些站点配置为不响应 ping 测试。在可能的情况下,最好针对本地资源进行 ping 测试(比如你的本地 DNS 或 DHCP 服务器)。
在 Linux 中,ping 的工作方式与 Windows 有些不同。首先,在 Linux 中,ping
命令默认会一直运行下去。要退出它,按键盘上的Ctrl + C。如果你希望ping
在尝试一定次数后停止,添加-c
标志并附上你希望它尝试的次数。在这种情况下,我们的ping
命令将是这样的:
ping -c 4 www.yahoo.com
在这种情况下,ping
将尝试四次,然后停止,并向你报告一些基本统计信息。
知道如何检查你是否连接是一回事,但当你没有连接时该怎么办呢?或者如果你的网络连接是活跃的,但报告无效信息,你需要重新配置它呢?
首先,让我们探讨如何检查我们当前的配置。在 Debian 中,默认控制网络设备的文件是以下文件:
/etc/network/interfaces
根据几个变量,包括您如何配置 Debian 安装,这个文件可能会有不同的创建方式。首先,您可能会看到列出了几个接口,比如回环适配器、有线以太网和无线。如果您有多个有线接口,您也会在这里看到任何额外的适配器。简单地说,这个文件是一个配置文件。它是一个文本文件,包含了底层 Linux 系统理解的信息,并导致设备按照文件中指定的方式进行配置。
要编辑这样的文件,有许多 Linux 文本编辑器可用,包括 GUI 和基于终端的。我个人最喜欢的是vim,尽管许多管理员通常从nano开始。nano 文本编辑器非常容易使用,但功能很少。另外,vim 比 nano 有更多的功能,但使用起来有点难。你可以自己选择。要在 nano 中打开一个文件,你只需要输入nano
,然后加上你想编辑的文本文件的名称。如果文件不存在,命令会在你保存文件时创建它。对于我们的/etc/network/interfaces
文件,命令将类似于这样:
# nano /etc/network/interfaces
使用 nano 只是简单地打开一个文件,使用键盘上的箭头键将插入点移动到您想要输入的位置,按下Ctrl + O保存文件,然后按下Ctrl + X退出。还有更多功能,但就目前来说,这就是我们需要的。本书不涵盖 vim 的教程,但如果你愿意,可以随意尝试。
现在,回到我们的/etc/network/interfaces
文件的主题。重要的是要注意,这个文件对于以太网和无线适配器并不是必需的。如果在这个文件中除了回环设备之外什么都没有,那就意味着网络连接是由网络管理器来管理的。网络管理器是一个用于管理客户端网络连接的图形工具(我们将在本章后面讨论)。对于本节中的目的,当您第一次设置 Debian 时,通常会安装网络管理器,特别是当您决定包括图形桌面环境时(如 GNOME、Xfce 等)。如果您选择了图形环境,那么网络管理器很可能已经为您设置好,并且正在处理配置您的接口的工作。如果您的interfaces
文件除了回环适配器的条目之外是空白的,那就意味着网络管理器正在处理这个任务。
在 Debian 中,非常常见的是在野外看到没有安装图形环境的安装。对于服务器来说,通常不需要 GUI 来实现其目的。典型的 Linux 管理员会为服务器配置最少的必需软件包,以便它完成其工作,这通常不包括桌面环境。在这种情况下,可能根本没有安装网络管理器。如果没有安装,那么/etc/network/interfaces
文件将负责设置连接。在其他情况下,也许网络管理器已经安装,但是被管理员禁用了,而是在这个文件中配置了网络连接。
那么,什么时候应该使用网络管理器,什么时候应该只在interfaces
文件中配置连接?对于最终用户工作站(台式机和笔记本电脑),几乎总是首选网络管理器。对于服务器,特别是在设置静态 IP 地址时,首选在/etc/network/interfaces
中设置配置。
我们已经讨论了interfaces
文件是什么,以及何时使用它。现在,让我们看一下你可能会看到的一些
各种类型的配置。首先,让我们看一下只列出本地回环适配器时的interfaces
文件:
cat /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
注意
注释以第一个字符#
声明,在解析配置文件时会被忽略。在前面的例子中,第一行被忽略,只是作为信息。
在这个例子中,这台机器很可能正在使用网络管理器,因为有线(通常是eth0
)或无线(通常是wlan0
)接口都没有显示。为了验证这一点,我们可以通过以下命令检查网络管理器是否正在运行:
ps ax |grep NetworkManager
如果网络管理器正在运行,你可能会看到这样的输出:
446 ? Ssl 0:00 /usr/sbin/NetworkManager --no-daemon
这个谜团已经解开了;这台机器使用了网络管理器,所以在/etc/network/interfaces
中没有存储eth0
或wlan0
的配置。现在,让我们看一个网络管理器没有使用的机器的示例。要在这样的安装中配置eth0
,interfaces
文件看起来会类似于这样:
# The loopback network interface
auto lo
iface lo inet loopback
# Wired connection eth0
auto eth0
iface eth0 inet dhcp
正如我们之前所做的那样,我们仍然有回环条目,但在文件的末尾,包括了eth0
的配置细节。就像我们的回环条目一样,我们声明auto
,然后是一个接口名eth0
,这意味着我们希望接口eth0
自动启动。在下一行中,我们澄清了我们希望为接口eth0
使用dhcp
,以便它将从 DHCP 服务器自动获取 IP 地址。
在现实世界中,没有理由放弃网络管理器,而选择手动配置连接,当我们要做的只是使用 DHCP 时。然而,这个例子被包含在这里,因为在服务器从 DHCP 服务器接收静态租约而不是动态租约的情况下,这实际上是相当常见的。使用静态租约,DHCP 服务器将为特定 MAC 地址提供相同的 IP 地址。因此,在这种情况下,服务器可以为其指定 IP 地址,但 IP 地址仍然是由 DHCP 服务器提供的。这也被称为DHCP 保留。
当然,也有可能(也许更常见)只在 interfaces 文件中声明静态 IP。我们将在下面探讨这种方法。但是,值得指出的是,静态租约具有额外的好处。使用静态租约,节点的 IP 配置不会与其安装的发行版的配置绑定。如果从活动媒体引导,甚至重新安装发行版,节点每次接口启动时都会收到相同的 IP 地址。静态租约的另一个好处是,您可以在一个中心位置(在 DHCP 服务器上)配置所有节点的静态 IP,而不必跟踪每台机器的单独配置文件。
注意
重要的是要注意,在interfaces
文件中看到接口列出dhcp
并不总是意味着正在使用静态租约。对于 Debian 来说,管理员通常只是不安装网络管理器,然后在启动服务器时手动输入interfaces
文件。
现在,让我们看一个示例interfaces
文件,其中手动配置了静态 IP:
# The loopback network interface
auto lo
iface lo inet loopback
# Wired connection eth0
auto eth0
iface eth0 inet static
address 10.10.10.12
netmask 255.255.248.0
network 10.10.10.0
broadcast 10.10.10.255
gateway 10.10.10.1
首先,注意以下一行的变化:
iface eth0 inet static
最后,我们声明了static
而不是dhcp
。如果我们忘记更改这个,那么配置文件的所有剩余行将被忽略。
然后,我们声明了接口eth0
的统计信息。我们将 IP 地址设置为10.10.10.12
,子网掩码设置为255.255.248.0
,我们加入的网络设置为10.10.10.0
,广播 ID 为10.10.10.255
,网关为10.10.10.1
。我们将在本书的后面讨论这些值实际上是什么意思,但现在需要注意的重要事情是这个文件的语法。
现在您可能想知道我们如何使这些更改生效,既然我们费力地配置了我们的接口。要这样做,您将使用以下命令:
# systemctl restart networking.service
在 CentOS 中,手动配置网络接口的过程与 Debian 系统有些不同。首先,我们需要知道机器上安装了哪些接口。运行以下命令将列出它们以及当前分配的任何 IP 地址:
ip addr show
在本节中,我将使用enp0s3
,这是本书用于测试的测试机器上的默认设置。如果您的设置不同,请相应更改这些示例命令。无论如何,既然我们知道我们正在使用哪个接口,让我们配置它。接下来,导航到以下目录:
cd /etc/sysconfig/network-scripts
如果列出该目录中的文件存储(ls
命令),您应该看到一个与接口名称匹配的配置文件。在我们的示例中,enp0s3
,您应该看到一个名为ifcfg-enp0s3
的文件。
用您选择的文本编辑器打开此文件,您将看到配置类似于以下内容:
HWADDR="08:00:27:97:FE:8A"
TYPE="Ethernet"
BOOTPROTO="dhcp"
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp0s3"
UUID="a5e581c4-7843-46d3-b8d5-157dfb2e32a2"
ONBOOT="yes"
如您所见,此默认文件使用dhcp
,列在第三行。要配置此连接以利用静态地址,我们需要相应地更改文件。文件的更改部分已用粗体标记:
HWADDR="08:00:27:97:FE:8A"
TYPE="Ethernet"
BOOTPROTO="static"
IPADDR=10.10.10.52
NETMASK=255.255.255.0
NM_CONTROLLED=no
DEFROUTE="yes"
PEERDNS="yes"
PEERROUTES="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_PEERDNS="yes"
IPV6_PEERROUTES="yes"
IPV6_FAILURE_FATAL="no"
NAME="enp0s3"
UUID="a5e581c4-7843-46d3-b8d5-157dfb2e32a2"
ONBOOT="yes"
在这里,我们对文件进行了四处更改。首先,我们将BOOTPROTO
更改为static
。然后,在其下面添加了以下全新的行:
IPADDR=10.10.10.52
NETMASK=255.255.255.0
NM_CONTROLLED=no
我相信您可以理解前两行的作用。我们添加的第四行可能也很明显,但以防万一,我们基本上告诉系统,我们宁愿不通过网络管理器管理连接,并且希望自己通过此配置文件处理。
当然,我们需要重新启动网络以使这些更改生效。由于 CentOS 使用 systemd(就像 Debian 8 一样),命令非常相似:
# systemctl restart network.service
就是这样。我们已经在 Debian 和 CentOS 中手动设置了网络接口。
使用网络管理器管理连接
虽然我们刚刚费力地手动配置了网络接口,但并不总是需要这样做。例如,最终用户的工作站将受益于网络管理器为我们处理这项工作。对于笔记本电脑及其无线接口,网络管理器比大多数人做得更好。
网络管理器通常默认安装在大多数 Linux 发行版中。对于 Debian 来说,通常在选择图形桌面环境时安装。如果您选择了仅安装 shell(在安装过程中取消了桌面环境的选项),那么您可能没有安装它。要确定,请执行以下命令(在 Debian 和 CentOS 上都适用):
ps ax |grep NetworkManager
如果您看到网络管理器正在运行,则已安装。但为了确保,您可以在 Debian 中执行以下命令:
aptitude search network-manager
如果安装了网络管理器,您将看到它列在以下位置(左侧将有一个i
标记):
在 CentOS 中,您可以使用以下命令检查网络管理器是否已安装:
yum list installed |grep NetworkManager
如果您正在运行图形桌面环境,您可能在系统托盘中运行了网络管理器的实现。如果是这样,请随时使用可用的 GUI 工具管理您的连接。根据您使用的图形桌面环境,执行此操作的说明将有所不同。在本节中,我们讨论了一种更通用的方法来利用网络管理器配置连接。这种方法是使用以下命令:
nmtui
nmtui
命令允许您在 shell 环境中配置网络管理器,但具有类似 GUI 的控件。
通过 nmtui 配置系统的网络连接
如果我们点击编辑连接,我们将看到机器上可用的接口列表:
nmtui 接口选择
当我们选择一个接口时,我们首先会看到一些基本信息。
在 nmtui 中编辑连接的第一个屏幕
编辑此接口的 IP 地址,请按下箭头键选择<自动>在IPv4 配置左侧,并按Enter。然后,按右箭头键选择<显示>选项并展开其余字段。
使用 nmtui 编辑连接
要编辑项目,请按下箭头键到字段旁边的<添加...>选项。它会展开一个文本框,允许您编辑该项目。
使用 nmtui 编辑连接
完成后,滚动到底部并按Enter在<确定>上保存您的更改。您应该能够选择通过网络管理器管理您的连接。
摘要
在本章中,我们讨论了 Linux 中 TCP/IP 网络的基础知识,甚至手动配置了我们的接口。我们探讨了如何编辑与 Debian 和 CentOS 相关的配置文件,以及如何在两个平台上重新启动网络。我们简要讨论了 systemd 方法,尽管我们将在第五章中更深入地探讨 systemd,监视系统资源。我们通过使用nmtui
工具为我们的系统配置网络管理器来结束本章。
在下一章中,我们将看看如何使用安全外壳(SSH)远程管理我们的系统。
第三章:通过 SSH 在节点之间通信
SSH 是 Linux 网络管理员最重要的工具之一。它允许您远程连接到服务器和其他工作站,并在您喜爱的终端仿真器中进行工作,所有这些都可以在您的办公桌上完成。虽然 SSH 可能不是每种情况下的完美工具,但一旦开始使用,您就无法想象没有它的生活。
在本章中,我们探讨 SSH 并涵盖以下主题:
-
使用 OpenSSH
-
安装和配置 OpenSSH
-
通过 openssh-client 连接到网络主机
-
OpenSSH 配置文件
-
理解和使用
scp
-
通过
scp
将文件传输到另一个节点 -
通过 SSH 进行流量隧道
-
生成公钥
-
保持 SSH 连接活动
-
探索 SSH 的替代方案-使用 Mosh(移动 shell)
使用 OpenSSH
SSH,或安全外壳,是一个非常方便的实用程序。SSH 并非在服务器室执行任务的绝对要求,但它是使您的生活变得更加轻松的工具之一。通过 SSH,您可以在不同的 Linux 机器上执行命令,就好像您就坐在它的面前一样。当然,您可以随时走进服务器室,拿起键盘开始工作,但现在远程管理才是最重要的。特别是如果轮到您值班并且办公室出现问题。根据问题的性质,SSH 可能允许您在家中(甚至在智能手机上)解决问题,而无需一直走到公司的服务器室。这还不是全部;SSH 还允许您将文件从一台机器复制到另一台机器,并在服务器上的目录上设置一个实际的存储挂载,可以在您的工作站上像本地文件系统的一部分一样处理。
连接到远程主机并打开命令 shell 的概念并不新鲜,SSH 也不是第一个这样做的工具。其他解决方案,如 telnet 或 rlogin,已经存在了相当长的时间。使 SSH 令人向往的是它比早期技术更加安全,因为通信是加密的。SSH 有两种协议,协议 1 和协议 2。协议 1 绝对不应该在任何情况下使用,因为它不再安全。使用协议 1 发送的流量可能会被攻击者拦截。我们将在第九章保护您的网络中讨论 SSH 的这一方面,但现在我想确保您了解,您不应该使用协议 1 的 SSH 连接。您不应该向任何主机提供协议 1。如今,协议 2 是默认的。
默认情况下,SSH 使用端口 22 进行通信。如果防火墙阻止了这个端口,您将无法连接。这在以 Windows 为中心的企业中非常常见,因为 SSH 在 Linux/UNIX 世界中更为常见。通过更改 SSH 服务器的配置,您可以将其配置为监听任何您喜欢的端口。虽然我们暂时不会讨论如何配置这一点(我们将在第九章保护您的网络中讨论这一点),但这里提到是因为重要的是您可能会遇到一种情况,即无法连接到 SSH 服务器,例如当端口关闭或已更改为其他端口时。
尽管我提到学习 SSH 实际上并不是在服务器或工作站上执行任务的必需条件,但强烈建议您花时间学习它。不仅是使用 Linux 服务器的公司希望您了解它,您也不想错过它的优势。值得庆幸的是,尽管 SSH 非常有用,但学习它并不难。您可以在五分钟内轻松学会最基本的功能,或者在一周内学会高级用法。
安装和配置 OpenSSH
OpenSSH 有两个部分,客户端应用程序和服务器应用程序。在您的发行版中,默认情况下可能已安装了客户端应用程序。客户端允许您通过 SSH 连接到其他节点,但仅具有客户端不允许其他人连接到您。如果要通过 SSH 访问某台机器,则该机器还必须安装 SSH 服务器应用程序。您选择的发行版可能默认安装了服务器应用程序,但大多数不会。这是出于安全考虑-除非您绝对需要运行并侦听连接的应用程序,否则应该不存在。应用程序越少,攻击面就越小。
在 Debian 中,SSH 服务器是安装过程中的一个选项。如果选择了,SSH 的服务器应用程序将存在并默认启动。要检查 Debian 系统上是否安装了 SSH 服务器包,请执行以下命令:
aptitude search openssh-server
在输出中,如果第一个字符是i
,则表示已安装该软件包。您可以使用以下命令检查sshd服务是否正在运行:
ps ax | grep sshd
如果服务未运行,可以通过在 Debian 上执行以下命令来启动它:
# systemctl start ssh.service
在 Debian 上,您可以通过执行以下命令来检查 SSH 服务的状态:
# systemctl status ssh.service
如果正在运行,则输出应包括active (running)
:
如果您的系统没有安装 SSH 服务器包,可以使用以下命令安装它:
# apt-get install openssh-server
安装软件包后,使用以下命令检查服务的状态以查看是否已启用:
systemctl status ssh.service
否则,下次启动机器时它将不会自动启动。
在 CentOS 中,您还可以使用systemctl
命令来检查 SSH 服务的状态,尽管守护程序的名称有点不同:
systemctl status sshd.service
在 Debian 中的上一个命令中,服务的名称是ssh.service
。在 CentOS 中,它的名称是sshd.service
。在 CentOS 中,SSH 的客户端和服务器包都是默认安装的,因此在 CentOS 系统完成安装后,您应该已经拥有它们。如果由于某种原因未安装该软件包,可以通过yum
安装:
# yum install openssh-server
安装后,请通过检查状态来确保服务已启用:
systemctl status sshd.service
如果 SSH 服务未处于启用状态(启动时启用),请执行以下命令:
# systemctl enable sshd.service
现在,SSH 已安装在您的机器上,我们准备开始使用它。
通过 openssh-client 连接到网络主机
对于此实验,您至少需要一个具有活动 SSH 服务器的 Linux 安装,以及另一个至少安装了 SSH 客户端的安装。对于客户端,您需要在 CentOS 中安装openssh-clients
软件包,或在 Debian 中安装openssh-client
软件包。SSH 的客户端软件包在两者上默认安装,因此除非软件包已被删除,否则您不需要安装它。对于此活动,服务器端或客户端端的连接使用哪种发行版并不重要。随意混合使用。
接下来,我们需要记录我们希望连接到的节点的 IP 地址。无论发行版如何,您都应该能够通过执行以下命令来发现 IP 地址:
ip addr show
要通过 SSH 连接到该机器,请执行针对主机的 IP 地址的ssh
命令。例如,如果要连接的主机具有 IP 地址192.168.1.201
,请执行以下命令:
ssh 192.168.1.201
只要您的用户名在两端相同,该命令应该会要求您输入密码,然后让您进入。如果您要连接的主机上的用户名与您的用户名不同,请像这样将适当的用户名添加到命令中:
ssh jdoe@192.168.1.201
使用 SSH,你可以使用任何在那里存在的用户名连接到另一个 Linux 安装,只要你知道它的密码。事实上,根据供应商如何配置发行版,你甚至可以直接以 root 身份登录。在 CentOS 中,默认情况下启用了 root 登录。在 Debian 中,除非你使用 RSA 密钥(我们将在第九章 保护你的网络中讨论这个问题),否则不允许通过 SSH 登录 root。尽管我们将在那一章讨论更多关于安全性的内容(包括如何允许/禁止用户),但现在重要的是要理解通过 SSH 允许 root 访问系统是一个非常糟糕的主意;我希望你会在生产服务器和工作站上禁用这个功能。如果你希望现在禁用 root 访问,请转到第九章 保护你的网络的相关部分,然后再回到这里。
SSH 还允许你指定主机名而不是 IP 地址。事实上,主机名是首选的方法,因为如果你的网络中有大量的机器,很难记住 IP 地址。SSH 本身不解析主机名;它依赖 DNS 来完成。如果你的网络上的 DNS 服务器有你想要连接的机器的 A(地址)记录,你应该能够使用主机名而不是 IP 地址:
ssh jdoe@chupacabra
注意
如果机器在你的网络中没有 DNS 条目,或者你还没有设置 DNS 服务器,不用担心。我们将在第六章 配置网络服务中讨论设置我们自己的 DNS(bind)服务器。
连接到主机的另一个重要方面是指定端口。如前所述,默认端口是 22。如果你不指定端口,那么假定端口是 22。如果你需要指定一个不同的端口,你可以使用-p
标志,如下所示:
ssh -p 6022 jdoe@chupacabra
成功连接后,你应该可以在目标机器上获得一个命令提示符。从这里,你可以安装软件包,管理用户,配置网络,或者做任何你能亲自登录到机器上做的事情。你的唯一限制是你的用户对系统的权限。如果这是你自己的机器,或者是你自己设置并知道 root 密码的机器,你可以做任何你想做的事情。如果这台机器属于别人,你可能只有权限修改你的本地主目录。无论如何,你成功使用 SSH 连接到了一台机器。本章的其余部分,以及第九章 保护你的网络,将扩展这些基本知识。
OpenSSH 配置文件
当第一次使用 SSH 时,.ssh
目录将在你的主目录中创建。这个目录包含了 SSH 客户端的有用文件,包括known_hosts
、id_rsa
和id_rsa.pub
,一旦你生成了你的密钥(我们稍后会讨论)。虽然我们稍后会在本章讨论这些文件,但 SSH 客户端还识别另一个文件:config
。这个文件不是默认创建的。如果你自己创建它(遵循正确的语法),那么 SSH 将识别它。那么,这个config
文件是做什么的呢?如果你有一个或多个经常连接的主机,你可以在这个文件中填写每个主机的具体信息,而不必每次都输入详细信息。让我们看一个示例~/.ssh/config
文件。
Host icarus
Hostname 10.10.10.76
Port 22
User jdoe
Host daedalus
Hostname 10.10.10.88
Port 65000
User duser
Host dragon
Hostname 10.10.10.99
Port 22
User jdoe
对于这个文件,SSH 将立即识别三个主机:伊卡洛斯
、代达罗斯
和龙
。这与这些机器是否在 DNS 中列出无关。如果我们输入ssh icarus
并且之前使用了config
文件,SSH 不仅会知道如何到达它(文件中给出了 IP 地址),而且 SSH 还会知道要使用哪个用户和端口。即使我们的用户名不是jdoe
,它也会用于这个连接(因为它在文件中列出了)—除非我们在命令字符串中为ssh
命令提供了不同的用户。
在我们示例文件的第二个条目(daedalus
)中,你会注意到它与其他条目有些不同。首先,端口是不同的。对于文件中的所有其他主机,都使用默认的 22 端口。但对于daedalus
,我们使用了不同的端口。如果我们通过 SSH 连接到daedalus
,它将自动尝试引用的端口。接下来,你还会注意到这个主机的用户名也是不同的。即使我们的本地用户是jdoe
,并且我们没有提供不同的用户名,用户duser
也会被自动使用。如果我们希望,我们可以通过在主机名之前提供user@
来覆盖这一点。
由于这个文件默认不存在,我们只需要使用任何文本编辑器创建它并保存到以下位置:
~/.ssh/config
只要我们输入正确,SSH 就应该能看到文件并允许我们使用它。然后,我们可以在这个文件中创建我们自己的主机列表,以便为每个主机提供所需的参数,并且更容易地访问。在你的实验室里试一试吧。
理解和利用 scp
SSH 实际上有几种用途;它不仅仅是用于连接一台机器到另一台机器,尽管这是最常见的用例。SSH 还允许你将文件传输到另一台机器,甚至从远程机器传输文件到你的本地机器。允许你这样做的实用程序是scp
(安全复制)命令,它是 SSH 工具套件的一部分。当然,你也可以通过网络共享传输文件,但scp
的美妙之处在于它提供了即时的文件传输,而不需要进行共享配置。scp
命令简单而快速。你可以将文件从你的机器传输到你有权限访问的目标机器的文件系统的任何位置。
scp
实用程序主要是为那些需要快速传输文件的人准备的,因为它不是文件访问和存储的长期解决方案。在需要创建其他人需要访问的存储库的情况下,你通常会设置一个NFS或Samba共享来实现目标。然而,scp
是一个很棒的实用程序,无论何时你想要简单地将文件发送到另一台机器而不需要配置任何东西,它都会对你非常有用。
通过 scp 将文件传输到另一个节点
让我们试一试scp
。与之前的 SSH 活动一样,你至少需要两台机器:一台安装并运行 SSH 服务器的机器,另一台至少安装了客户端的机器。在这种情况下,发行版并不重要,只要你满足这个简单的要求。此外,我们需要一个测试文件。文件可以是一些小东西(比如文本文件或图像)或大东西(比如 Linux 发行版的 ISO 文件)。目标是使用scp
将这个文件传输到另一台机器。让我们看看如何做到这一点。
为了本教程的目的,我将概述一个名为 foo 的机器向一个名为 bar 的机器传输文件的过程。
首先,让我们看一个scp
的简单例子:
scp my-image.jpg 192.168.1.200:/home/jdoe/
在这个例子中,我们执行了针对名为my-image.jpg
的文件的scp
命令。接下来,我们概述目标。在这种情况下,是一个具有 IP 地址192.168.1.200
的机器。然后,我们输入一个冒号和我们想要存储文件的路径。在这种情况下,我们将文件复制到jdoe
的主目录中。
由于我们知道目标机器的名称(bar
),我们可以使用机器的名称而不是 IP 地址,假设它被 DNS 服务器识别。它在~/.ssh/config
中配置,或者是 foo 的/etc/hosts
文件中的一个条目。命令如下:
scp my-image.jpg bar:/home/jdoe
我们稍微简化了命令,因为我们知道机器的名称。此外,如果我们打算复制到用户的主目录,我们不必输入目录的名称。我们可以将命令简化为以下形式:
scp my-image.jpg bar:.
在这个例子中,我们用一个句号代替了/home/jdoe
的路径。这是因为默认会使用主目录,除非你给命令一个单独的路径。如果我们用波浪号(~
)代替也会得到同样的结果:
scp my-image.jpg bar:~
如果我们希望复制的数据是一个整个目录,而不仅仅是一个单个文件呢?如果我们尝试使用scp
命令来复制一个目录,它将失败。为了复制整个目录,我们需要添加-r
标志来执行递归复制:
scp -r my_dir bar:~
现在,my_dir
目录及其内容将被传输。在复制文件时,另一个有用的标志是-p
,它在复制文件时保留修改时间。如果我们将其与前面的命令结合起来,我们得到:
scp -rp my_dir bar:~
然而,如果两台机器上的用户名不同,每个命令都会失败。例如,如果 foo 上的登录用户是dlong
,而在bar
上用户不存在,命令会失败,因为发送计算机会默认使用dlong
,当前登录的用户。在这种情况下,另一台计算机会要求你输入密码三次,然后给出一个拒绝访问的消息。这是因为你实际上在为一个不存在的用户输入密码。如果我们需要为目标指定用户名,命令会变成类似以下的形式:
scp my-image.jpg jdoe@bar:~
使用新版本的命令,你将被提示输入jdoe
的密码,然后文件将被复制到接收端的/home/jdoe
。
正如本章前面提到的,SSH 的默认端口(端口 22)可能在目标上没有打开,也许它正在监听不同的端口。使用scp
,我们可以指定一个不同的端口。为此,使用-P
标志。请注意,这是一个大写的P
,不像ssh
命令使用小写的-p
来指定端口(在切换ssh
和scp
时,这可能有点令人困惑)。例如,这个标志被添加到前面的命令中:
scp -P 6022 my-image.jpg jdoe@bar:~
在你的实验室里试一试。找到任何类型的文件,尝试将其传输到另一台 Linux 机器上。如果你这样做几次,你应该能够很快掌握它。关于scp
的另一个有趣的地方是,如果你已经知道要下载的文件的路径,你可以使用它将文件或目录从远程机器复制到本地机器。在本节的最后一个例子中,我正在将myimage.jpg
从远程主机bar
复制到我的当前工作目录(我用一个句号来指定):
scp jdoe@bar:~/myimage.jpg .
通过 SSH 进行隧道流量
SSH 最有用的功能之一是创建SSH 隧道。SSH 隧道允许你在本地访问来自另一台计算机或服务器的服务。这使你可以做一些事情,比如绕过本地 DNS 过滤,或者甚至从家里访问公司内部隔离的 IRC 服务器。
注意
在使用 SSH 隧道时要非常小心。如果你在工作时无法访问资源,或者工作资源被阻止在网络外部访问,很可能是网络管理员(如果不是你)出于某种原因设置了这样的方式。当绕过限制或从网络外部访问工作资源时,一定要确保你有权限这样做。
为了使 SSH 隧道有效,您首先需要能够访问 SSH,其中您想要访问的服务托管。如果您能够启动到包含该服务的网络的普通 SSH 连接,那么您很可能不会在创建隧道时遇到问题。
在使用 SSH 创建隧道时,命令会有所变化。我们不仅仅是针对主机名或 IP 地址执行ssh
命令,还添加了一些标志。首先,我们添加了-L
标志。这设置了所谓的绑定地址,基本上意味着我们正在将本地端口转发到另一端的特定端口。
这样一个命令字符串的语法将是这样的:
ssh -L <local-port>:localhost:<remote-port> <username>@10.10.10.101
基本上,我们使用-L
标志执行 SSH,并使用localhost
,因为我们打算将本地服务转发到远程服务。但是,我们在命令中夹在一个端口和一个冒号。左侧的端口是我们的本地端口,右侧的 IP 地址上有一个冒号,然后是远程端口。然后我们用我们通常的语法结束命令,也就是我们输入我们的用户名,然后是我们将用于连接的网关的 IP 地址。
还是感到困惑吗?让我们进一步分解并举例说明。
默认情况下,VNC(图形远程访问程序)使用端口 5900-5902。如果您想要访问具有 IP 地址10.10.10.101
的远程主机上的桌面环境,请使用以下命令:
ssh -L 5900:localhost:5901 jdoe@10.10.10.101
在这里,我们将本地机器上的端口5900
转发到10.10.10.101
上的端口5901
。会话连接并建立后,我们可以在本地机器上的 VNC 查看应用程序中使用以下内容连接到远程端上的 VNC 服务:
localhost:5900
每当使用localhost:5900
时,我们将被转发到我们的远程机器。要结束会话,请退出 SSH 连接。对于 VNC,我们需要指定要使用的 VNC 会话。为了使用 VNC Viewer 应用程序打开到10.10.10.101
的 VNC 会话,我们将执行以下命令:
vncviewer localhost:1
然而,如果我们希望连接的机器或服务位于不同的网关后面怎么办?前面的例子只有在 IP 地址10.10.10.101
可以通过互联网路由,或者我们实际上在要连接的资源相同的网络上时才有效。这并不总是情况,通常有用的服务并不直接暴露在互联网上。例如,如果您在家里,希望连接到工作网络中计算机上的远程桌面协议,前面的例子就行不通了。
在这个例子中,在办公室,我们有一台计算机,其远程桌面暴露了一个 IP 地址10.10.10.60
。我们无法直接从家里访问这台机器,因为它不能通过互联网路由。然而,我们碰巧在工作中有一台服务器,实际上是暴露在互联网上的,具有外部 IP 地址66.238.170.50
。我们能够直接从家里 SSH 进入那台机器,但主机10.10.10.60
在那个网络中更进一步。
在这里,我们可以利用主机66.238.170.50
来促进我们与工作网络内10.10.10.60
的连接。让我们看一个命令:
ssh -L 3388:10.10.10.60:3389 jdoe@66.238.170.50
在这个例子中,jdoe
在主机66.238.170.50
上有一个用户帐户,并希望连接到主机10.10.10.60
,这是在她的公司网络内的。在这个例子中,jdoe
正在将localhost
上的本地端口3388
转发到主机10.10.10.60
上的端口3389
,但是通过主机66.238.170.50
建立连接。现在,用户jdoe
可以打开远程桌面客户端,并使用以下命令进行连接:
localhost:3388
只要 SSH 连接保持打开状态,jdoe
就能够从她的本地计算机上的服务器上使用远程桌面。如果关闭 shell,则连接将终止。
使用 SSH 隧道可能非常有用。随时尝试并查看您可以通过网络转发哪些服务。
生成公钥
SSH 还支持公钥认证,除了传统密码之外,这更加安全。虽然 SSH 使用协议 2 的加密很强大,但即使世界上最强大的加密也无法保护你的密码泄露或被暴力破解。这在关键任务的服务器上尤为灾难性。
使用公钥认证允许你使用私钥和公钥的关系连接到主机,而不是使用密码。默认情况下,SSH 允许用户通过用户名/密码组合或用户名/密钥对组合登录。第一种方法的安全性取决于密码。通过使用公钥认证,你可以完全绕过密码的需求,并连接到服务器而不需要提示。但是,如果服务器仍然接受你的密码作为认证手段,那么公钥认证并不是最强大的。
在 SSH 连接的服务器端,可以配置它只接受公钥认证,而不是密码。如果禁用了密码认证,那么没有人能够暴力破解密码进入服务器,因为密码会被忽略。如果攻击者没有私钥,那么他或她将无法连接。
使用ssh-keygen
命令生成密钥对非常简单,它会引导你完成密钥设置的过程。在这个过程中,你会被要求创建一个密码。如果你愿意的话,可以忽略这个提示,直接按Enter键创建一个没有密码的密钥。然而,这样做会大大降低密钥的安全性。虽然通过 SSH 连接到主机时不需要输入任何内容肯定更方便,但强烈建议使用密码,并从增加的安全性中受益。
使用公钥认证时,在用户的主目录中会创建两个文件:id_rsa
和id_rsa.pub
。这些文件是在执行ssh-keygen
过程中创建的。命令完成后,这两个文件应该位于你主目录的.ssh
目录中。id_rsa
文件是你的私钥。你应该将它保留在本地,不要传输或在公共场所共享。id_rsa.pub
文件是你的公钥,你可以安全地复制到其他你连接的主机上。从那时起,你将能够使用公钥认证连接到另一个主机。
让我们总结整个过程。首先,在本地或主机上登录后,执行ssh-keygen
并按照步骤进行。确保创建一个密码以增加安全性。
使用 ssh-keygen 为 SSH 创建密钥对
接下来,使用ssh-copy-id
命令将你的密钥复制到你希望连接的远程服务器上。命令语法如下。
ssh-copy-id -i ~/.ssh/id_rsa.pub <remote host IP or name>
这个命令将把你的公钥复制到目标机器的~/.ssh
文件夹下的authorized_keys
文件中。这个文件存储了机器知道的所有密钥。如果你在运行ssh-copy-id
过程之前和之后进行检查,你会注意到目标机器上的authorized_keys
文件要么不存在,要么在执行命令之后才包含你的密钥。
使用 ssh-copy-id 将公钥复制到远程主机
如前所述,可以配置你的计算机或服务器禁止通过密码进行认证,只允许使用公钥认证。这部分将在第九章保护您的网络中进一步讨论。现在,重要的是养成生成、复制和使用密钥的习惯。随时可以在本地机器上创建密钥对,并将公钥复制到你经常连接的服务器上。
保持 SSH 连接活动
根据您的 SSH 服务器或内部防火墙的配置方式,您的 SSH 会话可能会在一段时间后自动断开连接。可以配置 SSH 每隔一定时间发送一个特殊数据包,以保持连接不处于空闲状态并成为断开连接的候选。如果您有一个利用 SSH 的服务,您不希望它被断开连接,这将非常有用。要使用此调整,我们必须配置ServerAliveInterval
设置。
有两种配置方式,一种影响您的用户帐户,另一种将系统范围的设置部署。首先,让我们看看如何为您的用户帐户配置这个。
记得我们在本章前面配置的~/.ssh/config
文件吗?再次在文本编辑器中打开它。以下是这个文件的一个示例,以方便您参考:
Host icarus
Hostname 10.10.10.76
Port 22
User jdoe
Host daedalus
Hostname 10.10.10.88
Port 65000
User duser
Host dragon
Hostname 10.10.10.99
Port 22
User jdoe
与之前一样,我们有三个系统。如果我们希望为主机(例如icarus
)配置一个设置,使其每 60 秒发送一个活动数据包,我们可以向其添加以下设置:
Host icarus
ServerAliveInterval 60
Hostname 10.10.10.76
Port 22
User jdoe
如果我们希望为我们连接的所有主机设置ServerAliveInterval
设置,我们可以将此选项作为通配符添加到文件顶部:
Host *
ServerAliveInterval 60
有了这个设置,该设置将对我们发起连接的所有系统生效。虽然我们还没有讨论它们(但是),SSH 有两个系统范围(全局)的配置文件。我们将在本书的后面讨论这些文件,但本节的主题是为您提供一个快速介绍:
-
/etc/ssh/ssh_config
:此文件将影响所有进行出站连接的用户。将其视为客户端配置文件。 -
/etc/ssh/sshd_config
:这是服务器的全局配置文件。
您在这两个文件中配置的任何内容都会影响任何人。ssh_config
文件影响所有出站连接,而sshd_config
影响所有入站连接。对于本节,我们感兴趣的文件是ssh_config
文件,因为我们可以在那里设置所有用户的ServerAliveInterval
设置。实际上,无论我们是在配置/etc/ssh/ssh_config
还是本地的~/.ssh/config
文件,选项都是相同的。只需将其添加到文件末尾:
ServerAliveInterval 60
当然,我们将在本书的后面进一步探讨配置这些选项。现在,只需记住这两个文件的目的和它们的位置。
探索 SSH 的替代方案-使用 Mosh(移动 shell)
在开始使用 SSH 时,您可能会立即注意到一个怪癖:如果您的网络连接中断,重新获得对您连接到的计算机的控制可能会很困难。这在笔记本电脑上特别常见,因为这种设备上的连接状态会根据您所在的位置或所连接的网络而改变。在终端复用器(如 tmux 或 screen)中运行命令可以使您的工作流在断开连接后保持活动状态,但是 SSH 的替代方案可能适合您。Mosh(移动 shell)是 SSH 的替代方案,即使您断开了资源所在的网络,也会保持远程会话的活动状态。当您重新连接到网络时,Mosh 将允许您从上次离开的地方继续进行。
在 Debian 中安装 Mosh 非常容易。只需安装mosh
包,因为它可以从默认存储库中获得:
# apt-get install mosh
在 CentOS 中,Mosh 无法从该发行版的默认存储库中获得,因此您首先需要添加一个额外的存储库才能使其可用。首先,使用以下命令启用 EPEL 存储库:
# yum install epel-release
然后,您应该能够安装mosh
包:
# yum install mosh
为了使 Mosh 有效,您不仅需要在本地计算机上安装它,还需要在您希望连接的任何计算机上安装它。语法与 SSH 类似:
mosh jdoe@10.10.10.101
与 SSH 一样,我们可以使用-p
标志来指定要使用的不同端口:
mosh -p 2222 jdoe@10.10.10.101
事实上,Mosh 实际上利用 SSH 来建立连接,然后 mosh 程序接管连接。连接后,您可以通过拔掉网络电缆或断开无线接入点来模拟断开连接。您会注意到,下次使用 mosh 连接时,您的会话应该和您离开时一样。要看到所有这些魔法,可以考虑在断开连接之前启动一个进程(比如运行top
命令)。
虽然有许多方法可以在会话断开时保持远程服务器上的进程运行,但 Mosh 是较新和更独特的解决方案之一。试一试吧!
总结
在本章中,我们讨论了 SSH 的所有优点。我们首先讨论了 SSH 是什么以及它的用途,然后确保它已安装在我们的系统上。使用 SSH,我们能够连接到其他 Linux 机器并执行命令。我们还研究了在~/.ssh/config
文件中配置主机以及使用scp
在一个主机和另一个主机之间传输文件。此外,我们还讨论了 SSH 隧道,以及公钥认证的介绍。我们最后介绍了 Mosh,这是 SSH 的一个不错的替代品。
在下一章中,我们将通过建立自己的文件服务器来解决文件共享的问题。我们将通过 Samba 和 NFS 设置文件共享,以及每种解决方案的个别特点。到时见!
第四章:设置文件服务器
在上一章中,我们介绍了 SSH 并讨论了 SCP。虽然 SCP 是手动将单个文件从一个地方传输到另一个地方的好方法,但在网络上有一个或多个中心位置来存储共享文件对于网络增加了很多价值。无论您是在商业网络上共享重要文件,还是在家庭网络上共享家庭相册,网络上的中央文件存储位置都是一个方便的资产。在本章中,我们将讨论三种实现这一目标的方法。我们首先将讨论设计文件服务器时的一些考虑事项,然后我们将介绍 NFS、Samba 和 SSHFS。
在本章中,我们将涵盖:
-
文件服务器的考虑事项
-
NFS v3 与 NFS v4
-
设置 NFS 服务器
-
学习 Samba 的基础知识
-
设置 Samba 服务器
-
挂载网络共享
-
通过 fstab 和 systemd 自动挂载网络共享
-
使用 SSHFS 创建网络文件系统
文件服务器的考虑事项
与 Linux 世界中的大多数事物一样,实现任何目标的方法不止一种。对于每种方法,都有许多最佳实践和注意事项需要在实施解决方案之前了解。正如前面提到的,从一个 Linux 系统向另一个 Linux 系统共享文件的三种最常见方法是网络文件系统(NFS)、Samba和安全外壳文件 系统(SSHFS)。这三种方法主要满足不同的需求,您的网络布局将决定您应该使用哪种方法。
设计网络文件服务器时的第一个考虑事项是需要访问其文件的平台类型。NFS 通常是 Linux 环境中的一个很好的选择;然而,它在处理混合环境时表现不佳,因此如果您的网络中有需要与 Windows 机器共享文件的情况,您可能不希望选择它。并不是说您不能在 Windows 系统上访问 NFS 共享(您当然可以),但微软限制了 NFS 的可用性(称为NFS 服务)到每个 Windows 版本的最昂贵的版本。如果您使用支持它的 Windows 版本,NFS 服务是可以的,但由于需要克服额外的许可障碍,避开它可能更有意义。一般来说,只有当您的网络主要由 UNIX 和 Linux 节点组成时,NFS 才是一个很好的选择。
接下来要考虑的是 Samba。Samba 允许在所有三个主要平台(Windows、Linux 和 Mac OSX)之间共享文件,并且在混合环境中是一个很好的选择。由于 Samba 使用SMB协议,Windows 系统可以访问您的 Samba 共享,而不管您安装的版本如何,因此许可证并不是那么重要。事实上,即使是 Windows 的标准版或家庭版也能够本地访问这些共享,无需安装额外的插件。Samba 的缺点在于它处理权限的方式。在 Windows 和 Linux 节点之间保存文件时,需要一些额外的工作来处理权限,因此在处理需要保留特定权限的 UNIX 或 Linux 节点时,它并不总是最佳选择。
最后,SSHFS 是另一种主要用于在 Linux 节点之间共享文件的方法。当然,可以从 Windows 连接和访问 SSHFS,但只能使用第三方实用程序,因为 Windows 中没有内置的方法(至少在撰写本章时)。SSHFS 的优点在于其易用性和文件传输的加密。虽然加密确实有助于避免窃听,但请记住,SSHFS(就像任何其他解决方案一样)只有在您制定的政策下才是安全的。但是在得心应手的情况下,SSH(和 SSHFS)是从一个节点传输文件到另一个节点的安全方法。此外,SSHFS 是这里列出的三种方法中最容易运行的。您只需要访问另一个节点和访问一个或多个目录的权限。这就是您需要的一切,然后您就可以自动连接到您有权限访问的任何目录。SSHFS 的另一个好处是除了 SSH 本身之外,服务器上没有其他需要配置的东西,而大多数服务器都可以使用 SSH。SSHFS 连接也可以快速按需创建和断开。我们将在本章后面讨论 SSHFS。
NFS v3 与 NFS v4
关于 NFS 的另一个考虑是您将使用的版本。如今,大多数(如果不是全部)Linux 发行版默认使用 NFS v4。但是,有些情况下,您可能在网络上有较旧的服务器,需要能够连接到它们的共享。虽然 NFS v4 绝对是未来的首选版本,但您可能需要使用旧协议连接到节点。
在这两种情况下,可以通过编辑/etc/exports
文件共享文件服务器上的目录,您将在其中列出您的共享(exports),每行一个。我们将在下一节详细讨论这个文件。但现在,请记住/etc/exports
文件是您声明文件系统上哪些目录可用于 NFS 使用的地方。不同版本的 NFS 有不同的处理文件锁定的技术,它们在引入idmapd、性能和安全性方面有所不同。此外,还有其他差异,比如 NFS v4 转移到仅支持 TCP(协议的早期版本允许 UDP 或 TCP),以及它是有状态的,而早期版本是无状态的。
NFS v4 是有状态的,它将文件锁定作为协议的一部分,而不像 NFS v3 那样依赖于网络锁管理器(NLM)来提供该功能。如果 NFS 服务器崩溃或不可用,连接到它的一个或多个节点可能会有打开的文件,这些文件将被锁定到这些节点。当 NFS 服务器开始备份时,它会重新建立这些锁,并尝试从崩溃中恢复。尽管 NFS 服务器在恢复方面做得相当不错,但它们并不完美,有时文件锁定可能成为管理员处理的噩梦。使用 NFS v4,NLM 被废弃,文件锁定成为协议的一部分,因此锁定处理更加高效。然而,它仍然不完美。
那么,您应该使用哪个版本?建议在所有节点和服务器上始终使用 NFS v4,除非您需要支持旧协议的较旧服务器。
设置 NFS 服务器
配置 NFS 服务器相对简单。基本上,您只需要安装所需的软件包,创建您的/etc/exports
文件,并确保所需的守护程序(服务)正在运行。在这个活动中,我们将设置一个 NFS 服务器,并从不同的节点连接到它。为了这样做,建议您至少有两台 Linux 机器可以使用。这些机器是物理机器还是虚拟机器,或者两者的组合并不重要。如果您已经按照第一章设置您的环境进行了操作,您应该已经有了几个节点可以使用;希望是 Debian 和 CentOS 的混合,因为这个过程在它们之间有些不同。
首先,让我们设置我们的 NFS 服务器。选择一台机器作为 NFS 服务器并安装所需的软件包。您选择哪个发行版作为服务器,哪个作为客户端并不重要,我将介绍 CentOS 和 Debian 的配置过程。由于相当多的发行版要么基于 Debian,要么使用与 CentOS 相同的配置,这对大多数发行版都适用。如果您使用的发行版不遵循任何软件包命名约定,您只需查找在您的特定发行版上安装的软件包或元软件包。其余的配置应该是相同的,因为 NFS 是相当标准的。
要在 CentOS 系统上安装所需的软件包,我们将执行以下命令:
# yum install nfs-utils
对于 Debian,我们安装nfs-kernel-server
:
# apt-get install nfs-kernel-server
注意
在安装这些软件包时,您可能会收到一个错误,即 NFS 尚未启动,因为文件系统上不存在/etc/exports
。在某些发行版上安装所需的 NFS 软件包时,可能不会自动创建此文件。即使它确实自动创建,该文件也只是一个框架。如果您收到这样的错误,请忽略它。我们将很快创建此文件。
接下来,我们将确保与 NFS 相关的服务已启用,以便它们在服务器启动时启动。对于 CentOS 系统,我们将使用以下命令:
# systemctl enable nfs-server
对于 Debian,我们可以通过以下方式启用 NFS:
# systemctl enable nfs-kernel-server
请记住,我们只是在服务器上启用了 NFS 守护程序,这意味着当系统重新启动时,NFS 也将启动(如果我们正确配置了它)。但是,我们不必重新启动整个服务器才能启动 NFS;我们可以在创建配置文件后的任何时间启动它。实际上,直到我们实际创建配置之前,您的发行版可能根本不会让您启动 NFS。
下一步是确定我们希望在网络上提供哪些服务器目录。您分享哪些目录基本上取决于您。Linux 文件系统上的任何内容都可以作为 NFS 导出的候选项。但是,一些目录,比如/etc
(其中包含系统配置)或任何其他系统目录,可能最好保持私有。虽然您可以共享系统上的任何目录,但实际上,常见做法是创建一个单独的目录来存放所有共享的内容,然后在其下创建子目录,然后共享给客户端。
例如,也许您会在文件系统的根目录(mkdir /exports
)下创建一个名为exports
的目录,然后创建诸如docs
和images
之类的目录,以便他人可以访问。这样做的好处是,您的共享可以从一个地方(/exports
目录)进行管理,并且 NFS 本身具有将此目录分类为您的导出根目录的能力(我们将在后面讨论)。在继续之前,在文件系统上创建一些目录,以便在下一节中将这些目录放入配置文件中。
一旦确定了文件系统中想要共享的目录并创建了它们,你就可以开始实际的配置了。每个 NFS 共享,也称为 export,在/etc/exports
文件中添加每个我们希望共享的目录的一行来配置。由于你已经安装了所需的软件包以在系统上使用 NFS,这个文件可能已经存在,也可能不存在。根据我的经验,CentOS 在安装过程中不会创建这个文件,而 Debian 会。但即使你得到了一个默认的exports
文件,它只会包含已注释掉的代码行,没有任何实际用途。实际上,你甚至可能在安装过程中收到警告或错误,说 NFS 守护进程没有启动,因为找不到/etc/exports
。没关系,因为我们很快就会创建这个文件。
默认的exports
文件在不同的发行版之间可能不同(如果默认情况下根本不创建),但是创建新的 exports 的格式是相同的,不管你选择的发行版是什么,因为 NFS 是相当标准的。添加一个 export 的过程是打开你喜欢的文本编辑器中的/etc/exports
文件,并将每个 export 添加到自己的一行中。任何实际的文本编辑器都可以,只要它是文本编辑器而不是文字处理器。例如,如果你喜欢 vim,你可以执行以下命令:
# vim /etc/exports
如果你喜欢nano
,你可以执行以下命令:
# nano /etc/exports
实际上,你甚至可以使用图形文本编辑器,比如 Gedit、Kate、Pluma 或 Geany,如果你更喜欢使用 GUI 工具。这些软件包都可以在大多数发行版的存储库中找到。
注意
可能不用说,但是要编辑/etc
目录中或任何其他由 root 拥有的文件,你需要在这样的命令前加上sudo
前缀,以便在没有以 root 身份登录时编辑它们。作为最佳实践,建议除非你绝对必须,否则不要以 root 身份登录。如果你以普通用户身份登录,执行以下命令:
sudo vim /etc/exports
在 Debian 中,你会看到默认的/etc/exports
文件包含一系列注释,这可能对你有所帮助,以便查看 exports 的格式。我们可以通过简单地将它们添加到文件的末尾来创建新的 exports,保留内容。如果你更喜欢从一个空白文件开始,你可能想要备份原始文件,以防以后需要参考它。
# mv /etc/exports /etc/exports.default
一旦你在你喜欢的文本编辑器中打开了文件,你就可以开始了。你希望共享或导出的所有目录都应该放在这个文件中,每个目录占据一行。然后,你可以附加参数到共享中,以控制它如何被访问以及由谁访问。以下是一个示例 exports 文件,其中包含一些示例目录和每个目录的一些基本配置参数:
/exports/docs 10.10.10.0/24(ro,no_subtree_check)
/exports/images 10.10.10.0/24(rw,no_subtree_check)
/exports/downloads 10.10.10.0/24(rw,no_subtree_check)
正如你在这些示例 exports 中所看到的,每个的格式基本上包括我们想要导出的目录,我们想要允许访问的网络地址,然后是括号中的一些附加选项。你可以在这里附加许多选项,我们将在本章后面讨论其中一些。但如果你想查看你可以在这里设置的所有选项,可以参考以下man
命令:
man exports
让我们讨论一下之前使用的示例exports
文件的每个部分:
-
/exports/docs
:第一部分包含我们要向网络上的其他节点导出的目录。如前所述,你几乎可以共享任何你想要的目录。但只是因为你可以共享一个目录,并不意味着你应该。只共享你不介意其他人访问的目录。 -
10.10.10.0/24
:在这里,我们限制了对10.10.10.0/24
网络内的节点的访问。该网络之外的节点将无法挂载任何这些导出。在此示例中,我们可以使用10.10.10.0/255.255.255.0
,结果将是相同的。在我们的示例中,使用了/24
,这被称为无类域间路由(CIDR)表示法,它是用于输入子网掩码的简写。当然,CIDR 还有更多内容,但现在只需记住,与子网掩码相比,CIDR 表示法用于使示例更短(而且看起来更酷)。 -
ro
:在第一个导出(docs)中,我将其设置为只读,没有其他原因,只是为了向您展示您可以这样做。这可能是不言自明的,但导出为只读的目录将允许其他人挂载导出并访问其中的文件,但不会对任何内容进行更改。 -
rw
:读写导出允许挂载它的节点创建新文件并修改现有文件(只要用户在文件本身上设置了所需的权限)。 -
no_subtree_check
:虽然此选项是默认的,我们实际上不需要显式发出请求,但不包括它可能会导致 NFS 在重新启动时抱怨。这个选项是subtree_check
的相反,后者现在基本上是被避免的。特别是,此选项控制服务器在处理导出中的操作时是否扫描底层文件系统,这可能会增加一些安全性但降低可靠性。由于禁用此选项已知可以增加可靠性,因此在最近的 NFS 版本中已将其设置为默认值。
尽管我在我的任何示例中都没有使用它,但您将在/etc/exports
中看到的常见导出选项是no_root_squash
。设置此选项允许终端用户设备上的 root 用户对导出中包含的文件具有 root 访问权限。在大多数情况下,这是一个坏主意,但您会在野外偶尔看到这种情况。这与root_squash
相反,后者将 root 用户映射到 nobody。除非您有非常充分的理由做出不同的选择,否则no_root_squash
是您想要的。
除了为单个网络分类选项外,您还可以通过在同一行中为它们添加配置来使您的导出可用于其他网络。以下是我们的docs
挂载与其他网络共享的示例:
/exports/docs 10.10.10.0/24(ro,no_subtree_check),192.168.1.0/24(ro,no_subtree_check)
通过此示例,我们正在导出/exports/docs
,以便10.10.10.0/24
网络和192.168.1.0/24
网络内的节点可以访问。虽然我为两者使用了相同的选项,但您不必这样做。如果您愿意,甚至可以为一个网络配置导出为只读,而为另一个网络配置为读写。
到目前为止,我们一直在与整个网络共享我们的导出。这是通过将允许的 IP 地址的最后一个八位设置为0
来完成的。通过上一个示例,任何具有 IP 地址为10.10.10.x
或192.168.1.x
且子网掩码为255.255.255.0
的节点都有资格访问导出。然而,您可能并不总是想要给整个网络访问权限。也许您只想允许单个节点访问。您可以同样轻松地对单个节点进行分类:
/exports/docs 10.10.10.191/24(ro,no_subtree_check)
在上一个示例中,我们允许具有 IP 地址10.10.10.191
的节点访问我们的导出。指定 IP 地址或网络可以增强安全性,尽管这并非百分之百的通用方法。然而,仅限于绝对需要访问的主机是构建安全策略的一个非常好的起点。我们将在第九章保护您的网络中更详细地介绍安全性。但现在,请记住,您可以通过特定网络或个别 IP 限制对导出的访问。
早些时候,我们提到从版本 4 开始,NFS 可以使用一个目录作为其导出根,也称为 NFS 伪文件系统。在/etc/exports
文件中,通过在导出此目录时放置fsid=0
或fsid=root
来标识这一点。在本章中,我们一直在使用/exports
作为我们的 NFS 导出的基础。如果我们想要将此目录标识为我们的导出根,我们将像这样更改/etc/exports
文件:
/exports *(ro,fsid=0)
/exports/docs 10.10.10.0/24(ro,no_subtree_check)
/exports/images 10.10.10.0/24(rw,no_subtree_check)
/exports/downloads 10.10.10.0/24(rw,no_subtree_check)
起初,这个概念可能有点令人困惑,所以让我们把它分解一下。在第一行中,我们确定了我们的导出根:
/exports *(ro,fsid=0)
在这里,我们声明/exports
为我们的导出根。这现在是 NFS 文件系统的根。当然,就 Linux 本身而言,您有一个以/
开头的完整文件系统,但就 NFS 而言,它的文件系统现在从这里开始,即/exports
。在这一行中,我们还将/exports
声明为只读。我们不希望任何人对这个目录进行更改,因为它是 NFS 根。它也与所有人共享(注意*
),但这不应该有关系,因为我们为每个单独的导出设置了更细粒度的权限。有了 NFS 根,客户端现在可以挂载这些导出,而无需知道如何到达它的完整路径。
例如,用户可能会输入以下内容,将我们的downloads
导出挂载到他或她的本地文件系统:
# mount 10.10.10.100:/exports/downloads /mnt/downloads
这是如何从本地文件服务器(在这种情况下为10.10.10.100
)挂载 NFS 导出的方式,该服务器不使用 NFS 根。这需要用户知道该目录位于该服务器上的/exports/downloads
。但是有了 NFS 根,我们可以让用户简化mount
命令如下:
# mount 10.10.10.100:/downloads /mnt/downloads
请注意,我们在上一个命令中省略了/exports。虽然这可能看起来不是很重要,但我们基本上是在要求服务器给我们downloads
导出,无论它在文件系统的哪个位置。downloads
目录位于/exports/downloads
,/srv/nfs/downloads
或其他任何地方都无所谓。我们只是要求downloads
导出,服务器知道它在哪里,因为我们设置了 NFS 根。
现在我们已经配置了我们的/etc/exports
文件,很好的建议我们编辑/etc/idmapd.conf
配置文件以配置一些额外的选项。这并不是绝对必需的,但绝对是建议的。默认的idmapd.conf
文件因发行版而异,但每个都包含我们需要在此部分配置的选项。首先,查找以下行(或非常相似的行):
# Domain = local.domain
首先,我们需要取消注释该行。删除#
符号和尾随空格,使该行以Domain
开头。然后,设置您的域,使其与网络上的其他节点相同。这个域很可能在安装过程中已经选择过了。如果您不记得您的域是什么,运行hostname
命令应该会给您您的域名,这个域名紧跟在您的主机名后面。对于您想要能够访问 NFS 导出的每个节点都要这样做。
您可能想知道为什么这是必要的。当在 Linux 系统上创建用户和组帐户时,它们被分配了UID(用户 ID)和GID(组 ID)。除非您在所有系统上以完全相同的顺序创建了用户帐户,否则 UID 和 GID 在每个节点上很可能是不同的。即使您按照相同的顺序创建了用户和组帐户,它们仍然可能是不同的。idmapd
文件通过将这些 UID 从一个系统映射到另一个系统来帮助我们。为了使idmapd
工作,idmapd
守护程序必须在每个节点上运行,并且该文件还应配置相同的域名。在 CentOS 和 Debian 上,该守护程序在/usr/sbin/rpc.idmapd
下运行,并且随 NFS 服务器一起启动。
那么,你可能会想,Nobody-User
和Nobody-Group
的目的是什么?nobody
用户运行的脚本或命令如果由特权用户运行可能会很危险。通常,nobody
用户无法登录系统,也没有家目录。如果您将进程作为nobody
运行,那么如果该帐户被破坏,其范围将受到限制。在 NFS 的情况下,nobody
用户和nobody
组具有特殊目的。如果文件由一个系统上不存在的特定用户拥有,那么文件的权限将显示为由nobody
用户和组拥有。当未设置no_root_squash
时,通过 root 用户访问文件也是如此。根据您使用的发行版,这些帐户可能具有不同的名称。在 Debian 中,Nobody-User
和Nobody-Group
默认为nobody
。在 CentOS 中,这两者都是nobody
。您可以在idmapd.conf
文件中看到nobody
用户和nobody
组使用的帐户。您不应该需要重命名这些帐户,但如果出于某种原因您需要这样做,您需要确保idmapd.conf
文件为它们具有正确的名称。
现在我们已经配置好并准备好使用 NFS 了,我们该如何开始使用它呢?如果您一直在跟进,您可能已经注意到我们启用了 NFS 守护程序,但尚未启动它。既然配置已经就位,没有什么能阻止我们这样做了。
在 Debian 上,我们可以通过执行以下命令来启动 NFS 守护程序:
# systemctl start nfs-kernel-server
在 CentOS 上,我们可以执行以下命令:
# systemctl start nfs-server
从这一点开始,我们的 NFS 导出应该已经共享并准备就绪。在本章的后面,我将解释如何在其他系统上挂载这些导出(以及 Samba 共享)。
NFS 中还有一件值得一提的事情。每当 NFS 守护程序启动时,都会读取/etc/exports
文件,这意味着您可以通过重新启动服务器或 NFS 守护程序来激活新的导出。但是,在生产中,重新启动 NFS 或服务器本身是不切实际的。这将中断当前正在使用它的用户,并可能导致过时的挂载,这是对网络共享的无效连接(这不是一个好的情况)。幸运的是,激活新的导出而无需重新启动 NFS 本身是很容易的。只需执行以下命令,您就可以开始了:
# exportfs -a
学习 Samba 的基础知识
与 NFS 一样,Samba 允许您与网络中的其他计算机共享服务器上的目录。尽管两者都有相同的目的,但它们适用于不同的环境和用例。
NFS 是最古老的方法,在 Linux 和 UNIX 世界中被广泛使用。虽然我们当然有更新的解决方案(如 SSHFS),NFS 是经过验证的。但在混合环境中,它可能不是最佳解决方案。如今,您的网络上可能并非每台计算机都运行特定的操作系统,因此可能存在 NFS 访问不可用或不切实际的节点。
正如前面提到的,只有更昂贵的 Windows 版本才支持 NFS。如果你有一个庞大的 Windows 机器网络,要想将它们全部升级到更高版本将会非常昂贵,如果你本来不需要的话。这是 Samba 最擅长的领域。Windows、Linux 和 Mac 计算机都可以通过 Samba 访问共享目录。在 Windows 的情况下,即使是较低端的版本也可以访问 Samba 共享(例如 Windows 7 家庭专业版或 Windows 10 核心),而无需进行任何新的安装或购买。
Samba 的缺点是它处理权限的能力不如 NFS,因此您需要以特殊的方式管理配置文件以尊重权限。然而,它并非百分之百可靠。例如,Windows 和 Linux/UNIX 系统采用非常不同的权限方案,因此它们并不是本质上兼容的。在 Samba 的配置文件中,您可以告诉它在新创建的文件上使用特定的用户和组权限,甚至可以强制 Samba 将所有权视为与实际存储的文件不同的东西。因此,确实有方法可以使 Samba 处理权限更好,但本质上不如 NFS 这样的 Linux 或 UNIX 本地解决方案好。
就 Samba 服务器如何适应您的网络而言,基本的经验法则是在混合环境中使用 Samba,在不需要跨平台兼容性时使用 NFS。
设置 Samba 服务器
在本节中,我们将继续设置 Samba 服务器。在下一节中,我将解释如何挂载 Samba 共享。首先,我们需要安装 Samba。在 CentOS 和 Debian 系统上,该软件包简单地被称为samba
。因此,通过apt-get
或yum
安装该软件包,您应该拥有所需的一切:
# yum install samba
使用apt-get
的命令如下:
# apt-get install samba
在 Debian 系统上,Samba 在安装后立即启动。实际上,它也已启用,因此每次启动系统时都会自动启动。但在 CentOS 的情况下,安装后它既没有启用也没有启动。如果您选择 CentOS 作为 Samba 服务器,您需要启用并启动守护进程:
# systemctl start smb
# systemctl enable smb
现在,Samba 已安装、启用,但尚未配置。要配置 Samba,我们需要编辑/etc/samba/smb.conf
文件。默认情况下,安装所需软件包后会立即创建此文件。但是,默认文件主要是为您提供配置示例而存在的。它非常庞大,但您可能希望查看它以查看以后可能要使用的一些语法示例。您可以在文本编辑器中打开文件,也可以在终端上使用cat
命令查看文件:
cat /etc/samba/smb.conf
为了简化事情,我建议您从一个新文件开始。虽然配置示例绝对不错,但我们可能应该为生产目的使用一个更短的文件。由于原始文件以后可能有用,创建一个备份:
# mv /etc/samba/smb.conf /etc/samba/smb.conf.default
接下来,只需在文本编辑器中打开smb.conf
文件,这将创建一个新的/空的文件,因为我们已经将原始文件移动到备份中:
# vim /etc/samba/smb.conf
我们可以从以下基本配置开始:
[global]
server string = File Server
workgroup = HOME-NET
security = user
map to guest = Bad User
name resolve order = bcast hosts wins
include = /etc/samba/smbshared.conf
让我们逐行浏览这个配置文件。首先,我们从[global]
部分开始,这是我们为整个服务器配置选项的地方。实际上,这是这个特定文件中唯一的部分。
接下来是server string
。server string
是您在 Windows 系统上浏览网络共享时会看到的描述。例如,您可能会看到一个名为Documents
的共享,并在其下方看到一个描述; 文件服务器
。这个部分不是必需的,但拥有它是很好的。在企业网络中,这对于概述有关系统的注释,比如它在哪里,或者它用于什么,是很有用的。
接下来,我们设置了我们的“工作组”。那些曾经是 Windows 系统管理员的人可能非常了解这一点。工作组用作包含特定目的所有系统的命名空间。在实践中,这通常是您的局域网的名称。您的局域网中的每台计算机都将具有相同的工作组名称,因此它们将显示为存在于同一网络中。在 Windows 系统上浏览共享时,您可能会看到工作组列表,双击其中一个将带您到共享资源的系统列表。在大多数情况下,您可能希望每个系统具有相同的工作组名称,除非您希望分开资源。要查看现有系统的工作组名称,请右键单击我的电脑或此电脑(取决于您的版本),然后单击属性。您的工作组名称应在出现的窗口中列出。
查看 Windows 系统的属性以获取工作组名称,在这种情况下是 LOCALNET
设置security = user
告诉 Samba 使用用户的用户名和密码进行身份验证。如果匹配,用户将不会被提示输入密码来访问资源。
map to
guest = Bad User
告诉 Samba,如果提供的用户名和密码与本地用户帐户不匹配,将连接的用户视为通过访客帐户连接。如果您不希望进行这样的映射,可以删除此部分。
接下来,name resolve order = bcast hosts wins
确定名称解析的顺序。在这里,我们首先使用广播的名称,然后是我们/etc/hosts
文件中的任何主机名映射,最后是wins
(wins
已大部分被 DNS 取代,这里仅用于兼容性)。在大多数网络中,这个顺序应该可以正常工作。
最后,我们在配置文件的末尾添加了include = /etc/samba/smbshared.conf
。基本上,这允许我们像包含现有文件一样包含另一个配置文件。在这种情况下,我们包含了/etc/samba/smbshared.conf
的内容,Samba 一旦读取了这一行,就会读取它。接下来我们将创建这个文件。基本上,这允许我们在单独的配置文件中指定我们的共享。这不是必需的,但我认为这样做会使事情更容易管理。如果您愿意,您可以在smb.conf
文件中包含smbshared.conf
文件的内容,以便一切都在一个文件中。
这是我为此活动创建的一个smbshared.conf
示例。在您的情况下,您只需要确保值与您的系统和您选择共享的目录匹配即可:
[Music]
## My music collection
path = /share/music
public = yes
writable = no
[Public]
## Public files
path = /share/public
create mask = 0664
force create mode = 0664
directory mask = 0777
force directory mode = 0777
public = yes
writable = yes
在这里,我创建了两个共享。每个共享都以方括号中的名称开头(在浏览此计算机上的共享时将显示),然后是该共享的配置。正如您所看到的,我有一个名为“音乐”的共享目录,另一个名为“公共”。
要声明共享的路径,请使用path =
,然后是共享对应的目录路径。在我的示例中,您可以看到我共享了以下目录:
/share/music
/share/public
接下来,我还通过添加public = yes
将共享声明为公共。这意味着允许访客访问此共享。如果我希望访客无法访问它,我可以将其设置为no
。
在我的音乐共享中,我设置了writable = no
。顾名思义,这禁用了其他计算机更改此共享中的文件的能力。在我的情况下,我与网络上的其他计算机共享我的音乐收藏,但我不希望意外删除音乐文件。
在我的公共共享中,我添加了一些额外选项:
create mask = 0664
force create mode = 0664
directory mask = 0777
force directory mode = 0777
这些选项都对应于在该共享中创建新文件时默认的权限。例如,如果我挂载了我的公共共享,然后在那里创建一个目录,它将获得777
的权限。如果我创建一个文件,它的权限将是664
。当然,你可能不想让你的文件完全开放,所以你可以根据自己的需要更改这些权限。这个选项确保了在新创建的目录和文件上的权限的一致性。这在一个可能有自动化进程运行需要访问这些文件的网络上是至关重要的,你希望确保每次运行这样的进程时不需要手动更正权限。
现在你已经创建了自己的 Samba 配置,测试你的配置是一个好主意。幸运的是,Samba 本身包含一个特殊的命令,允许你这样做。如果你在系统上运行testparm
,它将显示你文件中可能存在的语法错误。然后,它将显示你的配置。继续在你的系统上运行testparm
。如果有任何错误,请返回并确保你输入的内容没有问题。如果一切正常进行,你将看不到错误,然后你将得到你配置的摘要。一旦验证了你的配置,重新启动 Samba 守护进程以使更改生效。要做到这一点,只需在你的 Debian 系统上运行以下命令:
# systemctl restart smbd
对于 CentOS,请使用以下命令:
# systemctl restart smb
现在,你应该能够在 Windows 或 Linux 系统上访问你的 Samba 共享。在 Linux 上,大多数图形界面文件管理器应该允许你浏览 Samba 共享的网络。在 Windows 上,你应该能够打开我的电脑或此电脑,然后点击网络来浏览本地网络上有活动共享的计算机。也许在 Windows 机器上访问共享的一个更简单的方法是按下键盘上的 Windows 键,然后按R打开运行对话框,然后简单地输入你的 Samba 服务器的名称,以两个反斜杠开头。例如,要从 Windows 系统访问我的基于 Debian 的文件服务器(Pluto),我会在运行对话框中输入以下内容,然后按Enter:
\\pluto
我从该系统中得到了一个共享列表,如下面的屏幕截图所示:
从 Windows 7 PC 查看 Samba 共享(从 Linux 系统提供)
挂载网络共享
本章中,我们已经创建了 NFS 和 Samba 共享。但是我们还没有挂载任何这些共享。在本节中,我们将处理这个问题。
在 Linux 中,mount
命令可以用于挂载几乎所有东西。无论是连接外部硬盘,插入光盘,还是希望挂载网络共享,mount
命令都可以作为瑞士军刀来允许你将这些资源挂载到你的系统上。mount
命令允许你挂载一个资源并将其附加到你系统上的一个本地目录。在大多数情况下,在使用图形桌面环境的大多数 Linux 系统上,mount
会自动运行。如果你插入了闪存驱动器或某种光学介质,你可能已经看到了这一点。在网络共享中,这些不会自动挂载,但可以配置为自动挂载。
也许挂载网络共享的最简单方法是在安装了桌面环境的系统上使用图形文件管理器。如果你点击一个文件共享,它很可能会被挂载,并且你将被允许访问它,前提是你在该系统上有必要的权限。Nautilus、Caja、Pcmanfm和Dolphin都是流行的 Linux 文件管理器。
pcmanfm 文件管理器,查看来自 Samba 文件服务器的共享
mount
命令在没有图形环境的系统上或者当您希望将资源挂载到除默认位置之外的地方时最有用。要使用mount
命令,给出您希望挂载的资源类型,它可以找到资源的位置,然后是用于挂载的本地目录。例如,要挂载 NFS 导出,我们可能会执行类似以下的操作:
# mount -t nfs 10.10.10.101:/exports/docs /mnt/docs
或者,如果我们设置了 NFS 根目录,可以使用以下命令:
# mount -t nfs 10.10.10.101:/docs /mnt/docs
在该示例中,我们告诉挂载命令,我们希望通过提供-t
参数后跟nfs
来挂载 NFS 导出。在我的实验室中,此共享存在于具有 IP 地址10.10.10.101
的计算机上,我随后提供了该计算机上我正在访问的目录。在这种情况下,正在访问10.10.10.101
上的/exports/docs
。最后,我有一个本地目录/mnt/docs
,它存在于我本地计算机上,我希望将此共享挂载到该目录。执行此命令后,每次我在本地计算机上访问/mnt/docs
时,实际上是在我的文件服务器上访问/exports/docs
。在使用此导出后,我只需卸载它:
# umount /mnt/docs
在 Linux 机器上挂载 Samba 共享需要更多操作。我将包括一个示例命令,该命令可用于从同一服务器挂载 Samba 共享。但在执行此操作之前,您首先需要在系统上安装必要的软件包,以便能够挂载 Samba 共享。在 CentOS 上,安装samba-client
。在 Debian 上,软件包是smbclient
。安装所需软件包后,您应该能够通过执行以下命令来挂载 Samba 共享:
# mount -t cifs //10.10.10.101/Videos -o username=jay /mnt/samba/videos
如果您需要通过密码访问资源,请使用以下命令:
# mount -t cifs //10.10.10.101/Videos -o username=jay, password=mypassword /mnt/samba/videos
如您所见,挂载 Samba 共享使用了相同的基本思想。但在这种情况下,我们以不同的方式格式化我们的目标路径,我们使用cifs
作为文件系统类型,并且我们还包括用户名(以及密码,如果您的 Samba 服务器需要)。与以前的示例一样,我们以希望将挂载附加到的本地目录结束命令。在这种情况下,我为此共享创建了一个/mnt/samba/Videos
目录。
通过 fstab 和 systemd 自动挂载网络共享
尽管通过mount
命令挂载网络共享非常方便,但您可能不希望每次使用时都手动挂载共享。在具有中央文件服务器的网络中,配置工作站自动挂载网络共享是有意义的,这样每次启动系统时,共享将自动挂载并准备就绪。
自动挂载资源的经过验证的方法是/etc/fstab
文件。每个 Linux 系统都有一个/etc/fstab
文件,所以请查看您的文件。默认情况下,此文件仅包含用于挂载本地资源的配置,例如硬盘上的分区。向此文件添加额外的配置行以挂载从额外硬盘到网络共享的任何内容是标准做法。
注意
在编辑您的/etc/fstab
文件时要小心。如果意外更改了本地硬盘的配置,下次启动系统时系统将无法启动。在编辑此文件时请务必小心。
以下是一个/etc/fstab
文件示例:
# root filesystem
UUID=4f60d247-2a46-4e72-a28a-52e3a044cebf / ext4 errors=remount-ro 0 1
# swap
UUID=c9149e0a-26b0-4171-a86e-a5d0ee4f87a7 none swap sw 0 0
在我的文件中,通用唯一标识符(UUID)引用了我的本地硬盘分区。这些在每个系统上都会有所不同。接下来,列出了每个挂载点。/
符号代表文件系统的根,交换分区不需要挂载点,因此设置为none
。
在/etc/fstab
文件的末尾,我们可以添加希望在每次启动系统时可用的额外挂载。如果我们希望添加 NFS 共享,可以执行以下操作:
10.10.10.101:/share/music/mnt/music nfs users,rw,auto,nolock,x-systemd.automount,x-systemd.device-timeout=10 0 0
在第一部分中,我们声明服务器的 IP 地址,后面跟着一个冒号和导出目录的路径。在这种情况下,我正在访问10.10.10.101
上的/share/music
。下一部分是挂载点,所以我将这个导出附加到本地系统上的/home/jay/music
。接下来,我们指定我们正在访问的共享是nfs
。最后,我们以一些选项结束配置,说明我们希望如何挂载这个共享。一个简单的挂载选项是rw
,表示读写。如果我们想要防止其中的文件被更改,我们可以在这里使用ro
。
在上一个示例中的选项中,有x-systemd.automount
。基本上,这告诉 systemd(Debian 和 CentOS 的默认init
系统,分别自版本 8 和 7 起)我们希望尽可能保持这个挂载。有了这个选项,systemd 会尽最大努力重新挂载这个共享,如果由于某种原因它断开连接。另外,可以添加x-systemd.device-timeout=10
,告诉系统如果共享在网络上不可用,不要等待超过 10 秒。我们以0 0
结束这一行,因为这不是一个本地文件系统,在启动时不需要一致性检查。
注意
如果你不使用带有 systemd 的发行版(如 CentOS 7 和 Debian 8),不要包括x-systemd
选项,因为它们不会被使用不同init
系统的发行版理解。
同样,Samba 共享也可以添加到你的/etc/fstab
文件中。这是一个例子:
//10.10.10.9/Videos /samba cifs username=jay 0 0
在我们继续之前,关于/etc/fstab
文件的最后一点说明。本节中的示例都假定你希望网络共享在启动时自动可用。然而,这并不总是情况。如果在fstab
中的配置行中添加了noauto
挂载选项,共享将不会在启动时自动挂载。通过将noauto
添加到我们的 Samba 示例中,fstab
行将更改如下:
//10.10.10.101/Videos /samba cifs noauto,username=jay 0 0
NFS 示例如下:
10.10.10.101:/share/music
/mnt/music nfs users,rw,noauto,nolock,x-systemd.device-timeout=10 0 0
有几种情况下这可能会有用。一个例子可能是使用笔记本电脑,你不会总是连接到同一个网络。如果是这种情况,你不希望你的机器在你实际连接到该网络时自动挂载某些东西。通过将noauto
添加为挂载选项,你可以在需要时手动挂载资源,而无需记住一个长长的mount
命令。例如,要挂载包含在你的fstab
文件中的 NFS 导出,你将执行以下操作:
# mount /mnt/music
相比之下,这比每次想要挂载该导出时输入以下内容要容易得多:
# mount -t nfs 10.10.10.101:/exports/music/ mnt/music
由于我们将导出添加到了fstab
文件中,当我们输入一个简化的mount
命令时,mount
命令会查找相关行。如果它找到了你要访问的挂载点的配置,它将允许你访问它,而无需输入整个命令。即使你不想自动访问远程共享,将它们添加到你的fstab
文件中仍然非常方便。
使用 SSHFS 创建网络文件系统
在上一章中,我们通过 SSH 工作,这是大多数 Linux 管理员每天多次使用的关键实用程序。但是,虽然它非常适合访问网络上的其他 Linux 系统,但它也允许你访问远程文件系统,就好像它们是本地挂载的一样。这就是SSHFS。关于 SSHFS 的一大好处是,无需事先澄清任何导出的目录。如果你能够连接到远程 Linux 服务器并通过 SSH 访问目录,那么你就能够自动将其本地挂载,就好像它是一个网络共享一样。
在 Debian 系统上,您可以简单地安装sshfs
软件包。在 CentOS 上,默认情况下不提供sshfs
软件包。在 CentOS 系统上安装sshfs
之前,您需要添加一个全新的存储库,称为企业 Linux 的额外软件包(EPEL)。要做到这一点,只需安装epel-release
软件包:
# yum install epel-release
安装epel
存储库后,您应该能够安装sshfs
:
# yum install sshfs
安装后,您可以轻松地在本地文件系统上挂载目录:
sshfs jay@10.10.10.101:/home/jay/docs /home/jay/mnt/docs
为了工作,您的用户帐户必须不仅访问远程系统,还要访问本地挂载点。一旦启动命令,您将看到类似于通过 SSH 连接到服务器时通常看到的提示。基本上,这就是您正在做的事情。不同之处在于连接保持在后台打开,保持远程目录和本地目录之间的关系。
在需要在远程文件系统上挂载某些内容,但您可能不需要再次访问或频繁访问时,使用sshfs
是一个很好的主意。但与 NFS 和 Samba 共享类似,您实际上可以使用/etc/fstab
通过 SSHFS 挂载资源。考虑以下fstab
示例:
jay@10.10.10.101:/home/jay/docs /home/jay/mnt/docs fuse.sshfs defaults,noauto,users,_netdev 0 0
与以前一样,我们设置了noauto
,这样我们只需键入即可建立此连接:
mount /home/jay/docs
总结
在这个充满活力的章节中,我们通过几种方式访问和共享 Linux 网络中的文件。我们首先讨论了 NFS,这是在 Linux 和 UNIX 网络中共享文件的一种古老但可靠的方法。我们还涵盖了 Samba,这是在混合操作系统环境中共享资源的一种方法。我们还讨论了如何手动以及自动地挂载这些共享。我们最后讨论了 SSHFS,这是 SSH 的一个非常方便(但不太知名)的功能,它允许我们根据需要从其他系统挂载目录。
当然,依赖于我们网络中的资源,保持每个节点的良好运行状态非常重要。在下一章中,我们将通过监视系统资源并保持节点的良好状态来工作。
第五章:监控系统资源
随着您的组织需求的扩大,您的网络将随着增长和变化而增长和变化。跟踪每个节点上的资源对于稳定性非常重要。虽然 Linux 处理资源异常出色,但它只能做到这么多。CPU 可能被过度利用,磁盘变满,过多的输入/输出甚至可以使最强大的服务器停止。密切关注这些事情非常重要,特别是当系统用于生产并且被其他人依赖时。
在本章中,我们将探讨检查 Linux 系统上正在运行的内容以及管理其资源的方法,以确保您的节点在网络上表现良好。
在本章中,我们将涵盖:
-
检查和管理进程
-
了解负载平均值
-
检查可用内存
-
使用基于 shell 的资源监视器
-
检查磁盘空间
-
扫描已使用的存储空间
-
日志简介
-
使用 logrotate 维护日志大小
-
了解 systemd 初始化系统
-
了解 systemd 日志
检查和管理进程
在典型的故障排除场景中,您可能会遇到一个行为不端或需要对其执行操作的进程。如果您在工作站上使用图形桌面环境,您可能会使用诸如 GNOME 系统监视器之类的工具来调查系统上运行的进程,然后终止问题进程。但在大多数情况下,您可能不会有图形桌面环境(至少不会在服务器上),因此您将使用诸如kill
之类的命令来摆脱行为不端的进程。但在终止进程之前,您需要知道其进程标识符(PID)。在所有 Linux 系统上找到进程的 PID 的一种方法是打开终端并使用ps
命令。以下是其用法示例:
ps aux
除了ps
,如果您已经知道进程的名称,通常会使用grep
。在这种情况下,您可以将ps aux
的输出导入grep
,然后搜索进程。
ps aux |grep httpd
ps
命令将为您提供正在运行的进程列表。如果使用了grep
,输出将被缩小为与搜索项匹配的进程列表。您将在结果中看到每个进程的PID
位于第二列中。在第三列中,您将看到进程正在消耗多少 CPU,然后是内存使用列。
!检查和管理进程
在 Debian 系统上的 ps aux 输出
USER
,STAT
,START
,TIME
和COMMAND
是我们可以从此输出中看到的其他列。虽然USER
是不言自明的,但这里是其他列标题的简短描述:
-
STAT
:此字段标识程序的状态,其中一个或两个字符代码表示程序当前所处的状态。例如,S
表示进程正在等待某些事件完成,而D
是不可中断的睡眠状态,通常与 IO 相关。要查看完整列表,请查看ps
的手册页。 -
START
:此字段指的是进程开始运行的时间。 -
TIME
:这表示进程已经利用 CPU 的总时间。每当进程命中 CPU 并需要执行工作时,时间都会记录在 CPU 上。 -
COMMAND
:显示当前进程正在运行的命令。
现在您知道如何找到进程的 PID,我们可以看一下kill
命令,这是一个在需要关闭正常情况下无法关闭的程序时非常有用的命令。例如,如果您正在运行一个进程 ID 为 25787 的脚本,您可以通过执行以下命令来终止它:
# kill 25787
kill
命令通过向 PID 发送特定信号来工作。例如,信号 15 被称为SIGTERM。如果您对一个进程执行kill
而没有任何参数(就像我们在上一个示例中所做的那样),则默认发送信号 15,这基本上是礼貌地要求进程关闭。您可以向进程发送 18 种不同的信号,您可以在手册页中阅读有关这些信号的信息。就我们在这里讨论的而言,SIGINT
,SIGTERM
和SIGKILL
是您最有可能使用的。您可以通过执行以下命令查看这些信号以及它们的含义的列表:
man 7 signal
要发送特定信号,请在kill
命令后输入连字符,然后输入您希望发送的信号。由于kill
本身发送信号 15,您可以通过执行以下命令来执行相同的操作:
# kill -15 25787
要发送不同的信号,比如 2(SIGINT),请输入以下命令:
# kill -2 25787
如果您非常绝望,可以向进程发送信号 9(SIGKILL):
# kill -9 25787
但是,只有在您已经尽了最大努力但无法使进程关闭时,才应该使用SIGKILL
。SIGKILL
立即关闭进程,但不幸的是它不会给进程清理的机会。这可能导致不干净的临时文件和打开的套接字连接留在系统上。更糟糕的是,它实际上可能会损坏数据库和配置。因此,我再次强调,如果无法使进程正常关闭,kill -9
绝对应该是您尝试的最后一件事。首先尝试您知道的每种方法来正常关闭进程,然后再尝试几次,然后考虑使用它。
另一个可以用来终止进程的命令是killall
命令。killall
命令允许您终止系统上与特定名称匹配的所有进程。例如,假设您有多个打开的 Firefox 窗口并且程序停止响应。要立即终止系统上运行的所有 Firefox 实例,只需执行以下命令:
killall firefox
就这样,您系统上的每个 Firefox 窗口都会立即消失。killall
命令可用于关闭共享相同名称的多个进程,并且在运行多个单个无响应程序或脚本的服务器上非常有用。
这基本上就是使用kill
和killall
命令的全部内容。当然,还有更多选项,手册页会给您更多信息。但简而言之,这些是您实际使用的变体。在理想的世界中,您应该永远不需要使用kill
,并且在服务器上运行的所有进程都会毫无疑问地服从您。不幸的是,我们不生活在一个完美的世界,您可能会比您想象的更经常使用这些命令。
理解负载平均值
对于 Linux 管理员来说,负载平均值是您将学到的最重要的概念之一。虽然您可能已经知道这个数字代表系统承受多大负载,但它也代表着趋势性能。使用这个数字,您将能够确定您的系统是被压倒还是正在恢复和平静下来。基本上,负载平均值由三个数字组成,每个数字代表系统在特定时间范围内的平均负载。第一个数字代表一分钟,第二个代表五分钟,第三个代表 15 分钟。有许多方法可以查看您的负载平均值,并且它也会显示在大多数 Linux 可用的系统监视器中。查看您的负载平均值的一种简单方法是执行以下命令:
cat /proc/loadavg
查看负载平均值
一个更简单的技术是使用uptime
命令。虽然uptime
命令的主要目的是查看系统已经运行了多长时间,但它也显示了系统的负载平均值。
uptime 命令的输出
那么,如何正确解释这些信息呢?通过本节中显示的 uptime 命令的截图,我们看到以下数字:
0.63 0.72 0.71
如前所述,前三个数字分别代表了 1、5 和 15 分钟内系统的负载。所谓的负载表示在每个时间段内等待或当前使用 CPU 的进程数量。在本例中使用的系统上,我们可以看到它的负载相对较低。我们还可以看到负载平均值的趋势。在这个例子系统上,负载正在上升,但只是稍微上升。
一般来说,负载平均值越低越好。但并非总是如此;较低的数字也可能令人不安。例如,如果您有一个本应该忙碌的服务器,其负载平均值下降到小于 1,这可能是一个警告信号。如果负载如此之低,服务器显然并不忙碌。这可能表示应该运行的某个进程已经失败。例如,如果您有一个通常会同时处理数百个查询的 MySQL 服务器,突然发现服务器变得无所事事,肯定会感到奇怪。另一方面,负载平均值达到数百的服务器将如此忙碌,以至于甚至无法处理您的登录请求,也无法访问系统!
让我们再看一个负载平均值。这是我帮助管理的网络上一个更繁忙系统的负载平均值:
9.75 8.96 5.94
在这里,我们可以看到这个系统的负载比前一个例子高得多。这可能是我想要调查的事情。但关于系统的负载平均值令人困惑的一点是,数字本身并不足以证明有警告的理由。如果该系统有十个核心,我就不会那么担心。尽管负载平均值超过了 9,但在这种情况下,将有足够的 CPU 来处理工作负载。然而,我从中获取输出的系统只有四个核心,所以这是一个警告信号。这意味着在每个三个时间窗口内,等待 CPU 时间的进程比系统实际拥有的核心还要多。这不是好事。但幸运的是,我可以看到系统正在恢复,因为负载正在下降。在这种情况下,我不会惊慌,但肯定会继续关注,以确保它继续恢复。我可能还会调查系统,找出到底是什么导致了负载如此高。也许服务器刚刚完成了一个非常大的任务,但值得调查一下。
作为一个经验法则,记录系统在正常预期负载下的基线是一个好主意。您网络上的每个系统都将有一个指定的目的,每个系统在任何时候都会有一个您可以合理预期系统面临的特定负载。如果系统的负载平均值低于基线或高于基线,那么您就需要查看并找出问题所在。如果负载达到一个水平,其中有更多的进程比您的核心处理器处理的,那就是一个警告信号。
检查可用内存
Linux 系统非常出色地处理内存,尽管如果一个进程行为不端或分配的内存不足,事情可能会失控。在系统开始表现迟缓的情况下,检查可用内存可能是您首先要查看的事情之一。为此,我们使用free
命令。为了使输出更易读,您可以添加-m
选项,以以兆字节为单位显示内存使用情况,这样可以使其更容易阅读。起初阅读这个输出可能会令人困惑,但我相信在我们阅读输出后,您会发现它很简单。
free 命令的输出
运行free
命令时,我们得到了三行六列的信息。第一行显示了我们实际的 RAM 使用情况,而第二行声明了缓冲区,第三行声明了交换使用情况。在total
下,我们看到这个系统安装了 7923 MB 的 RAM。从技术上讲,这个系统有 8 GB 的 RAM,尽管其中一部分被保留给内核或某种硬件,可能不会显示在这里。在下一列(used
)中,我们看到了我们系统的 RAM 有多少被使用,然后是free
,它显示了系统 RAM 中有多少是未使用的。在我们之前的例子中,似乎我们只有 927 MB 的 8 GB 是空闲的,但这并不完全正确。那么,到底有多少内存是真正空闲的呢?
首先,第一行中的used
表示实际使用了多少内存,包括缓存的部分。基本上,Linux 中的内存管理声明了所谓的磁盘缓存,这是一块为尚未写入磁盘的数据保留的内存块。您可以在free -m
命令的输出中看到这一点;它是cached
下面最右边的数字。这部分内存不一定被进程使用;它被声明为使系统运行更快。如果启动一个进程并且它需要的 RAM 超过了第一行free
下显示的 RAM,Linux 内核将乐意从磁盘缓存中分配内存给其他进程。
磁盘缓存有助于提高性能。当你从磁盘读取东西时,它会存储在磁盘缓存中,然后每次都从那里读取,而不是每次都从磁盘读取。例如,假设你每天都要查看保存在/home
目录中的文本文件。第一次读取时,你是从磁盘读取的。从那时起,它就存储在磁盘缓存中,每次你想要从那时起读取文件时都是从那里读取。由于 RAM 比硬盘快,这个文件每次只需要从磁盘读取一次,然后以后都是从磁盘缓存中读取。
磁盘缓存中存储的信息会随着时间而过期。随着磁盘缓存的填满,存储在其中的最旧信息会被删除以腾出空间。此外,当进程需要内存时,可以随时从缓存中取回内存。这就是为什么即使有时候看起来大量的 RAM 被缓存使用,也不是一个大问题——应用程序在需要时永远不会被阻止访问这些内存。
回到我们的例子,确定我们有多少空闲内存时要看第二列的数字,第二行的数字。在这个例子中,3736 MB 被认为是空闲的。对于这个特定的系统来说,这是足够的空闲内存。当这个数字减少并且交换开始增加以补偿时,你应该担心。只要你的系统有足够的 RAM 来完成指定的任务,交换应该几乎不会被使用。几乎总会使用一小部分,但当使用大量时就是问题。当你的系统实际上开始耗尽内存时,它将开始使用你的交换分区。由于硬盘比 RAM 慢得多,你不希望这样。如果你看到你的交换空间被滥用,你应该运行某种资源监视器(我们在本章中讨论了其中的一些)来确定是什么在使用它。
为了确保我们对free
命令的输出有一个全面的理解,让我们逐个讨论它包含的所有部分,从第一行开始。我们已经介绍了total
,这是你的系统物理上安装的内存量(减去你的内核或硬件保留的部分)。在第一行的下一个是used
,它指的是任何时候被使用的内存量,包括缓存。而free
列则完全相反,指的是没有被任何东西使用的内存。
第一行的最后两项是buffers
和cache
。虽然这两个部分没有被任何进程使用,但内核会用它们来缓存数据以进行性能优化。但如果一个进程需要更多的内存,它可以从这两个数字中获取。我们已经介绍了磁盘缓存,这是最后一个数字。buffers
指的是尚未写入磁盘的数据。Linux 会在各种时间间隔内运行sync
命令将这些信息写入磁盘。如果你愿意,你甚至可以自己运行sync
命令,尽管这很少是必要的。缓冲区的概念也是为什么你不希望在没有先卸载的情况下突然从计算机中移除外部媒体的一个关键指标。如果你的系统尚未将数据同步到磁盘,如果你过早地弹出媒体,你可能会丢失数据。
在第二行,我们有-/+ buffers cache
(在我们的示例中分别为 4186 MB 和 3736 MB)。这一行的第一个数字(4186 MB)是通过从第一行的已使用列(6995 MB)减去缓存和缓冲区的总和(2808 MB)计算出来的。这给了我们 4187 MB 的总数,由于四舍五入的原因(我们使用了-m
标志,所以我们的输出以 MB 为单位,所以有一点偏差),但足够接近。如果我们按照同样的数学计算,但在我们的 free 命令中没有使用-m
标志,结果将是精确的。第二行的下一个数字是 3736 MB。正如前面提到的,这是系统实际可用的内存量。为了得到这个数字,我们从已使用的内存(4186 MB)中减去我们的总内存(7923 MB)。
再次强调,在第二行的free
下面的内存量是你关心的数字,当你想知道你还剩下多少内存时。然而,了解我们是如何得出这个数字以及 Linux 是如何为我们管理内存的也是很重要的。
使用基于 shell 的资源监视器
安装任何带有桌面环境的 Linux 发行版时,很可能会捆绑一个图形系统监视器。其中流行的有 KSysGuard 和 GNOME 系统监视器,但还有许多其他的。大多数情况下,这些都很好用。GNOME 系统监视器能够显示负载平均值,当前运行的进程(以及它们的 PID,CPU 百分比,内存等),以及磁盘使用情况。许多图形系统监视器也显示这些信息以及更多。虽然这些工具很棒,但典型的基于 Linux 的网络中的节点并不总是有图形用户界面可用。幸运的是,通过 shell 有许多不需要运行桌面环境的资源监视工具。这些工具中一些非常出色,以至于你会在某个时候放弃图形工具而使用 shell 工具。这个类别中流行的工具包括 top,htop,iotop 和 ncdu。
首先,我们需要确保上述工具已经安装在我们的系统上。在大多数情况下,top 已经为我们安装好了,但其他的需要手动安装。你可以通过运行以下命令来验证 top 是否已安装:
which top
你应该看到以下输出:
/usr/bin/top
你可以使用你的发行版的软件包管理器来安装其他工具。对于 Debian,你可以一次性安装它们所有:
# apt-get install htop iotop ncdu
不幸的是,在 CentOS 上,并非所有这些软件包都在默认存储库中可用。要在 CentOS 上安装这些工具,您首先需要添加epel
存储库,然后才能安装所有软件包。以下概述了要使用的命令:
# yum install epel-release
# yum install htop iotop ncdu
随意尝试这些工具。top
和htop
命令都可以在没有 root 访问权限的情况下运行。但是,您需要至少使用sudo
来运行iotop
才能使其正常工作。ncdu
命令将作为普通用户运行,但将被限制为仅查看该用户可以访问的资源。让我们更仔细地看看这些工具。
这些工具对我们有什么作用呢?首先,top
是经过验证的;如果您不是 Linux 的新手,那么您可能以前已经使用过。在查看系统上正在运行的内容时,top
是相当常见的。使用top
,您将看到各种信息,例如正常运行时间,平均负载,已使用内存,已使用交换空间,缓存等。在屏幕的底部部分,您将看到进程列表。完成后,只需按Q退出。
在 CentOS 系统上运行的 top 命令
有几种方式可以运行top
。通过不带参数运行top
,您将看到一个类似于本节前面显示的屏幕。您将在上部看到系统性能摘要,底部显示各种进程。但是,如果您已经知道要监视哪个进程,可以使用-p
标志加上 PID 来仅监视该进程。例如,我们可以使用以下命令来监视 PID 为12844
的进程:
top -p 12844
默认情况下,top
命令中的输出每三秒更新一次。要更改此设置,您可以使用-d
标志选择不同的频率(以秒为单位):
top -d 2
如果您愿意,频率可以小于一秒:
top -d 0.5
如果top
已经在运行,并且您想要更改更新频率,您不必关闭它然后再次启动。您可以在其运行时键入s
,然后会提示您指定一个新的频率。
在top
中,您可以通过按键盘上的键来更改进程列表的排序方式。如果您键入P
,则按 CPU 使用率排序;使用M
,您可以按内存使用率排序(这里大小写要注意)。您甚至可以通过按k
来从这里终止一个进程,然后会提示您输入要终止的 PID。不过要小心;这默认为您按下时进程列表顶部的内容,所以确保在实际输入 PID 之前不要按Enter
,否则可能会终止您不想终止的进程。
那么,为什么要使用top
呢?管理员使用top
的主要目的是帮助确定是什么导致系统变得 CPU 或内存密集。大多数情况下,top
从来不是解决方案,而是根本原因分析的开始。您可以立即看到哪个进程正在消耗您的 CPU 或 RAM,但根据上下文,您可能还不知道如何解决问题。使用top
,您只能发现罪魁祸首。不幸的是,top
可能并不总是显示出根本原因的进程,但当您的系统运行缓慢时,这绝对是一个非常容易的第一处查找地方。
要开始故障排除,顶部的信息将为您提供一个起点,以查看哪个资源正在被使用。在%Cpu(s)
行上,我们可以立即看出系统是否遭受过多的 I/O 等待(%wa
字段),这基本上意味着 CPU 承受的负担超过了它的处理能力。在这种情况下,任务将积压,平均负载将增加。空闲时间(或%id
)是一个数字,它越高越好,这意味着您的系统将有 CPU 时间可用。
在某些情况下,您可能会发现 CPU 使用过高,但在进程列表中并没有显示太多。在这种情况下,您可以打开iotop
来确定您的系统是否受到 I/O 限制。使用iotop
(需要 root 权限),您可以看到写入或从磁盘读取的数据量。使用左右箭头,您可以将焦点从一列转移到另一列,这样可以按该列对进程列表进行排序。
在 Debian 系统上运行 iotop
默认情况下,iotop
中的进程列表相当拥挤。您可以通过执行以下操作来精简它:
# iotop --only
通过附加-only
,您只会看到实际发生读写操作的进程。在本节中iotop
的截图中,您可以看到有相当多的进程根本没有活动。但是使用-only
可能更容易阅读,因为它清理了输出。您实际上可以在iotop
运行时激活-only
,只需在键盘上简单地按下O。此外,另一个有用的键盘快捷键是使用r
更改任何列的排序顺序。
在本节中,我们有htop
。虽然top
是在 Linux 系统上查看系统资源的标准方法,但htop
的受欢迎程度正在迅速增加。
htop 命令的操作
htop
的基本思想与top
相同——top
区域显示当前的 CPU 和内存使用情况,底部部分提供了一个进程列表。但htop
的不同之处在于它如何呈现这些信息,更容易阅读,并提供了 CPU 使用情况的图表区域。除此之外,它还允许您轻松地向进程发送特定信号。在前面,我们介绍了各种信号,您可以使用它们来结束一个进程。在这里,我们可以看到相同的概念以图形方式呈现。要向进程发送信号,请使用键盘上的上下箭头突出显示一个进程,然后按F9选择特定的信号。SIGTERM
是默认选择的,但您也可以向进程发送任何其他信号。
准备在 htop 中向进程发送信号
htop
中的进程列表可以类似于iotop
进行排序。一开始可能不明显的一件事是,htop
支持鼠标输入。虽然您可以使用箭头键选择列,但也可以单击它们。
htop
的另一个好处是它的可定制性。虽然默认布局对大多数用例来说都不错,但您可以添加额外的仪表。要这样做,请按F2或单击设置,您将进入一个菜单,可以从当前视图中添加或删除仪表。在可用仪表
下,突出显示您想要添加的仪表之一,然后按F5将其添加到左列,或按F6将其添加到右列。您可能会发现有用的一个仪表是CPU 平均值
。添加新仪表后,您可以通过突出显示它并按F7将其上移或按F8将其下移来重新定位它。完成后,按Esc返回到主屏幕。这些更改会自动保存,因此下次打开htop
时,您的自定义布局将保持不变。
扫描已使用的存储
几乎每个人都会遇到磁盘空间似乎消失的情况,却没有明确的指示是什么占用了所有的空间。有多种方法可以排除是什么特别占用了你的硬盘空间。为了查看已挂载文件系统的概况以及它们的已用和空闲空间,执行df
命令。对于大多数人来说,使用-h
和df
更容易阅读,因为它会显示以 MB 和 GB 为单位的已用空间:
df -h
掌握了这些信息,您将准确知道哪个设备被使用了,以及要关注的卷。但df
命令实际上并没有告诉您是什么占用了所有的空间;它只是给了您当前情况的概述。
接下来是du
。du
命令也可以与-h
配对,原因相同,它显示目录中使用了多少空间。您只需要cd
进入要检查的目录,然后运行du -h
。为了更易于阅读的输出,可以在目录中运行以下命令:
du -hsc *
分解该命令,我们有-h
参数,我们已经知道它使输出更易于阅读。-s
参数仅显示总计,-c
将在最后呈现总计。由于我们在命令中使用了星号,它将对当前目录中包含的每个子目录运行du -hsc
。使用此命令,您可以确定当前工作目录中哪些目录占用了最多的空间。
但它甚至比这更好。尽管du -hsc *
非常有用,但您仍然需要为每个子目录手动运行它。有方法可以使用它进行更深入的扫描,但du
仅适用于概览摘要。更好的方法是安装ncdu
。ncdu
命令不是图形实用程序,因为它不需要图形桌面环境。但它非常易于使用;您可能会认为它实际上是一个图形实用程序。一旦针对特定目录启动,它会进行深入分析,并允许您实际遍历文件系统树并跟踪占用所有空间的元凶。
您不需要成为 root 用户或具有sudo
权限来使用ncdu
,但请记住,ncdu
只能扫描其调用用户有权限访问的目录。在某些情况下,您可能需要以 root 身份运行它以绕过这一限制。ncdu
的基本用法很简单;只需调用ncdu
并提供要扫描的路径。例如,您可以扫描整个文件系统或其中的一部分:
ncdu /
使用 ncdu 扫描 CentOS 系统的根文件系统
需要注意的是,默认情况下,ncdu
将扫描您提供的目录中的所有内容,包括可能已挂载的任何内容。这可能包括已挂载的 NFS 共享或外部磁盘,但您可能不希望外部挂载影响结果。幸运的是,只需向ncdu
提供-x
选项即可,告诉它在运行扫描时忽略您已挂载的任何内容:
ncdu -x /
扫描完成后,您可以通过键盘上的上下键遍历结果,并按Enter进入目录。在ncdu
内部,您甚至可以通过简单按下D键而无需运行任何额外命令来删除文件。这样,您可以在同一工具中进行审计和清理。
随意在自己的系统上运行ncdu
,并查看您的可用空间去向。除非您真的开始删除东西,否则它是无害的,并且可以显示一些您可能想要清理的潜在项目。在实际服务器上,ncdu
在解决磁盘空间去向方面非常有用。
日志简介
默认情况下,Linux 几乎记录所有内容。这对于在出现问题时进行根本原因分析非常重要。当您在生产服务器上面临问题时,您只需要确定问题开始的时间,然后阅读在该时间内系统上发生的事情的日志文件。Linux 日志非常详尽。
但是,如今,Linux 处理日志的方式正在发生变化。随着 systemd 的崛起,它现在是大多数 Linux 发行版上的默认 init 系统,它几乎接管了一切,包括日志记录。过去,每当您想要阅读日志时,您会进入/var/log
,这是一个包含各种以纯文本格式存储的日志文件的目录。在 Debian 和 CentOS 上,您仍然可以在/var/log
中找到日志,因此您仍然可以像以往一样利用它们进行故障排除。但目前尚不确定这种方式还能维持多久。
许多人可能认为 systemd 接管日志记录是件坏事。毕竟,让 init 系统负责系统的许多维护工作会增加其负担,可能会使其负担过重。但 syslog(之前的方法)的一个问题是,不同发行版在日志创建或命名方面没有一致性。例如,Debian 系统包括auth.log
,而 CentOS 没有。两者都有dmesg
,只有 CentOS 有boot.log
文件。这使得在混合环境中进行故障排除变得非常困难。
systemd 方法(稍后我们将讨论)在不同发行版之间提供了更一致的方法。因此,尽管 systemd 在系统上承担了许多责任,但一致性肯定是受欢迎的。
Debian 和 CentOS 都有一个日志文件,用于用户登录系统,即使是通过 SSH 登录。在 CentOS 上,此日志位于/var/log/secure
。Debian 使用/var/log/auth.log
来实现此目的。如果您需要知道谁何时登录到您的系统,您需要查看这些日志。在两者中,您可以找到/var/log/messages
,其中包括各种有用信息,例如进程输出,网络激活,服务启动等。在硬件故障排除方面,/var/log/dmesg
是一个很好的查看地点。实际上,/var/log/dmesg
有自己的命令。在系统的任何位置(即使您当前的工作目录不是/var/log
),键入dmesg
将呈现相同的日志。
使用tail -f
可以非常容易地实时跟踪/var/log
中的日志文件。tail
的-f
标志不仅限于日志文件。它允许您显示日志文件的输出,就像它正在被写入一样。在故障排除系统时,tail -f
是不可或缺的。例如,如果您有一个无法登录系统的用户,您可以在 Debian 系统上运行以下命令来观察auth.log
文件,以查看他们的尝试。这样,您可以看到系统为其登录失败尝试注册的错误消息:
# tail -f /var/log/auth.log
从那里,随着auth.log
的更新,结果将立即显示在您的终端上。要结束,只需按下Ctrl + C停止跟踪输出。您可以对系统上的任何日志或文本文件执行此操作。这对于多种故障排除策略非常有用,因为您可能想要调查的大多数进程都会将其活动记录到至少一个日志中。
使用 logrotate 来维护日志大小
如您所知,日志在故障排除时至关重要。Linux 通常会很好地记录几乎您想要了解的一切,但随着时间的推移,这些日志可能会不断增加。在生产服务器上,如果不加以控制,日志文件不断增长并占用服务器的所有可用空间是一个非常现实的问题。除了占用磁盘空间外,巨大的日志文件很难在文本编辑器中打开以查看内容,这使得故障排除变得更加困难。超过 500GB 的日志文件不仅会占用大量空间;如果尝试打开它,它可能会导致系统挂起,并且一旦达到非常大的大小,将日志文件传输到另一台服务器进行分析也是不切实际的。
在较新的 Linux 发行版上,过多的日志文件通常不是问题。使用 syslog 时,没有自动维护。如果您没有自己清理日志,或者设置了一些东西来为您轮换日志,那么您肯定需要留意它们。如今,journald为我们处理这个问题。但是对于 Debian 和 CentOS 来说,这可能有点复杂。这是因为尽管 systemd journald 在大多数流行的 Linux 发行版的新版本中为我们处理日志记录,但 syslog 仍然用于兼容性。因此,即使所有部件都已经就位,我们仍然需要处理日志轮换。journald 是未来,尽管 syslog 仍然在企业 Linux 发行版上用于兼容性。
日志轮换是指获取现有日志文件,重命名它,并让进程写入一个全新的空日志文件的过程。以前的日志文件可以全部保留,或者您也可以只保留其中几个。企业系统通常有特定的保留策略。压缩以前的日志是很常见的做法,这样可以节省大量的磁盘空间。这就是 logrotate 的用武之地。这是一个我们可以在服务器上运行的过程,用来自动交换我们的日志文件,并(作为一个选项)压缩备份副本。
在设计 Linux 网络时,了解每台服务器需要运行哪些进程,并从一开始考虑这些进程的日志记录要求是很重要的。在服务器进入生产之前安装和配置 logrotate 是一个好的做法。在生产过程中服务器的空间用完是一个不好的经历,首先了解运行进程创建的日志文件,做好处理准备是一个好主意。在配置日志记录时,重要的是要考虑公司的保留要求,如果有的话。
在我实验室使用的 CentOS 系统上,默认情况下安装了logrotate
。Debian 也默认情况下安装了它。要在您的系统上验证这一点,只需运行以下命令:
which logrotate
在 CentOS 上,logrotate
二进制文件位于/usr/sbin
,而 Debian 将它们存储在/usr/sbin
中。如果which
命令没有输出,您可能需要使用您的发行版软件包管理器来安装logrotate
软件包。
在 Debian 和 CentOS 的默认安装中,logrotate
已经配置为每天运行。当它运行时,它会检查/etc/logrotate.d
目录中的指令,然后执行它们。设置logrotate
规则的配置非常简单。如果您需要示例语法,请参考您自己的系统。默认情况下,为您创建了几个logrotate
脚本。其中一个例子是 Debian 的软件包管理器apt
。在 Debian 系统上安装软件包时,它会被记录在以下位置:
/var/log/apt/history.log
如果您查看此文件,您应该看到您或其他用户执行的最近软件包安装的结果。在 Debian 系统上,默认情况下存在以下文件来处理此日志的轮换:
/etc/logrotate.d/apt
在 Debian 8 上,此文件包含以下内容:
/var/log/apt/term.log {
rotate 12
monthly
compress
missingok
notifempty
}
/var/log/apt/history.log {
rotate 12
monthly
compress
missingok
notifempty
}
正如您所看到的,logrotate
的这个配置文件不仅处理我们之前提到的history.log
,还处理term.log
。此配置的每个部分都以logrotate
要检查的路径开头,然后是方括号内的各个选项。
注意
term.log
文件显示了在运行 apt 实例时将会看到的实际终端输出。
在选项中,我们可以看到rotate 12
,这意味着最多会保留 12 个备份日志文件。接下来,我们看到monthly
,它详细说明了日志实际上会被多久轮换一次。尽管logrotate
默认配置为每天运行,但它将遵循各个配置中包含的指令,只有在符合条件时才会轮换。compress
选项告诉logrotate
压缩备份文件,这在大多数情况下可能是你想要的。压缩的日志文件与未压缩的实时日志相比占用的空间非常少,因此这绝对值得考虑。missingok
告诉logrotate
即使遇到缺失的日志文件也要继续运行。否则,它会显示错误。最后,我们有notifempty
,它简单地告诉logrotate
如果日志文件为空就不要理会它。
注意
你可以通过查阅logrotate
的 man 页面来看到完整的logrotate
配置选项列表。
man logrotate
虽然logrotate
为一些随 CentOS 和 Debian 一起提供的服务有相当不错的默认配置,但你可能需要考虑为你设置的任何新服务创建配置。要这样做,最简单的方法是按照你已经存储在/etc/logrotate.d
中的示例文件中显示的格式。只需从文件路径开始你的配置块,然后在花括号内添加选项。没有需要重新启动的服务或特殊命令来使你的新配置生效。下次logrotate
运行时,它将检查/etc/logrotate.d
目录中是否有新的配置,并在没有错误的情况下运行它们。
理解 systemd init 系统
在当今的许多 Linux 发行版中,init 系统已经切换到 systemd。这适用于分别从版本 8 和 7 开始的 Debian 和 CentOS,但其他发行版如 Fedora、Ubuntu、Arch Linux 等也已经切换。尽管一些管理员更喜欢之前主导的 init 系统 sysvinit,但 systemd 相对于旧系统提供了许多进步。
使用 systemd,你现在使用来启动进程的命令是不同的,尽管大多数旧命令仍然有效(目前)。在 Debian 7 系统上使用 sysvinit,你会使用以下命令来重新启动 Samba:
/etc/init.d/samba restart
然而,现在我们使用systemctl
来start
,stop
或restart
一个进程:
# systemctl restart samba
在 CentOS 和 Debian 中管理进程的 sysvinit 风格以前是一样的,现在仍然是一样的。在撰写本文时,两者都已经切换到 systemd。但在当前版本中,旧的/etc/init.d/<process-name> restart|stop|start
命令在 Debian 和 CentOS 中仍然有效,但不再使用 sysvinit(已经消失),而是转换为 systemd 命令。如果你运行旧的 sysvinit 风格命令,你可能会在输出中看到一些文本,告诉你系统正在使用systemctl
。尽管这对于兼容性来说很好(依赖 sysvinit 风格命令的脚本可能仍然有效),但这种情况不会持续太久。学习 systemd 很重要,因为一旦 sysvinit 兼容层被移除,你将不再能依赖旧的方法。幸运的是,systemd 的基础知识很快就能学会。
要使用 systemd 启动一个进程,执行systemctl
,然后是你想执行的操作,再加上你想对其执行操作的进程。就像我们之前对 Samba 所做的那样,我们执行了systemctl restart samba
。但我们也可以使用systemctl stop samba
来停止 samba,或者以 root 身份执行systemctl start samba
来启动它。
systemd init 系统还允许您启用或禁用进程。启用的进程将在系统启动时启动。只有在您手动启动时,禁用的进程才会启动。根据发行版,进程(或 systemd 称之为单元)可能不会默认启用。例如,在 CentOS 上,您可以安装 Samba,但除非告诉它这样做,否则它不会自动启动。在 Debian 系统上,通常假定您安装了某些东西,因此它将默认启用新安装的进程。无论哪种方式,都不应该假设进程会自动启动 systemd。要找出,请使用以下命令:
systemctl status <process>
使用 systemctl 检查单元的状态
使用systemctl
检查状态会给您提供大量有用的信息,通常比使用 sysvinit 检查进程状态时更多。首先,您可以看到单元是否正在运行。在上一张截图中,我们可以看到nfs-kernel-server
正在运行。此外,状态还给我们提供了几行日志输出,因此如果启动单元时出现任何问题,我们可能会在那里找到错误。
您可能想知道如何找出一个单元是否配置为在系统启动时自动启动。systemd 也使得这变得容易。我们可以使用is-enabled
与systemctl
来查找单元是否已启用。例如,要确保ssh
守护程序已配置为自动启动,我们将在 Debian 系统上发出以下命令:
systemctl is-enabled ssh
要显示系统上的所有单元及其配置方式,请运行以下命令:
systemctl list-unit-files
要启用一个单元,将enable
作为参数传递给systemctl
。同样,您也可以使用disable
来确保单元不会在启动时启动。因此,在 Debian 系统上,systemctl enable ssh
将配置ssh
守护程序在启动时启动,而systemctl disable ssh
将确保它不会启动。CentOS 也是一样,但用sshd
替换ssh
。尽管 Linux 系统之间的单元名称可能会让人感到恼火,但始终记住,您可以像前面提到的那样使用systemctl list-unit-files
来查看注册到您的系统的单元列表及其名称。
简而言之,这就是使用systemctl
管理 Linux 系统上的进程(单元)所需的所有知识。在大多数情况下,启动、停止、启用和禁用单元可以涵盖大多数用例。对于更高级的用法,请参阅systemctl
的 man 页面。
注意
Systemd 还处理电源管理。您可以使用systemctl
的选项,如reboot
、poweroff
和suspend
来启动、关闭或暂停整个系统。
理解 systemd 日志
systemd 的另一个组件是 journald,它处理日志记录。systemd 的 journald 方法启用了二进制日志,这与以前使用的简单文本文件的方法完全不同。由于许多采用 systemd 的发行版仍处于过渡阶段,您可能仍会在/var/log
中看到文本文件日志,就像您可能仍会在/etc/init.d
中看到 init 脚本一样。始终建议尽可能使用 systemd 方法,因为这是发行版正在向其移动的当前解决方案。
您可以使用journalctl
命令查看 journald 日志。此外,可以使用journalctl
命令的各种选项来缩小输出范围或执行某些操作。例如,您可以使用journalctl -f
来跟踪系统上的新日志输出,类似于您可以使用tail -f
来跟踪存储在/var/log
中的日志文件。此外,您可以使用journalctl
来显示特定 PID 的输出。要这样做,只需使用PID=
和 PID 一起使用journalctl
。例如,要查看 PID11753
的输出,您将执行以下命令:
journalctl PID=11753
此外,您可以使用单位的名称来显示其输出:
journalctl -u sshd
虽然journalctl
相对简单易用,但习惯于以前的 syslog 日志记录方式的人会高兴地知道,您仍然可以(至少目前还可以)转到/var/log
并查看日志。例如,dmesg
命令和日志仍然存在且运行良好。但是,虽然需要一段时间来适应journalctl
和二进制日志的概念,但我相信您会发现通过实践,它实际上非常方便。
总结
在本章中,我们介绍了各种管理系统资源和查看日志的方法。我们从管理进程的概述开始,讨论了负载平均值。然后,我们介绍了监视系统内存的方法。此外,我们还研究了基于 shell 的系统监视器,如top
和htop
。我们还介绍了磁盘使用情况和ncdu
,这是一个方便的工具,可以扫描文件系统并以易于使用的方式查看其使用情况。我们还介绍了logrotate
和systemd
。
在下一章中,我们将介绍如何管理基于 Linux 的网络。这将包括配置 DHCP、DNS、NTP,以及使用exim
发送电子邮件和在网络上广告共享服务等内容。
第六章:配置网络服务
到目前为止,我们已经配置了我们的节点,并允许它们实际上相互通信。我们可以访问我们的节点以远程管理它们,在它们之间传输文件,监视它们的资源,并执行基本的网络操作。在本章中,我们将设计我们将用于网络的 IP 地址方案,并设置实施计划所需的服务。这将包括讨论设置和配置动态主机控制协议(DHCP)、域名服务以及网络时间协议(NTP)。
在本章中,我们将涵盖:
-
规划您的 IP 地址布局
-
安装和配置 DHCP 服务器
-
安装和配置 DNS 服务器
-
设置内部 NTP 服务器
规划您的 IP 地址布局
在网络上实施任何计划之前花时间制定一个很好的计划是一个好主意,但是您的 IP 地址方案尤其重要。很容易接受默认设置并迅速让所有人上线。对于一些小公司来说,路由器(或默认情况下处理 DHCP 的任何设备)提供的默认 IP 地址布局可能足够。但是随着公司的发展,这种情况需要改变。为潜在的增长做好准备至关重要。实施 IP 地址方案很容易,但是在已经推出的网络上更改此方案是一个巨大的挑战。一定要花时间进行适当的规划。
确定 IP 地址方案的首要考虑因素是您需要为哪些类型的设备提供地址。通常,您需要处理服务器、工作站和打印机。但是现在,我们的网络上还有其他设备,如 IP 电话、公司发放的电话、会议系统、平板电脑等。当您开始将所有这些设备放在一起时,一个典型的具有 254 个可用地址的 24 位网络似乎并不那么大,即使对于一个小公司来说也是如此。更糟糕的是,一些设备(如笔记本电脑)有多个网络接口卡。如果将所有这些放在一起,您会发现这 254 个地址很快就会被用完。
拥有多个子网肯定会有所帮助。通过子网划分,您可以为每种类型的服务创建单独的网络,每个网络都有自己的一组 IP 地址。例如,您可以将服务器放在一个子网上,打印机放在另一个子网上,最终用户工作站放在它们自己的子网上。您可以将一个 24 位子网分成几个网络,而不是将其在这三种设备类型之间进行划分。我们将在第八章中更详细地介绍子网划分,但是现在,隔离您的网络几乎总是一个好主意,原因甚至超出了 IP 地址的范围。
另一个需要考虑的因素是限制您的广播域。一个 24 位网络(通常是网络设备默认的)是一个广播域。简而言之,一个设备可以在您的网络上直接与另一个设备通信,而无需先进行路由,并共享相同的广播域。如果您只有几台设备,这并不重要(除非一个设备处理了大量的流量)。但是在大多数网络中,分割广播域可以提高性能。如果您有一个路由器分隔您的子网,那么实际上就是在分割您的广播域。因此,如果一个节点位于自己的子网上,它更难以使您的网络饱和。然而,没有完美的解决方案,单独的广播域也可能会变得饱和。
在规划 IP 方案时,一个有用的工具是ipcalc
实用程序。ipcalc
实用程序可以帮助您了解每个方案可用的 IP 地址数量。这个实用程序在 Debian 中通过apt-get
可用,不需要任何额外的存储库。虽然 CentOS 中内置了ipcalc
命令,但它不是同一回事,也没有用。如果可能的话,我建议使用 Debian 版本。要使用它,只需执行ipcalc
以及您考虑使用的网络。例如,您可以运行以下内容进行测试:
ipcalc 10.10.96.0/22
规划您的 IP 地址布局
ipcalc 显示 10.10.9.60/22 内部网络的子网信息
在前面的例子中,我们可以看到,如果我们选择了10.10.96.0/22
方案,我们将有1022
个可允许的 IP 地址,子网掩码为255.255.252.0
,这将是一个 A 类私有网络。虽然您将在本书的后面学到更多关于子网划分的知识,但ipcalc
实用程序对您来说将是一个方便的工具,可以让您玩弄并确定特定 IP 布局的外观。
另一个值得讨论的 IP 地址问题是 IPv4 与 IPv6。很长一段时间以来,IPv4 已经足够满足每个人的需求。不幸的是,现在公共互联网上的 IPv4 地址开始耗尽(在许多情况下已经耗尽)。IPv6 的好处在于有如此多的 IP 地址可用;我们再也不会用尽 IP 地址是完全不可想象的。IPv6 还具有安全性的好处,因为地址空间如此之大,目标被抽象化(本质上是通过混淆来保障安全)。
考虑到这一点,您可能会想在网络内部使用 IPv6 地址而不是 IPv4。然而,我的建议是,除非您有非常充分的理由这样做,否则不要费心。IPv4 地址的枯竭只影响公共互联网,而不影响您的内部网络。虽然您当然可以在内部部署 IPv6,但这样做没有任何好处。鉴于 IPv4 有超过 40 亿个可用地址,您需要相当多的设备才能证明 IPv6 的必要性。另一方面,IPv6 对电信业务确实有用(并且最终将是必需的)。对于那些正在学习思科考试的人来说,理解这个主题是必需的。但是对于本书的目的和设置 Linux 网络来说,IPv6 并不能证明管理开销。
总之,提前规划是很重要的。IPv4 对我们的需求已经足够了,将我们的网络划分为子网是一个好主意(即使您认为您的网络永远不会超过 254 个地址)。规划得越大越好;即使在最坏的情况下,您可能永远不会使用所有配置的 IP 地址。但即使您不打算使用大量 IP 地址,将它们保留以备将来扩展网络是一个好主意,而且以后实施起来更容易。根据我的经验,我曾经有过重新配置公司网络的任务,而该网络并不是为了增长而设计的。虽然这绝对是一次学习经历,但并不是一次愉快的经历。
安装和配置 DHCP 服务器
到目前为止,在本章中,我们讨论了为您的网络创建布局。在本节中,我们将付诸行动。在这里,我们将在 Debian 或 CentOS 机器上设置 DHCP 服务器,并将其配置为为我们的网络提供 IPv4 地址。所以,让我们开始吧!
首先,决定哪个发行版将运行您的 DHCP 服务器。选择 Debian、CentOS 或其衍生版本都无所谓。在每个版本上,配置都是相同的,主要区别在于您需要安装的软件包的名称和要启动的守护程序。在 Debian 上,您将安装isc-dhcp-server
软件包,而在 CentOS 上,您将安装dhcp
。Debian 将为您启用 DHCP 守护程序(isc-dhcp-server
),但它不会启动,因为我们还没有配置它。CentOS 不会尝试启动或启用其 DHCP 守护程序(dhcpd
)。
对于 Debian 和 CentOS,我们需要编辑的配置文件位于/etc/dhcp/dhcpd.conf
。为了设置我们的 DHCP 服务器,我们需要编辑这个文件,然后启动或重新启动守护程序。请使用您喜欢的文本编辑器打开这个文件。如果您在 Debian 上安装了 DHCP 服务器,您会注意到提供了一个包含相当多示例配置的默认/etc/dhcp/dhcpd.conf
文件。另一方面,CentOS 基本上给了您一个空白的文件来使用。为了我们的目的,我们将从头开始创建一些配置。在 Debian 的情况下,您可以删除或备份默认配置文件。
接下来是一个 DHCP 的示例配置文件/etc/dhcp/dhcpd.conf
。在这个示例中,我们使用了之前确定的相同网络,并演示了ipcalc
实用程序(10.10.96.0/22
)。这个网络给了我们几个子网可用,但您不必按照这个方案进行,可以根据需要进行调整以适应您的环境。
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
option domain-name "local.lan";
authoritative;
subnet 10.10.96.0 netmask 255.255.252.0 {
range 10.10.99.100 10.10.99.254;
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
}
因此,让我们逐行通过这个配置。
首先,我们有以下两行:
default-lease-time 86400;
max-lease-time 86400;
在这里,我们确定了 DHCP 租约的持续时间。在实践中,当一个节点请求一个 IP 地址时,它的客户端将获得一个租约以及 IP 地址。这意味着 IP 地址只在特定的时间段内有效。在这里,我们设置了一个持续时间为86400
,这意味着我们的租约时间是一天,因为这是以秒为单位的。我们两次列出了这个数字,分别是默认和最大租约时间。如果客户端没有指定请求保留 IP 地址的时间,default-lease-time
将提供给任何客户端。max-lease-time
意味着如果客户端请求保留 IP 地址的时间超过这段时间,将不被允许这样做。我们基本上将默认和最大租约时间设置为相同的数字。如果需要,我们还可以包括min-lease-time
来强制客户端请求更短的最小租约时间。
考虑以下两行:
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
通过这一部分,我们正在设置子网掩码,该子网掩码将被分配给客户端,以及广播地址。正如您可能已经知道的那样,子网掩码标识每个连接节点将成为其中一部分的网络。当客户端在被提供地址后检查其 IP 信息时,我们标识的子网掩码将显示出来。广播地址是一个所有节点都能够接收数据包的地址。
考虑以下两行:
option domain-name "local.lan";
authoritative;
在这里,我们将local.lan
的域名附加到连接到我们的 DHCP 服务器的每个节点的主机名上。这一步并不是必需的,但在规范化网络中的域名时可能会有用。我们还在我们的配置中包括authoritative
,以确立我们的 DHCP 服务器是这个子网的主要服务器。
考虑以下行:
subnet 10.10.96.0 netmask 255.255.252.0 {
range 10.10.99.1 10.10.99.254;
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
}
最后,我们在结尾有一个非常重要的代码块。在这里,我们确定了我们子网的网络地址、子网掩码、我们正在分配的 IP 地址范围、默认网关和我们的 DNS 服务器。在这个示例中,我们从10.10.99.100
开始分配我们的第一个 DHCP 地址,并在10.10.99.254
结束我们的地址池。如果您回忆一下之前的ipcalc
输出,您会注意到这个子网中的第一个地址从10.10.96.1
开始。但我们并没有从那里开始我们的地址池,而是晚了很多。为了参考,我们使用了10.10.96.0/22
网络,这给了我们以下子网:
10.10.96.0
10.10.97.0
10.10.98.0
10.10.99.0
如果我们愿意,我们可以将 DHCP 范围设置为从10.10.96.1
开始,到10.10.99.254
结束。在这种情况下,我们将有 1,022 个 DHCP 地址。但是,我在我的配置中没有这样做的原因是,前三个网络已被保留用于几个目的。我使用第一个(10.10.96.0/22
)用于服务器,下一个用于 DHCP 预留,第三个用于网络设备。由于前三个子网位于 DHCP 范围之外,DHCP 服务器永远不会向客户端提供这些地址,因此我不必担心 DHCP 租约会处理我可能设置的静态地址。确保静态 IP 地址位于 DHCP 范围之外是一种非常常见的做法。
公平地说,这个配置相当复杂,因为我向您展示了如何在 DHCP 中使用多个子网,而不是专注于一个网络。为了简化一点,如果我们设置一个默认的 24 位网络,我们的配置将如下所示(如果我们使用10.10.10.0/24
网络):
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.255.0;
option broadcast-address 10.10.10.255;
option domain-name "local.lan";
authoritative;
subnet 10.10.10.0 netmask 255.255.255.0 {
range 10.10.10.10 10.10.10.254;
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
}
通过这个配置,我将 DHCP 范围设置为从10.10.10.10
开始,到10.10.10.254
结束。这给了我九个 IP 地址(10.10.10.1
—10.10.10.9
),永远不会被分配,所以我有空间设置一些静态 IP 地址。
所以,我在这里几次提到了静态 IP 地址。你可能已经知道这是什么意思,但重要的是要详细说明静态 IP 地址对服务器来说是一个很好的主意。这些地址是为某些服务器或节点保留的,您希望它们每次都有相同的 IP 地址。如果您以前配置过网络,这可能是显而易见的。还有一个重要的静态租约的概念。静态租约也称为预留。使用静态租约,IP 地址仍由 DHCP 服务器提供,客户端仍然使用 DHCP 请求地址。不同之处在于,客户端每次连接时都会收到相同的地址。
设置静态租约非常容易。预留可以放在您的/etc/dhcp/dhcpd.conf
文件的末尾。以下是一个示例,展示了语法的样子:
host bahamut {
hardware ethernet 28:B2:BD:05:1E:00;
fixed-address 10.10.97.4;
}
在这里,我们有一个名为bahamut
的主机,MAC 地址为28:B2:BD:05:1E:00
。这个名字是任意的;它除了让我们记住预留是为了哪个主机之外没有实际意义。它不必与请求 IP 的设备的主机名匹配。代码块中的两行只是表示每当网络卡连接到具有 MAC 地址28:B2:BD:05:1E:00
的 DHCP 服务器时,它需要提供 IP 地址10.10.97.4
。我们可以添加尽可能多的类似代码块,以便为我们希望分配的静态租约添加尽可能多的代码块。
也许你会想知道,何时应该使用静态 IP,何时应该使用静态租约?在我看来,只要有意义并符合您的网络设计,就可以使用静态租约。使用静态租约,您只需要在想要查看所有预留的概述时检查/etc/dhcp/dhcpd.conf
文件。此外,即使您重新安装操作系统或从活动安装映像引导主机,主机也将始终收到相同的 IP 地址。对于静态租约,您无需在主机上进行任何配置。通常,静态租约更容易管理。当然,您自己的偏好将超越这一点。
最后,为了使我们的 DHCP 服务器正常运行,必须启动并配置为在启动时运行。Debian 已经负责启用守护程序,因此您只需要重新启动它,以便我们的配置生效:
# systemctl restart isc-dhcp-server
对于 CentOS,我们需要手动启用和启动服务:
# systemctl enable dhcpd
# systemctl start dhcpd
正如你所看到的,配置 Linux 上的 DHCP 服务器非常容易和直接。当然,还有高级用法场景和大量的附加选项。但是对于大多数情况来说,像这里概述的这样的配置应该足够了。
安装和配置 DNS 服务器
域名系统(DNS)使得浏览网络资源变得更加容易。除非你有一个非常小的网络,否则你不太可能记得哪些 IP 地址属于哪些机器。DNS 通过将名称映射到 IP 地址来帮助你,这样你就可以通过主机名引用计算机,DNS 将负责将其翻译回 IP 地址。
DNS 是几乎每个连接到网络的设备都在使用的东西,无论用户是否意识到。计算机、服务器、智能手机、平板电脑、智能家电等都在使用 DNS。每当你在互联网上查找一个服务,比如一个网站或一个远程资源,DNS 会将资源的名称翻译成 IP 地址。
尽管 DNS 的概念和它为我们做的事情可能是常识,但它是那些容易被认为理所当然的东西之一。DNS 是那些在背后工作并让我们的生活变得更加容易的神秘事物之一。我们大多数人都在使用它,但很少有人真正理解它是如何工作的。每当你连接到一个互联网服务提供商(ISP)时,通常会分配给你一个或两个 DNS 服务器供你使用。一些聪明的用户通常会绕过 ISP 分配的 DNS 服务器,使用谷歌或 OpenDNS 等第三方服务器,以期望获得额外的性能。
DNS 在内部网络中也可以证明是有用的。大多数有超过一把工作站的公司都会设置 DNS,这是理所当然的。它使得浏览你的网络变得轻而易举。例如,更容易将你的本地彩色打印机称为hp-color-01
,而不是记住 IP 地址,比如10.19.89.40
。在这种情况下,添加打印机将会很容易。只需让你的操作系统按名称浏览它。你网络上的任何资源都可以被命名,为所有网络资源创建一个一致和可预测的命名方案是一个好主意。所以,让我们做到这一点。
与 CentOS 相比,基于 Debian 的发行版所需软件包的命名通常有所不同。在 Debian 中,你需要安装的软件包是bind9
。CentOS 简单地称其为bind
。如果你想知道的话,BIND代表伯克利互联网名称域(以它被开发的地方命名,即加州大学伯克利分校)。这是互联网上最流行的名称服务器,所以你肯定会想熟悉它。顺便说一句,如果你在 CentOS 系统上进行这个活动,我建议你安装bind-utils
。这给了我们dig
命令,对我们来说会很有用。
第一步是在服务器上安装所需的软件包,然后你只需要启动它并确保它被启用以在启动时运行。Debian 已经为我们启动了守护程序并启用了它。你可以用以下命令来确认:
# systemctl status bind9
CentOS 不会自动启动bind
守护程序,也不会为你启动它。如果你选择的是 CentOS 发行版,你需要执行以下命令来启用bind
并启动它:
# systemctl enable named
# systemctl start named
完成这一步后,你实际上拥有了一个工作的 DNS 服务器。当然,我们没有配置任何东西,所以我们的 DNS 服务器实际上并没有为我们做太多事情。但现在我们已经安装了它,我们可以向其中添加记录并构建我们的配置。
首先,让我们来看一下默认配置文件。Debian 将 bind 的默认配置文件存储在/etc/bind/named.conf
中。CentOS 将它们存储在/etc/named.conf
中(它没有自己的目录)。去看看这个文件,了解一下配置是如何工作的。我们将使用我们自己的配置文件,所以我建议你备份默认文件,然后我们将安装我们自己的文件。
首先,在我们发行版的默认目录中创建一个新的named.conf
文件(在 Debian 中是/etc/bind/named.conf
,在 CentOS 中是/etc/named.conf
)。无论你使用哪个发行版,我们都会使文件相同。如果这个文件已经有文本了,把它复制到一个备份中或清空它,因为接下来的两行是我们在这个文件中需要的唯一文本:
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
在这里,我们将包括两个额外的文件(我们很快将创建)。正如你所看到的,我们的named.conf
文件只是调用这些文件,不包含其他配置。这样,我们可以创建我们自己的标准位置来找到这些文件。/etc/bind
已经是 Debian 中的默认位置,但通过在 CentOS 中调用这个目录,我们可以强制它在同一个地方查找配置。但是在 CentOS 中,你需要创建/etc/bind
目录。命令如下:
# mkdir /etc/bind
接下来,让我们创建我们的/etc/bind/named.conf.options
文件并自定义它:
options {
forwarders {
8.8.8.8; 8.8.4.4;
};
};
在这里,我们正在创建一个选项块,其中夹在花括号之间的一些代码,然后包括另一组花括号,我们在其中标识了我们的转发地址。由于这个 DNS 服务器是用于在我们的内部网络中定位资源,转发器块告诉我们的 DNS 服务器在本地找不到它要找的东西时应该将请求发送到哪里。你的 DNS 服务器很可能在没有这个的情况下仍然可以正常工作,因为在大多数情况下它仍然会尝试链条下游的另一个 DNS 服务器。但是在这里设置转发器允许我们强制指定 DNS 查找应该去哪里,以防我们要查找的是外部的东西。在这个示例中,我使用了谷歌的公共 DNS 服务器。但你可以选择你自己的。一些额外的 DNS 服务器(通常更好)可以在www.opennicproject.org找到,这也是一个很好的选择,如果你担心隐私或跟踪的话。
我们的下一个文件是/etc/bind/named.conf.local
,其中包含以下代码:
zone "local.lan" IN {
type master; file "/etc/bind/net.local.lan";
};
zone "96.10.10.in-appr.arpa" {
type master; notify no; file "/etc/bind/revp.10.10.96";
};
zone "97.10.10.in-appr.arpa" {
type master; notify no; file "/etc/bind/revp.10.10.97";
};
zone "98.10.10.in-appr.arpa" {
type master; notify no; file "/etc/bind/revp.10.10.98";
};
zone "99.10.10.in-appr.arpa" {
type master; notify no; file "/etc/bind/revp.10.10.99";
};
在这个文件中,我们首先要确定我们的域名。在这里,我选择了local.lan
。由于这台服务器不是互联网上任何东西的权威,这个名字很合适。在这个块中,我们调用另一个文件/etc/bind/net.local.lan
。事实上,正如你所看到的,这里调用了几个文件(总共五个)。第一个是我们的主 DNS 区域,它是其中最重要的。其后的是我们配置反向 DNS 查找的地方。基本上,DNS 不仅允许我们将主机名映射到 IP 地址,还可以进行反向映射(将 IP 地址映射回主机名)。你可能不需要我在示例中创建的所有文件。对我来说,我为我的四个子网中的每一个创建了一个反向查找文件。如果你不创建多个子网,你只需要创建一个。这些文件的命名约定是revp
,后面跟着 IP 地址的网络部分。所以,例如,我的10.10.99.0
网络的反向查找文件是revp.10.10.99
。这些文件也将存储在/etc/bind
中。
现在,让我们来看看我们的主记录,/etc/bind/net.local.lan
文件:
;
; dns zone for for local.lan
;
$TTL 1D
@ IN SOA local.lan. hostmaster.local.lan. (
201507261 ; serial
8H ; refresh
4H ; retry
4W ; expire
1D ) ; minimum
IN A 10.10.96.1
;
@ IN NS hermes.local.lan.
ceres IN A 10.10.98.1
euphoria IN A 10.10.97.4
galaxy IN A 10.10.96.4
hermes IN A 10.10.96.1
puppet CNAME galaxy
;
; dns zone for for local.lan
;
首先,我放了一些通用的注释,以分号开头的行。如果一行以分号开头,它将被bind
忽略。注释可以是留下关于配置的注释或事实的好方法。然而,在bind
中注释并不经常使用。接下来,我们将我们的生存时间(TTL)设置为一天:
$TTL 1D
这个值决定其他 DNS 服务器能够缓存每个记录的时间有多长。在此期间,任何缓存了这些记录的服务器必须丢弃它们。为了设置内部 DNS 服务器,这个值对我们影响不大。但是,如果您设置了多个 DNS 服务器,这可能是一个重要的配置值。TTL 值可能会被证明有用的一个例子是将地址记录更改为不同的 IP 地址。假设您要将您的电子邮件主机切换到另一个提供商。在这种情况下,您将相应地更改地址记录。但在执行此更改之前,您可能会将 TTL 降低到更短的时间,比如一小时,然后再进行更改。然后,服务器被迫丢弃这个区域并刷新它,导致它更快地看到您更改的电子邮件提供商。完成后,您将把这个值改回来。在下一行,我们确定了一个权威起始(SOA):
@ IN SOA local.lan. hostmaster.local.lan. (
在这种情况下,我们确定了这个 DNS 服务器对local.lan
域有权限。我们还澄清了hostmaster.local.lan
对此负有责任。虽然看起来可能不像,但hostmaster.local.lan
实际上是一个按照 bind 的偏好格式的电子邮件地址。然而,这显然是一个假地址,对于我们的内部 DNS 服务器并不重要。在这一行的末尾,我们正在打开一个配置块,这里是一个开放括号。下一行代表我们的序列号,这是一个非常重要的概念,为了使我们的 DNS 服务器正常工作,必须理解。
201507261 ; serial
每次我们重新启动bind
守护程序时,它都会重新加载这个文件。但是当它这样做时,序列号是它首先查看的东西。如果它是相同的,它可能不会加载任何更改。因此,每次您在bind
中更改区域文件时,您也必须更改这个序列号。在这个例子中,当前日期被使用,没有连字符或空格。最后一位数字只是当天的修订号,如果文件在一天内被多次更改。您可以使用任何您喜欢的方案。但使用日期是一个非常流行的方法。无论您使用的格式是什么,都要确保您在每次更改时将序列号递增 1。这样您就不会因为新创建的记录没有生效而感到沮丧。
8H ; refresh
4H ; retry
4W ; expire
1D ) ; minimum
这些值决定了从属 DNS 服务器被告知多久检查更新。第一个值将配置从属服务器每八小时从主服务器(本服务器)刷新区域记录。关于重试,我们让从属服务器知道如果连接出现问题,要在这段时间内再次检查。最后,我们将区域记录的最小年龄设置为一天,最大年龄设置为四周。配置从属 DNS 服务器超出了本书的范围,但是在以后决定配置从属 DNS 服务器时,有这个配置也不会有任何坏处。
@ IN NS hermes.local.lan.
在这里,我们确定了这个名称服务器。在我的情况下,我称之为hermes
,它的完整域名是hermes.local.lan
。
galaxy IN A 10.10.96.4
hermes IN A 10.10.96.1
最后,在这个示例配置中,调用了四个地址记录。这基本上意味着每当有人寻找这些主机中的一个时,请求就会映射到列出的域名上。这些可以是多个子网中的一部分,也可以是单个子网中的一部分。在我的情况下,这些主机位于不同的子网上。
puppet CNAME galaxy
这个配置的最后一行包含一个规范名称(CNAME)记录。基本上,这允许我们用另一个名称引用一个服务器。在这个例子中,galaxy
也用于名为puppet
的软件,因此为它设置了一个 CNAME 记录。这样,如果有人试图访问galaxy.local.lan
或puppet.local.lan
,他们的请求将解析到相同的 IP 地址(10.10.96.4
)。如果单个服务器为网络提供多个服务,CNAME 记录可能非常有用。
之前,我提到了四个反向查找记录,/etc/bind/revp.10.10.96
,/etc/bind/revp.10.10.97
,/etc/bind/revp.10.10.98
和revp.10.10.99
。接下来,我将演示其中一个文件(在这种情况下,是为10.10.96.0
网络):
$TTL 1D
@ IN SOA hermes.local.lan. hostmaster.local.lan. (
201507261 ; serial
28800 ; refresh (8 hours)
14400 ; retry (4 hours)
2419200 ; expire (4 weeks)
86400 ; minimum (1 day)
)
;
@ NS hermes.local.lan.
1 PTR hermes.local.lan.
3 PTR nagios.local.lan.
4 PTR galaxy.local.lan.
通过这个配置,您会注意到我们有一个权威起始记录,就像我们的主区域一样,还有一个序列号。这里也适用相同的想法。每当您更新任何记录(包括反向查找记录)时,都应该更新文件的序列号。权威起始条目的工作方式与之前相同,没有什么意外。文件的不同之处在于如何调用主机。我们只需要识别最后一个八位字节,因为整个文件专门用于从10.10.96.0
网络进行反向 IP 地址查找。对于您的子网中的每个子网,您都需要创建一个类似的文件。在我们的示例配置中有四个子网,但您不需要那么多。这样提供示例是为了演示如何处理单独的子网,如果您需要的话。
配置完成后,可以随时重新启动 DNS 服务器上的 bind 服务并进行测试。我们可以使用systemctl
命令重新启动bind
,就像以前一样。
对于 Debian,请使用以下命令:
# systemctl restart bind9
对于 CentOS,请使用以下命令:
# systemctl restart named
我们可以通过dig
命令测试我们的 DNS 服务器。在 Debian 中,您应该已经安装了这个软件包。CentOS 需要安装bind-utils
软件包。dig
(域信息检索器)是一个实用程序,允许我们从 DNS 服务器请求信息。要尝试一下,请尝试使用内部主机名:
dig myhostname.local.lan
如果您的 DNS 服务器在输出中显示为SERVER
,则您的 DNS 服务器正常运行。如果由于某种原因没有显示,请验证您输入的内容、序列号以及您上次配置更改后是否重新启动了bind
。
随时练习在 DNS 服务器中设置额外的节点和记录。一开始设置bind
可能会让人沮丧,但坚持下去,您很快就会成为专家。使用本节中的示例,您应该有一个可以在您的环境中设置 DNS 服务器的工作框架。确保您将配置文件中包含的主机名和 IP 地址更改为与您的网络匹配的主机名和 IP 地址。此外,确保您设置bind
以匹配您的子网,或者如果没有其他子网,则删除其他子网的提及。为了安全起见,通常最好手动输入所有内容,而不是直接从本书复制配置。
设置内部 NTP 服务器
大多数 Linux 发行版都提供了一个网络时间协议(NTP)客户端,可用于保持本地时间的最新状态。其想法是,通过配置 NTP 客户端,您的计算机或服务器将定期与互联网上的 NTP 服务器进行同步,以确保其尽可能精确。这非常重要;如果时钟不准确,Linux 机器可能会发生非常奇怪的事情。这些奇怪的事情可能包括节点无法与 DHCP 服务器关联以获取 IP 地址,文件在文件服务器之间变得不同步等。故事的教训是:您需要在您的环境中设置并使 NTP 正常工作。
许多面向最终用户工作站的 Linux 发行版(如 Ubuntu、Linux Mint 等)通常会为您设置 NTP 客户端。这意味着开箱即用,您的时钟很可能已经同步,当然前提是您的安装可以访问互联网。默认情况下,这些客户端将连接到特定于发行版的 NTP 服务器。这可能完全没问题,但是设置自己的 NTP 服务器也是有价值的。其中一个很好的理由是,通过设置自己的 NTP 服务器,您正在成为一个良好的网络公民。想想看。如果您有一家拥有一百台 Linux 机器的公司,如果保持默认配置,每台机器都会定期与公共 NTP 服务器进行通信。这会给服务器造成不必要的压力。如果您设置自己的 NTP 服务器,只有一个服务器会与公共服务器进行通信,这意味着您会消耗更少的资源。此外,出于安全原因,一些公司不允许公共访问端口 123(NTP 使用的端口)。然而,也许允许一个单独的 NTP 服务器访问端口 123,然后您可以配置您的客户端连接并使用 NTP。
在设置 NTP 服务器之前,重要的是要注意,Debian 和 CentOS 通常可以成为默认安装 NTP 客户端的例外情况。根据您在安装过程中选择的选项和软件包,NTP 客户端可能已经可用,也可能尚未可用。在我的测试环境中,当我分别通过最小安装和网络安装安装时,CentOS 和 Debian 默认情况下都没有一个可用的 NTP 客户端。然而,设置 NTP 客户端非常容易。您只需安装 NTP 并启用它。这实际上是 Debian 和 CentOS 具有相同软件包相同名称的罕见情况之一。该软件包简单地称为ntp
,因此如果您尚未安装,请安装它。安装后,Debian 将启动ntp
守护程序并为您启用它。对于 CentOS,请执行以下命令以启动它:
# systemctl enable ntpd
# systemctl start ntpd
使用这两个发行版,一旦安装了软件包,文件/etc/ntp.conf
将被创建,并且该文件将具有一个默认配置,该配置将指向您的发行版的 NTP 服务器。如果您对它的外观感到好奇,可以随意快速查看一下这个文件。要查看您的机器正在与哪个服务器同步,以及关于其同步的一些统计信息,请执行ntpq -p
命令。
查看连接的 NTP 服务器
首先,让我们快速看一下这些数字的含义。第一列remote
包括我们连接的 NTP 服务器的列表,没有什么意外。接下来是refid
,表示这些服务器连接到的地方。st
列是指该服务器的层,这是一个指示该时间服务器所在层的数字。通常,数字越低,它就越好;因为这意味着该服务器与提供时间的源相当接近。链条下的每个服务器都有一个增加的层;最低并不总是意味着服务器更好,但一般来说,较低的数字是好的。t
列是指类型。这可以是单播、广播、组播或多播。在这种情况下,我们使用u
表示单播。
when
列指的是服务器上次轮询的时间。在示例截图中,每个服务器分别在 28、24、21 和 61 秒前轮询。这也可以列出小时或天。poll
列指的是轮询频率,这里设置为每 64 秒轮询一次。reach
列是一个八进制数,其中包含最近八次 NTP 更新的结果。如果所有八次都成功,这个值将读取 377,这是它能达到的最高值。这意味着所有八次尝试都收到了 1(成功),在八进制中,总共是 377。
最后,delay
字段指的是到 NTP 服务器的延迟(以毫秒为单位)。offset
字段对应于本地时钟和服务器时钟之间的差异。最后,jitter
指的是您和服务器之间的网络延迟。
要设置 NTP 服务器,您必须首先安装客户端,就像本章前面提到的那样。安装它,配置守护程序自动启动,然后启动它。执行这些任务后,您已经完成了大部分工作(服务器和客户端使用相同的客户端)。基本上,如果您将其他计算机指向安装和配置了 NTP 的服务器,您基本上已经拥有了所需的一切。
然而,有一些东西应该首先配置。主要是/etc/ntp.conf
配置文件。该文件在 Debian 和 CentOS 上的位置相同。如果您查看文件,您会看到一些类似以下的行:
server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst
在这里,您可以看到,默认情况下,CentOS 标识了四个 NTP 服务器进行同步。对于大多数用例来说,这些服务器通常都很好,但您可能希望考虑官方的 NTP 服务器。要这样做,请查看以下网站:
该网站将允许您查看 NTP Pool Project 的官方 NTP 服务器。要导航,请在右侧选择您的大陆,然后选择您的国家。然后,您应该看到一个可以使用的 NTP 服务器列表。在我的情况下,我得到以下细节:
server 0.north-america.pool.ntp.org
server 1.north-america.pool.ntp.org
server 2.north-america.pool.ntp.org
server 3.north-america.pool.ntp.org
您可以选择使用发行版提供的 NTP 服务器,也可以选择使用 NTP 池项目提供的 NTP 服务器。就我个人而言,我更喜欢后者。一旦您配置了服务器,我们应该进行一次更改。您应该在 CentOS 的配置中看到类似以下的行:
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
在 Debian 中类似于以下内容:
#restrict 192.168.123.0 mask 255.255.255.0 notrust
在您的 NTP 服务器上,取消注释该行,并将网络地址更改为您的地址,以及子网。如果有notrust
,请删除它。作为参考,我的配置中的该行如下:
restrict 10.10.96.0 mask 255.255.252.0 nomodify notrap
有了这个配置,我们限制了 NTP 访问本地客户端,并确保它们无法访问 NTP 服务器的配置(只能从中读取)。我在 NTP 中喜欢做的另一个更改是指定一个日志文件。systemd 通过journalctl
负责记录,但有时在出现问题时查看文本文件也很有用。如果您需要,可以在顶部附近添加以下行:
logfile /var/log/ntp.log
如果您遇到任何问题,请检查该文件。接下来,如果您将 CentOS 用作 NTP 服务器,则应通过其防火墙启用 NTP 流量。要做到这一点,请运行以下代码:
firewall-cmd --add-service=ntp –permanent
firewall-cmd --reload
现在我们已经完成了,重新启动您的 NTP 服务器。我们可以通过以下命令之一来执行(作为 root)。
在 CentOS 上使用systemctl restart ntpd
命令,或在 Debian 上使用systemctl restart ntp
。
在这一点上,您已经有了一个 NTP 服务器。在您的客户端上,将它们配置为与您指定为 NTP 服务器的机器的 IP 同步。在我的情况下,命令如下:
server 10.10.99.133
重新启动 NTP 后,让您的系统一些时间进行同步。在某些情况下,可能需要半个小时以上才能开始同步。给它一些时间,然后检查您的配置,确保它正在使用ntpq -p
命令进行同步。
与自定义 NTP 服务器同步的机器输出
在我的测试环境输出中,您可以看到,我在10.10.99.123
上启动了一个 NTP 服务器,这台 Debian 机器正在与之同步,目前服务器的可达性为7
,但这个数字正在慢慢上升。这很正常,因为服务器只运行了几分钟。
如果您遇到任何问题,请确保在您的网络中打开端口 123(如果服务器是 CentOS,请确保您已运行之前提到的防火墙命令)。但在您感到沮丧之前,请给它一些时间——当第一次设置时,NTP 服务器需要一些时间才能启动是很常见的。通常,一切应该在 20 分钟内开始运行,但我曾经见过更长时间。
总结
在本章中,我们配置了网络的布局。我们首先讨论了规划网络 IP 地址布局,然后通过创建自己的 DHCP 服务器来付诸实施。这次讨论包括如何将此配置分成多个子网,而不是多个子网。我们继续设置 DNS 服务器,以便通过名称解析我们的网络节点。最后,我们通过设置 NTP 服务器来结束本章,以确保我们的所有节点都具有正确的时间。
在下一章中,我们将探讨使用 Apache 托管网页内容。
第七章:通过 Apache 托管 HTTP 内容
Apache是互联网上最常用的 Web 服务器。虽然还有其他可用的 Web 服务器,比如微软的Internet Information Services(IIS),但在提供 Web 内容方面,Apache 占据着统治地位。Apache 在 Linux 和 UNIX 平台上都可用,使您能够托管内容并在本地局域网以及互联网上共享。Apache 服务器有许多用途,包括(但不限于)托管博客或公司网站,或为您的公司设置员工门户网站。
在本章中,您将学习有关安装和配置 Apache 的所有内容。我们将涵盖以下主题:
-
安装 Apache
-
配置 Apache
-
添加模块
-
设置虚拟主机
安装 Apache
像往常一样,在系统上安装 Apache 只是从软件包管理器中安装适当的软件包。在 CentOS 系统上,您可以通过安装httpd
软件包获取 Apache,在 Debian 系统上则是apache2
软件包(分别作为 root 执行yum install httpd
或apt-get install apache2
)。安装软件包后,Apache 的守护程序现在已经存在,并带有一组默认的配置文件。您可以使用systemctl
确认守护程序在您的系统上的存在,尽管守护程序的名称根据您的发行版而有所不同。
在 Debian 上使用以下命令:
# systemctl status apache2
在 CentOS 上使用以下命令:
# systemctl status httpd
默认情况下,Debian 会为您启动和启用守护程序。与此相反,CentOS 不会做任何假设。您可以使用systemctl
命令轻松启动和启用守护程序:
# systemctl enable httpd
# systemctl start httpd
安装和启用 Apache 后,您在网络上已经有了一个工作的 Web 服务器。它可能并不特别有用(因为我们还没有配置它),但在这一点上它是存在的,而且在技术上是工作的。CentOS 和 Debian 版本的 Apache 都在同一个目录/var/www/html
中寻找 Web 内容。在那里,Debian 创建了一个样本网页,以index.html
文件的形式存在,您可以通过另一台计算机上的 Web 浏览器查看(只需将其指向您的 Web 服务器的 IP 地址)。另一方面,CentOS 并没有为您创建一个样本 HTML 页面。这很容易纠正;您只需要手动创建/var/www/html/index.html
文件,并放入一些样本代码。它不需要很豪华;我们只是想确保我们有一些东西可以测试。例如,您可以在该文件中放入以下代码:
<html>
<title>Apache test</title>
<body>
<p>Apache is awesome!</p>
</body>
</html>
此时,您应该已经安装了 Apache 并启动了其服务。您的系统上应该有一个示例的/var/www/html/index.html
文件,无论您是使用 Debian 的默认设置还是在 CentOS 系统上手动创建的。现在,您应该能够通过 Web 浏览器浏览到您的 Web 服务器并查看此页面。如果您知道您的 Web 服务器的 IP 地址,只需在 Web 浏览器的地址栏中输入即可。您应该立即看到示例页面。如果您在 Web 服务器上使用 Web 浏览器,您应该能够浏览到本地主机(http://127.0.0.1
或http://localhost
)并查看相同的页面。
注意
如果您选择了 CentOS 作为您的 Web 服务器,那么默认防火墙可能会妨碍您从另一台机器上浏览到它。根据您的配置,您可能需要通过防火墙允许流量到您的 Web 服务器。要做到这一点,执行以下命令:
# firewall-cmd --zone=public --add-port=80/tcp --permanent
# firewall-cmd --reload
一定要添加端口 443,如果您计划托管一个安全的网站。只需使用与之前相同的firewall-cmd
,但用 443 替换 80。
如果出于某种原因您看不到默认页面,请确保 Apache 正在运行(记住我之前提到的systemctl status
命令)。如果守护程序没有运行,您可能会收到连接被拒绝的错误。另外,请记住,基于硬件的防火墙也可能阻止访问。
从 Debian 上运行的未配置 Apache 提供的默认网页
另一种测试服务器是否提供网页的方法是通过lynx
,这是一个文本化的网页浏览器,您可以在 shell 中使用。在某些情况下,这可能是首选,因为它没有图形网页浏览器的开销,并且启动非常快。一旦在您的机器上安装了 lynx 软件包,您可以通过执行lynx http://localhost
或http://<ip 地址>
从不同的机器访问来自服务器的网站。
使用 lynx 测试 web 服务器功能
注意
要退出lynx
,按Q退出,然后按Y确认退出。
正如我所提到的,Debian 和 CentOS 都在同一个目录中查找要通过 Apache 共享的文件。这个目录是/var/www/html
。为了创建一个网站,您需要将网站的文件放入这个目录。设置 Apache 服务器的典型过程是先安装 Apache,然后测试它是否可以被网络上的其他计算机访问,最后开发您的网站并将其文件放入这个文件夹。
配置 Apache
配置 Apache 是通过编辑其配置文件来完成的,这将位于两个位置中的一个,具体取决于您的发行版。
在 CentOS 上使用以下命令:
/etc/httpd/conf/httpd.conf
在 Debian 上使用以下命令:
/etc/apache/apache2.conf
默认的网页文档目录/var/www/html
可以更改。虽然/var/www/html
是相当标准的,但如果您决定将网页文件存储在其他地方,也没有什么阻止您更改它。如果您查看 CentOS 中的配置文件,您将看到这个目录在从第 131 行开始的一个配置块中被调用。如果您查看 Debian 中的配置文件,您根本看不到这个调用。相反,您将在/etc/apache2
中看到一个名为sites-available
的目录。在该目录中,将有两个默认文件,000-default.conf
和default-ssl.conf
。这两个文件都将/var/www/html
指定为默认路径,但它们的区别在于000-default.conf
文件指定了端口 80 的配置,而default-ssl.conf
负责端口 443 的配置。您可能知道,端口 80 是标准的 HTTP 流量,而端口 443 对应于安全流量。因此,每种类型的流量在 Debian 系统上都有自己的配置文件。
在所有这些情况下,文档根目录都被设置为/var/www/html
。如果您想将其更改为其他目录,您需要更改代码以指向新目录。例如,如果您想将路径更改为/srv/html
之类的内容,您需要对文件进行一些更改。
首先,查找以下行:
DocumentRoot /var/www/html
将其更改为指向新目录:
DocumentRoot /srv/html
在我的测试系统上,我在 Debian 的以下配置文件中找到了DocumentRoot
的调用:
/etc/apache2/sites-available/000-default
在 CentOS 上,我发现在默认配置文件的第 119 行:
/etc/httpd/conf/httpd.conf
更改后,我们必须为新目录设置选项。在 Debian 上,我们需要在以下文件中进行这些更改:
/etc/apache2/apache2.conf
在 CentOS 上,我们需要在以下文件中进行这些更改:
/etc/httpd/conf/httpd.conf
打开其中一个文件,具体取决于您使用的发行版。我们需要更改的代码看起来像这样:
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
相应地更改以下内容:
<Directory "/srv/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
注意
在前面的示例中,代码中可能夹杂着一些注释,但基本思想是一样的。找到以<Directory "/var/www/html">
开头的行,并确保该块中的未注释代码与示例匹配。只要你这样做,你就应该没问题。
最后,可能不用说,但为了避免麻烦,您应该确保已将权限设置为/srv/html
,使得该目录和内容对所有人可读。还要确保您已经创建或复制了一个示例 HTML 文件(例如index.html
)到该目录中。一旦重新启动 Apache,您应该能够从这个新目录提供网络内容。
除了设置文档根目录外,Apache 配置文件还允许您配置一些非常重要的安全设置。例如,默认情况下禁用对服务器文件系统的访问。这是一件好事。以下代码是从 CentOS 系统中提取的示例,它负责防止整个文件系统的访问。代码如下:
<Directory />
AllowOverride none
Require all denied
</Directory>
默认情况下,通过以下配置块禁用了远程查看.htaccess
文件:
<Files ".ht*">
Require all denied
</Files>
还可以设置其他选项,例如 Apache 日志文件的默认位置。默认情况下,以下默认配置行将日志文件指向/etc/httpd/logs
:
ErrorLog "logs/error_log"
然而,这可能会误导,因为在 CentOS 系统上,/etc/httpd/logs
目录实际上是一个符号链接到/var/log/httpd
,这才是您实际上可以找到日志文件的地方。默认情况下,日志记录设置为warn
,这也可以在 Apache 配置文件中更改,并设置为debug
、info
、notice
、warn
、error
和crit
中的任何一个。
需要注意的是,对于您对 Apache 所做的任何更改,您都需要重新加载或重新启动守护程序。如果重新启动守护程序,它将关闭 Apache 并重新启动。重新加载只是导致 Apache 重新读取其配置文件。在大多数情况下,重新加载是更好的选择。通过这样做,您可以应用新的配置而不会中断对您网站的访问。与大多数 systemd 单元一样,Apache 使用以下命令来管理守护程序的运行状态:
- 使用以下命令启动 Apache 守护程序:
# systemctl start apache2
- 使用以下命令停止 Apache 守护程序:
# systemctl stop apache2
- 使用以下命令在启动时启用 Apache 守护程序:
# systemctl enable apache2
- 在尝试保持其运行状态的同时重新加载 Apache 守护程序:
# systemctl reload apache2
- 使用以下命令重新启动 Apache 守护程序:
# systemctl restart apache2
如果您使用的是 CentOS,请在每种情况下将apache2
替换为httpd
。现在您已经了解了 Apache 的安装和配置方式,我们可以继续使用模块。
添加模块
尽管 Apache 开箱即用非常有用,但您可能需要的一些功能并不是内置的。Apache 使用模块来扩展其功能集。例如,安装php5
模块以使您的站点能够使用 PHP,或者如果您使用 Python 开发,则可能需要 Python 模块。一旦安装并激活了模块,该模块的功能将对您可用。
CentOS 和 Debian 之间的 Apache 实现是不同的,它们之间添加模块的方式也是不同的。事实上,Debian 甚至包括了其专门用于启用和禁用模块的命令,这完全是 Debian 系统的专属。这些命令是a2enmod
和a2dismod
。
要通过 Debian 启用模块的典型过程,我们可以在服务器上启用 PHP 模块。我还将详细介绍 CentOS 中的这个过程,但是正如我提到的,这个过程在这两者之间完全不同。
首先,找到包含您想要的模块的软件包。如果您不知道要安装的软件包的确切名称,可以使用以下命令将可用的 Apache 模块列表打印到终端:
aptitude search libapache2-mod
默认情况下,大多数 Debian 系统上都没有安装aptitude
。如果上一个命令导致command not found error
,您只需要通过apt-get install
安装aptitude
软件包。输出可能会太长,取决于您的终端窗口的大小,因此您可能需要将输出导入less
:
aptitude search libapache2-mod |less
以下屏幕截图显示了在 Debian 系统上使用 aptitude 搜索libapache2-mod
时的搜索结果:
在 Debian 系统中,有相当多的 Apache 模块可用。
通过这种方式搜索,您可以按Enter
或上下箭头键滚动输出,然后在完成时按Q。通过查看输出,您会发现 PHP 包的名称是libapache2-mod-php5
。因此,让我们使用以下命令安装它:
# apt-get install libapache2-mod-php5
安装完包后,检查输出。很可能 Debian 已经为您安装了模块,逻辑是如果您明确要求安装一个包,您可能希望立即使用它。如果您看到类似以下的输出,则此示例中的 PHP 模块已经安装:
apache2_invoke: Enable module php5
您可以尝试启用它来验证这一点,通过在 shell 中执行a2enmod php5
。如果启用了,您将看到类似以下的输出:
Module php5 already enabled
实质上,a2enmod
和a2dismod
命令的工作方式基本相同。您可能已经了解,一个是启用模块,另一个是禁用模块。要使用 Apache 模块,必须启用它。但是,如果您不再需要某个模块,可以禁用它(或者更好的做法是删除它)。查看所有模块及其提供的功能超出了本书的范围。但在实践中,您只会启用站点所需的模块,这在不同的环境中会有所不同。在我们继续在 CentOS 系统上执行相同的过程之前,我给您留下这个提示。要查看在 Debian 系统上安装的所有模块的列表,请发出以下命令:
# apache2ctl -M
现在,让我们转到 CentOS。大多数模块可以通过使用包管理器列出可用的模块包,类似于我们在 Debian 部分之前所做的方式。在 CentOS 中,我们可以通过以下命令来实现:
yum search mod_
很遗憾,PHP 模块在这个输出中没有列出。这是因为我们在 CentOS 中通过简单安装php
包来启用 PHP。这就是事情开始变得混乱的地方;相当多的 CentOS Apache 模块包都遵循以mod_
开头的命名约定,但并非所有模块都是这样。有时需要进行一些研究来确定需要安装哪些包以授予系统对模块的访问权限。如果您在开发网站时需要其他模块,比如用于 LDAP 认证的mod_ldap
,也可以随意安装。
与 Debian 不同,yum
包管理器应该已经为您启用了安装的模块。现在我们在 CentOS 系统中安装了 PHP,一旦重新启动httpd
守护程序,我们应该可以使用 PHP。要验证这一点,我们应该能够创建一个info.php
文件并将其存储在/var/www/html/info.php
中。文件的内容如下:
<?php phpinfo();
?>
如果您导航到 URL http://<your_server_IP>/info.php
,您应该看到包含有关服务器 PHP 实现的信息的页面。
在 Apache 服务器上查看 PHP 服务器信息
注意
虽然使用info.php
文件来测试 PHP 是完全可以的,但不要将其留在服务器上——这是一个安全风险。您不希望使攻击者轻而易举地确定有关服务器正在运行的具体信息。这个过程只是为了测试 PHP 是否正常运行。
现在我们已经介绍了安装 Apache 模块,您应该可以轻松地根据需要定制您的 Web 服务器,以支持您计划运行的任何网站或应用程序。
设置虚拟主机
一个组织托管多个站点是非常常见的。这些站点可以存在于自己的服务器或虚拟机上,但这并不是非常实际的。每台服务器只运行一个站点非常昂贵且效率不高。虚拟主机的概念是多个站点可以存在于一个 Web 服务器上,这样可以节省基础设施。当然,可能会有一个网站产生了大量流量,与其他高流量站点共享可能不是一个好主意,但在这种情况下,推荐使用虚拟主机。
如前所述,/var/www
是 Apache 查找要提供的文件的默认位置。如果您在一台服务器上托管多个站点,您会希望为每个站点创建一个单独的目录。例如,如果您为名为tryadtech.com
和linuxpros.com
的公司托管网站,您可以创建以下目录结构:
/var/www/tryadtech.com/html
/var/www/linuxpros.com/html
在这个例子中,我创建了几层深的目录,所以您可以使用mkdir
命令的-p
标志来创建这些目录及其父目录。
这样,每个站点都有自己的目录,这样可以保持它们的内容分开。每个人都需要读取这些文件,因此我们需要调整权限:
# chmod 755 -R /var/www/<nameofsite>
要创建虚拟主机,我们需要从中创建一个配置文件。在 Debian 上,有一个默认配置文件可以作为起点使用(我将在下一节详细介绍我使用的配置,因此不需要使用此文件)。如果您愿意,可以从以下文件开始:
/etc/apache2/sites-available/000-default.conf
这个文件可以作为创建虚拟主机配置的良好参考点。如果您选择使用它,请将其复制到为虚拟主机创建的目录中:
# cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/tryadtech.com.conf
在 CentOS 上,/etc/apache2/sites-available
目录甚至不存在,所以请创建它。为了告诉 Apache 从这个目录加载站点,我们需要在/etc/httpd/conf/httpd.conf
文件的底部添加以下行:
IncludeOptional sites-available/*.conf
现在,这是一个虚拟主机配置文件的示例。我在我的 Debian 测试系统上将其保存为/etc/apache2/sites-available/tryadtech.com.conf
,但在 CentOS 上,只需将apache2
替换为httpd
。我从之前提到的000-default.conf
文件中取了这个示例文件,为了简洁起见删除了注释行。第一行是原始文件中没有的,第二行被修改了:
<VirtualHost *:80>
ServerAdmin webmaster@localhost
ServerName tryadtech.com
DocumentRoot /var/www/tryadtech.com/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
正如您在这里看到的,我们在tryadtech.com
目录下调用了一个html
目录。为了开发您的站点,您可以将站点文件放入html
目录中,在重新启动 Apache 之后,您应该能够从 Web 浏览器访问该目录。
那么,Apache 服务器如何知道将访问者发送到哪个目录呢?注意我添加到配置文件的ServerName
行。在这一行中,我指定了这个虚拟主机中的文件所属的特定域名。这要求您已经设置并指向了这个 IP 的 DNS。例如,您在域名注册商处的 DNS 条目将把这两个虚拟主机中的每一个指向同一个 IP 地址。当通过tryadtech.com
域名发出请求时,Apache 应该从/var/www/tryadtech.com/html
目录中为用户提供文件。如果您配置了另一个虚拟主机和域名,对该域名也将适用相同的规则。
总结
在本章中,我们设置了一个 Apache 服务器,可以用来在本地内部网络上共享信息,甚至在我们的机器可以外部路由时也可以用于互联网。我们介绍了安装 Apache,自定义它,设置模块,以及设置虚拟主机。
在下一章中,我们将介绍高级网络技术,如子网划分,向 DHCP 和 DNS 添加冗余性以及路由。到时见!
第八章:理解高级网络概念
到目前为止,我们在 Linux 网络管理方面已经覆盖了从规划、设置文件服务器、网络服务等方面的所有内容。现在,当我们接近本书的结尾时,最后几章将通过关于高级网络、安全性甚至故障排除的信息来完善这些知识。在本章中,我们将介绍一些更高级的概念,例如子网划分、路由等!
在本章中,我们将涵盖:
-
将您的网络划分为子网
-
理解 CIDR 表示法
-
实施服务质量(QoS)
-
理解网络地址转换(NAT)
-
路由 TCP/IP 流量
-
创建冗余的 DHCP 和 DNS 服务器
-
配置网络网关
将您的网络划分为子网
除非您运行的是非常小的家庭或办公网络,否则进行子网划分通常是一个好主意。子网划分允许您将网络分割成更小的部分,每个部分都有自己的 IP 地址和资源。例如,可以将无线流量、服务器、工作站和公司发放的移动设备放在各自的子网上。此外,如果您的网络上有任何特定服务接收最多的流量,您也可以将该服务放在自己的子网上。有无限的可能性,每个管理员都会有自己关于最佳网络划分方式的想法。
在第六章中,配置网络服务,我们设置了一个 DHCP 服务器。在其中,我包括了一个使用特定子网动态租用 IP 地址的示例。在该方案中,我们使用的网络是10.10.96.0/22
。这意味着我们可以使用几个网络,包括10.10.96.0
,10.10.97.0
,10.10.98.0
和10.10.99.0
。有了这个网络,我们基本上可以将每个服务划分到自己的网络中。在我们的配置中,10.10.99.0
用于 DHCP。但是,如果您决定这样做,当然可以使用 IP 地址10.10.96.1
到10.10.99.254
。您如何配置您的网络完全取决于您。在该章节中,我们设置了一些将在本章中使用的基础工作。但我们没有讨论如何得出这些数字,或者如何手动分割网络。
子网划分的魔力完全在于子网掩码,尽管大多数人只是匆匆一瞥。对于相当多的网络,子网掩码保持默认值(255.255.255.0
),没有人真正质疑它。如果您从商店购买路由器并在未配置的情况下投入生产(这是个坏主意),您将得到一个 24 位网络和255.255.255.0
子网掩码。但这实际上意味着什么呢?
有两种不同的子网风格,有类和无类。在生产网络中,几乎没有人再提到实际的类,因为现在的子网划分是以无类进行的(稍后详细介绍)。但在我们深入讨论无类网络之前,了解之前的内容是很重要的。在我们讨论子网划分时,我们多次使用了子网掩码255.255.255.0
的示例,这属于被认为是 C 类网络的子网掩码。总共有五个类,A 类到 E 类。D 类和 E 类用途不大,所以我们将坚持使用 A 类到 C 类来讨论有类 IP 地址。
A 到 C 类的子网掩码如下:
类 | 子网掩码 |
---|---|
A | 255.0.0.0 |
B | 255.255.0.0 |
C | 255.255.255.0 |
这些子网掩码对应于 IP 地址的哪一部分被指定为网络,哪一部分被指定为每个单独的节点。例如,假设我们配置了一个网络地址为192.168.50.0
的 C 类网络。这意味着我们的网络有一个子网掩码为255.255.255.0
。与所有 IPv4 IP 地址一样,我们的网络地址有四个八位组:192
,168
,50
和0
。为了说明子网掩码如何影响 IP 地址,我将每个八位组排成一张表:
192 | 168 | 50 | 0 |
---|---|---|---|
255 | 255 | 255 | 0 |
子网掩码的目的是掩盖IPv4 地址的哪些八位组对应于整个网络,哪些对应于单个节点。每个八位组中可能的最大数字是255
。如果子网掩码中的一个八位组设置为255
,那么它将占据整个八位组,因此将其取消。在这种情况下,每个节点的 IP 地址将以192.168.50
开头,因为前三个八位组被取消了。请注意,网络地址和子网掩码的最后一个八位组都是零。在 IPv4 网络中,0
表示任何内容。因此,子网掩码的最后一个八位组为0
告诉我们它不关心该八位组,而网络地址为0
表示它也不关心。因此,最后一位的任何数字都是可以的。
在我们的情况下,从192.168.50.0
到192.168.50.255
的 IP 地址属于这个网络(子网)。嗯,几乎是。如果我们的子网掩码是255.255.255.0
,我们就不能以分配192.168.50.0
IP 地址开始我们的 DHCP IP 范围。这是因为子网的第一个 IP 地址不能分配给节点。第一个 IP 地址被指定为网络标识符并被保留。在一个 C 类网络中,IP 地址192.168.50.0
是无效的,因为它确实是该子网中的第一个地址。
另一个不能分配给任何节点的 IP 地址是子网的最后一个 IP。在我们的 C 类示例中,那将是192.168.255.255
。这个 IP 地址被称为广播地址,也是保留的。如果需要向整个网络发送广播消息,就会使用广播地址。考虑到这一点,在我们的示例中使用的 C 类网络中,我们的 DHCP 范围的最大值是192.168.50.1
到192.168.50.254
。
你可能想知道广播地址的目的。如前所述,它允许将数据包发送到整个网络。在实践中,网络服务,如 DHCP,利用广播。当你第一次将计算机插入以太网电缆(一个没有静态 IP 的计算机),它会发送一个广播消息请求 IP 地址。在连接之前,它不知道你的 DHCP 服务器的 IP 地址是什么。它可能是192.168.1.1
,甚至是192.168.1.100
。它完全不知道。通过发送广播消息,负责 DHCP 的任何服务器都应该能够听到请求并做出响应。
那么,为什么在上面的例子中选择了 IP 地址192.168.50.0
?那个数字只是随机选择的,以便说明子网掩码如何影响可用的 IP 地址。我们可以使用172.16.254.0
作为我们的网络地址,并且使用 C 类子网掩码255.255.255.0
,这仍然会给我们相同数量的可用 IP 地址(254)。在第二个例子中,我们仍然声明了一个 C 类网络,但只是使用了不同的 IP 方案。由于你正在管理一个内部网络,你可以选择任何你想要的编号系统。只要你的 IP 地址不是公共可路由的,只要你不在任何八位组中使用大于 255 的数字,或者在网络中使用第一个或最后一个 IP 地址,那么你可以使用任何数字。还有一些其他 IP 地址我们不能使用,但我们稍后会讨论。
为了更好地理解这是如何工作的,我们需要重新讨论子网掩码。如前所述,子网掩码有助于确定 IP 地址方案的哪一部分属于各个节点,哪一部分属于网络本身。可以这样理解。子网掩码中的 255 是子网掩码或 IP 地址中任何八位中可能的最大数字。子网掩码中的每个 255 代表一个不会改变的数字。因此,如果您有一个 IP 地址10.19.100.24
和一个子网掩码255.255.255.0
,您可以立即知道这个网络的前三个八位永远不会改变。这意味着该子网的每个主机都将具有以10.19.100
开头的 IP 地址。如果子网掩码是255.255.0.0
,将有更多的 IP 地址可用,因为最后两个八位是可用的。这实际上将给我们提供 65,534 个 IP 地址。前者只允许我们使用 254 个 IP 地址,因为最后一个八位是唯一可以改变的,其最大数字是 255(减去一个广播地址)。
但您可能已经注意到,我使用了一个 Class A IP 地址的例子(10.19.100.24
),但我使用了一个 Class C 子网掩码(255.255.255.0
)。这是有效的吗?当然!尽管通常约定的类结构,子网掩码的唯一目的是帮助您理解哪一部分是主机,哪一部分是节点。因此,255.255.0.0
和255.255.255.0
的子网掩码对于这个网络都是有效的。
然而,一些 IP 地址并不被认为是适用于各个类别的有效地址。虽然具有子网掩码为255.255.255.0
的内部 IP 网络253.221.96.0
符合所有这些规则,但它并不被认为是 Class C 网络的有效地址。如果您只在网络内管理 IP 地址,它可能有效,也可能无效。因此,对于经典风格中的每个类别,都有一个推荐的方案可供选择。我将在下表中说明:
类别 | 起始 IP | 结束 IP |
---|---|---|
A | 0.0.0.0 |
127.255.255.255 |
B | 128.0.0.0 |
191.255.255.255 |
C | 192.0.0.0 |
223.255.255.255 |
注意
与所有网络相关的事物一样,这里也有一个需要牢记的例外,您不能将127.0.0.0
或127.0.0.1
分配给任何东西,因为这是指您的本地环回适配器。
事实上,使用以10
开头的 IP 地址范围在 Class A 方案中是非常常见的,这就是我们在本书早期设置 DHCP 服务器时所做的。在那个例子中,我们使用了10.10.96.0
网络。但是如果您回忆起来,我们没有使用 Class C 子网掩码255.255.255.0
,而是使用了255.255.252.0
。这个区别将直接引导我们进入下一个主题 CIDR。
理解 CIDR 表示法
正如我之前提到的,经典子网划分的概念现在并不经常使用。经典子网划分的主要用途是网络设备(如路由器)的默认配置,以及大多数 DHCP 服务器的默认设置。在家用路由器的情况下,DHCP 服务器通常是内置的,默认方案通常是 Class C 网络(通常为192.168.1.0
,中间有几个变化)。但对于大多数设备,家庭或企业,如果您不将其更改为其他内容,您可能会得到一个 Class C IP 方案。在小型网络中,这些默认设置并没有什么问题,但是几乎没有人在配置网络时使用经典风格。原因是经典网络太过限制;在复杂的网络部署中,强迫您的网络计划适应这些预定方案可能会很麻烦。
在有类别的方案中缺乏灵活性的答案是无类别域间路由(CIDR)。使用 CIDR,我们基本上抛弃了类 A、B 和 C 子网掩码的限制。相反,我们使用二进制系统来确定如何划分我们的网络。因此,我们不再仅使用三种不同的子网掩码,我们可以借用位并更灵活地改变子网掩码以划分网络。
要理解这个概念,首先要理解位的概念。子网掩码中的每个八位组包含八位。每一位都是1
或0
(二进制)。此外,这八位中的每一位都有一个值。为了说明这一点,拿数字255
来说。这是任何八位组的最大值。用二进制写,255
是11111111
。因此,一个类 C 子网掩码255.255.255.0
用二进制写就是11111111.11111111.11111111.00000000
。
为了更容易理解,看看下表,我在其中概述了四个插座(255
)之一,并以二进制形式显示出来。在这个表中,顶部行给出了每个位的点值。你可以看到最右边的位只值1
,而最左边的位值为128
。底部的任何位是1
都会被加起来。在这种情况下,每个位都是1
(因为255
是最大值),所以我们把顶部行的每个数字加起来,得到255
。
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
另一个例子,参见以下表:
128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
---|---|---|---|---|---|---|---|
1 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
要将这个数字转换成十进制,从右边开始,向左移动。第一位是 0。它是否符合 1 的点值?不符合。跳过。接下来,它也不符合 2、4 或 8。所以跳过这些。但它确实符合最后四位,16、32、64 和 128。把它们加在一起。答案是 224。你刚刚把二进制数1111000
转换成了十进制。
我们可以在子网掩码中使用1101000
吗?不行。原因是因为子网掩码中的 1 必须是连续的。以下是子网掩码中所有有效的二进制数:
00000000
10000000
11000000
11100000
11110000
11111000
11111100
11111110
11111111
实际上,就是这样。由于任何 1 必须是连续的(从左到右开始),这些是子网掩码中任何八位组的唯一有效数字。因此,子网掩码的任何八位组的唯一有效十进制值是 0、128、192、224、240、248、252、254 和 255。
注意
如果将 IP 地址转换为二进制,你会按照之前的表中的点值进行转换,尽管连续 1 的规则不适用。IP 地址中的任何数字从 0 到 255 在任何八位组中都是有效的,每个八位组中的 1 和 0 的任何组合也是有效的。
要对网络进行子网化,我们只需改变连续 1 的数量。例如,255.255.255.0
的二进制表示是11111111.11111111.11111111.00000000
。我们可以在这个掩码中添加一个额外的 1,得到11111111.11111111.11111111.10000000
,这给我们一个子网掩码为255.255.255.128
。使用这个子网掩码,我们能够将我们的网络分成两部分。让我们来分解一下。
正如我多次提到的,子网掩码的目的是掩盖IP 地址的哪一部分是网络的,哪一部分是个体节点的。正如我们已经知道的,子网掩码为255.255.255.0
意味着前三个八位组不能使用,但我们可以使用最后一个为 0。如果我们将这个子网掩码应用到10.10.10.0
网络,我们可以知道每个主机的 IP 地址都是10.10.10.x
。最后一个八位组是 0,它告诉我们 IP 地址10.10.10.1
到10.10.10.254
是可用的。同样,我们不能使用子网的第一个 IP(在这种情况下是10.10.10.0
)或最后一个(10.10.10.255
),因为它们分别对应网络标识符和广播地址。
但是,对于一个子网掩码并不以 0 结尾的情况,我们该怎么办呢?对于子网掩码为255.255.255.128
,最后一个八位组被使用但没有耗尽,因为它不是 255 的最大值。我们还有一些剩余。这是因为当一个八位组在子网掩码中不是 255 时,它并没有完全屏蔽掉该八位组。相反,它创建了一个分割线。如果我们将该子网掩码应用到我们的10.10.10.0
网络上,IP 地址10.10.10.128
就不能使用。我们已经将最后一个八位组分成了两半。记住,八位组中的值从 0 到 255 都是有效的;因此,256 个可用数字的一半是 128。考虑到这一点,我们创建了一个方案,其中我们有两个网络。一个网络包含 IP 地址10.10.10.1
到10.10.10.126
。另一个允许我们使用 IP 地址10.10.10.129
到10.10.10.254
。之所以这样做是因为10.10.10.128
是我们子网的分割线,不能使用。我还提到了块内的第一个和最后一个 IP 地址也不能使用,因为10.10.10.0
和10.10.10.128
是每个网络的标识符。每个块中的最后一个 IP 地址分别是10.10.10.127
和10.10.10.255
,因为这些现在是这两个网络的广播地址。如果我们以 CIDR 格式写出这些网络,我们会得到以下结果:
10.10.10.0/25
10.10.10.128/25
记住,我们计算子网掩码中连续的 1 的数量,以达到最后的斜杠数字。我们可以将其写成以下形式,但我相信你会同意 CIDR 更容易输入:
10.10.10.0/255.255.255.128
10.10.10.128/255.255.255.128
在二进制中,该子网掩码是11111111.11111111.11111100.00000000
。因为有 25 个 1,这个子网掩码的 CIDR 表示法是 25。希望现在这个概念已经讲清楚了。
至于我们的无类别样式,没有什么能阻止你使用诸如255.255.255.0
这样的子网掩码。并不是每个人都需要大量的主机。但是,我们不再称之为类 C 子网掩码,而是在 CIDR 样式中我们会称之为/24
网络。在表中,我列出了在讨论有类别网络时使用的子网掩码,以及它们的 CIDR 等效。
类别 | 子网掩码 | CIDR 表示法 |
---|---|---|
A | 255.0.0.0 | /8 |
B | 255.255.0.0 | /16 |
C | 255.255.255.0 | /24 |
既然我们了解了子网划分的工作原理,那么我们如何在我们的网络中实施呢?幸运的是,这部分很容易。实施子网的魔力都在于你的 DHCP 服务器。如果你还记得,在第六章中,配置网络服务,我们在 DHCP 服务器的/etc/dhcp/dhcpd.conf
文件中使用了以下配置:
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
option domain-name "local.lan";
authoritative;
subnet 10.10.96.0 netmask 255.255.252.0 {
range 10.10.99.100 10.10.99.254;
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
}
在第一行粗体字中,我为从该服务器接收 IP 地址的每个节点提供了一个子网掩码为255.255.252.0
。在代码块的末尾,我决定从10.10.99.100
到10.10.99.254
发放 IP 地址。因此,每个节点将收到一个10.10.99.x
的 IP 地址和一个255.255.252.0
的子网掩码。
实施子网方案时唯一剩下的事情就是确保每个具有静态 IP 地址的服务器或设备也被更改。除非你使用了静态租约(也称为保留),否则你将不得不手动找到这些主机并进行更改。因此,我总是更喜欢静态租约而不是静态 IP。使用静态租约,你只需要编辑 DHCP 配置并更改分配给你的主机的 IP。参考第六章中我们是如何设置我们的保留的。
实施服务质量
并非所有的网络流量都是平等的,也并非所有的服务都同等重要。有时,网络需要对某些服务给予比其他服务更紧急的处理。也许在服务器环境中,您的 Web 服务器从访问者那里接收到大量流量,并且必须优先考虑 MySQL,或者您的办公室使用VoIP(即IP 电话)并需要优先考虑电话系统。您的网络可能有许多原因需要对某项服务给予比其他服务更紧急的处理。服务质量(QoS)帮助我们实现这一点。
虽然有多种调整网络适配器以实现 QoS 的方法,但最典型的是所谓的排队规则(或更简单地说,qdisc)。排队规则是管理员可以应用于网络适配器的一种方法,以使用多种调度程序中的一种,每种调度程序对流量处理方式有不同的影响。要查看您的网络适配器当前使用的调度程序,请运行以下命令:
ip link list
查找您的默认网络卡,很可能是eth0
(在 Debian 中)或eno1
(在 CentOS 中)或类似的。
在 Debian 中查看 IP 链接列表的输出
最有可能,您会在输出中看到qdisc pfifo_fast
,这告诉我们当前使用的排队规则是pfifo_fast
。这基本上是一个先到先服务的调度程序(先进先出)。但pfifo_fast
不是包含一个带宽,而是包含三个——每个都将流量分为三个优先级。第一个带宽(带宽 0)包含最高优先级的流量。除非您的发行版更改了默认调度程序,否则pfifo_fast
很可能是您系统中默认使用的。
pfifo_fast
调度程序被称为无类调度程序。换句话说,你看到的就是你得到的——在处理无类调度程序过滤流量时不需要进行任何配置。其他无类规则包括随机公平 排队(SFQ)、扩展随机公平排队(ESFQ)和令牌桶过滤器(TBF)。
SFQ qdisc 使用了我们之前提到的 FIFO 的概念,但将网络流量分成多个 FIFO,并以循环方式处理。这种 qdisc 试图尽可能公平地使用流来调度数据包传输。这使得每个流都有机会传输,防止任何一个流变得过度饱和。ESFQ 非常相似,但它为管理员提供了更多配置选项。与 SFQ 不同,TBF 实际上不会操纵数据包,也不会进行任何调度。TBF 的主要目的是设置传输速率,允许您设置参数,如速率、突发、峰值速率等。有关这些 qdisc 的更深入信息,请参阅sfq
和tbf
的主页。通过tc
命令可以在网络适配器上设置首选的 qdisc。请参阅以下示例,设置以太网适配器eno1
上的sfq
:
# tc qdisc add dev eno1 root sfq perturb 60
在这里,我们使用tc
命令与qdisc
,并澄清我们想要add
(我们也可以del
)一个 qdisc。我们将对接口eno1
执行此操作,并请求将此更改应用于出口(root
),同时针对我们的接口使用sfq
qdisc。最后,我们设置我们的 qdisc 特定参数(在本例中为pertub
)。perturb 参数允许我们设置此 qdisc 的哈希算法将被重置的秒数。我们可以更改其他特定于 sfq 的值,如使用的流数、量子、redflowlimit 等。请参阅man sfq
,了解可以与 sfq 或 tbf 一起使用的参数的完整描述。
无类 qdisc 的概念存在不足之处,即它们不允许你像人们希望的那样对流量进行细致的分类。虽然改变数据包的调度方式肯定是有用的,但这个概念不允许你在任何给定时间选择哪种类型的流量优先级。有类 qdisc 解决了这个问题,并给管理员更多的灵活性。通过这些,你可以设置父类和子类,每个都有不同的规则。事实上,这是有类和无类 qdisc 之间的主要区别。无类 qdisc 并不是完全不可配置;它们只是没有支持高级用例灵活性的选项。接下来,我们将探讨有类 qdisc 以及它们如何为我们提供这种额外的灵活性。
通过利用有类 qdisc 的强大功能,你几乎完全控制了网络上数据包的处理方式。我说几乎是因为重要的是要记住,排队规则的概念只影响出站流量(出口),而对于管理入站流量几乎无能为力。然而,在生产网络中,保证特定服务一定数量的带宽是非常有益的。正如我们在前一节中讨论的,无类 qdisc 允许我们管理数据包处理的一般方式,但有类 qdisc 通过设置类别和过滤器为我们提供了更多的控制。
你可能会遇到的一个可能情况是 VoIP 流量变得不稳定,导致通话听起来模糊或完全中断。在这种情况下,你可能希望为你的 VoIP 服务器保证更多的带宽,即使这意味着牺牲来自其他来源的流量。此外,在 Linux 网络中,SSH 也很重要。如果你的服务器被数据包淹没,甚至无法响应通过 SSH 连接到它的请求,那可能是一个非常严重的问题,因为你将无法登录并纠正可能出现的任何问题。这些是许多人在没有优先处理流量的情况下面临的非常真实的情况。如果有一个你的网络或公司依赖的服务,优先处理它是一个很好的措施。
实现这一点最流行的 qdisc 是分层令牌桶(HTB),这是一个有类 qdisc。HTB 允许你控制设备上使用的出口带宽,它基于我们之前讨论的 TBF 风格。HBT 具有一些可以用来控制流量的类,比如设置parent
、priority
、rate
、ceil
和字节的突发数量。查看man htb
以查看完整的列表。
就像我们配置无类 qdisc 一样,类似 HTB 的有类 qdisc 的设置也是通过tc
命令完成的。在大多数系统上,这个命令存储在/sbin
中,可能不在常规用户的路径中。输入which tc
来定位这个二进制文件在你的发行版上的位置。在大多数情况下,如果以 root 用户登录时运行此命令,系统应该能识别这个命令。接下来是一个设置 HTB 作为名为eth0
的网络设备的 qdisc 的过程示例。
# tc qdisc add dev eth0 root handle 1: htb default 10
# tc class add dev eth0 parent 1: classid 1:1 htb rate 2mbit
# tc class add dev eth0 parent 1:1 classid 1:10 htb rate 1mbit ceil 1.5mbit
# tc class add dev eth0 parent 1:1 classid 1:20 htb rate 100kbps ceil 100kbps
在第一个命令中,我们将 qdisc 从默认的pfifo_fast
更改为htb
。在这个命令中,root
表示我们正在设置这个出口流量。1:
的句柄是对htb
的这个特定实例的名称。将默认设置为10
意味着任何没有特别分类的流量将被赋予1:10
的类别 ID。通过第二个命令,我们创建了类别 ID1:1
,并将其调整为使用速率2mbit
。在第三个命令中,我们做了同样的事情,只是我们创建了一个 ID 为1:10
的类别,并设置了一个上限,这将限制这个类别为1.5mbit
。因为我们将默认设置为10
,所以如果我们没有特别指定流量使用其他类别,就会使用这个类别。最后,我还加入了第三个类别1:20
,它的上限要低得多,为100kbps
。通过将rate
和ceil
值设置为相同的值,我们可以合理地期望这个类别的流量消耗100kbps
,但也受到100kbps
的限制。您可以继续使用这种方法向1:
父类添加额外的类别,根据需要将带宽分割成多个类别。
现在我们已经确定了我们的类别,我们应该开始使用它们。通过我们之前的例子,您可能会注意到您的带宽现在比之前少了(假设您的带宽高于我们设置的1.5mbit
的默认值)。但我们的其他两个类别没有使用,因此我们可以根据需要提高或限制其他服务的带宽。因此,让我们为 SSH 添加一个过滤器。由于 SSH 不需要大量带宽,我们可以将我们的1:20
类别分配给它。为此,我们将再次使用tc
命令:
# tc filter add dev eth0 parent 1: protocol ip prio 7 u32 match ip sport 22 0xfff classid 1:20
注意
可以更改服务器用于 SSH 连接的端口,我们将在第九章保护您的网络中讨论。如果更改了 SSH 端口,请相应调整tc
命令。
这留下了两个类别,1:1
和1:10
。我们也可以根据需要为它们分配过滤器,具体取决于我们想要为流量分类的端口:
# tc filter add dev eth0 parent 1: u32 match ip sport 80 0xfff classid 1:1
# tc filter add dev eth0 parent 1: u32 match ip sport 5060 0xfff classid 1:10
在这里,我使用端口80
和5060
分别用于 HTTP 和 VoIP 流量。您的端口可能不同,因此可以根据您的网络需求自由调整命令。但在这个假设的例子中,端口80
上的流量将被分类为1:1
,并被授予最大速率为2mbit
(非常适合 Web 服务器),端口5060
上的流量将被授予1.5mbit
。
总之,无类 qdisc 允许您控制系统上如何管理数据包的一般共识。根据您的环境,您可能会发现切换到无类 qdisc 会提高性能。但真正的好处在于有类 qdisc,它允许您更加精细地控制数据包的处理方式,以及服务器资源提供的速率。调整网络性能是一项耗时的任务,需要通过试错来确定哪些值、类别和过滤器会提高网络性能。
路由 TCP/IP 流量
网络的整个目的是将流量从 A 点传输到 B 点。当一台计算机从另一台计算机请求信息时,数据包被路由到目的地,然后返回。有时,计算机需要一点指导,以确定如何将数据包传输到目的地。这就是所谓的路由。为了帮助实现这一点,节点利用路由表的概念来决定特定目的地应该发送数据包的位置。如果每个网络都使用相同的 IP 方案,那将会非常容易,但事实上,每个网络都是完全不同的。要与不同的网络通信,您的计算机必须知道如何到达该网络。可以将路由表视为外部目的地和到达这些目的地的网关的地图。
为了更好地理解这一点,让我们也谈谈默认网关的概念。通常,默认网关是一个理解如何与其他网络通信的路由器。当您在网络上发送信息请求时,数据包会经过本地默认网关,然后从那里进入其他网络。在小型办公室或家庭网络的情况下,默认网关很可能是位于您的网络和世界其他部分之间的路由器。此外,它还位于您的本地设备和网络内所有其他设备之间。如果没有默认网关,您很可能无法在网络上进行通信。
要查看您的默认网关,请发出ip route
命令,并查找读取default via
的行。
ip route 命令的输出
如果没有默认网关(或者默认网关没有正确配置),您可能会发现无法与网络上的其他节点进行通信。在大多数情况下,一旦通过 DHCP 接收到地址,默认网关就会添加到您的路由表中。如果您使用静态 IP 配置,您可以通过/etc/network/interfaces
在 Debian 中手动设置默认网关,或者在 CentOS 中通过网络卡的 init 脚本(例如/etc/sysconfig/network-scripts/ifcfg-eno1
)。以下是这些配置文件的示例,其中突出显示了相关行:
/etc/network/interfaces
文件(Debian):
iface lo inet loopback
allow-hotplug eth0
iface eth0 inet dhcp
# The primary network interface
allow-hotplug eth1
iface eth1 inet static
address 10.10.96.1
netmask 255.255.252.0
gateway 10.10.96.1
broadcast 10.10.96.255
dns-search local.lan
dns-nameservers 10.10.96.1
/etc/sysconfig/network-scripts/ifcfg-eno1
文件(CentOS):
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
NAME=eno1
UUID=8e6587dd-74ec-488f-8597-a04c4a4c5091
DEVICE=eno1
ONBOOT=yes
IPADDR="10.10.96.4"
NETMASK="255.255.252.0"
GATEWAY="10.10.96.1"
如果您想要比那更手动地设置默认网关,您也可以通过终端使用 shell 命令来执行此操作,如下所示:
# route add default gw 10.10.10.1 eth0
注意
如果您的系统不识别 route 命令,则需要安装net-tools
软件包。
足够简单。我们使用 route 命令来添加新路由;在这种情况下,我们正在添加我们的默认网关(default gw
)。在这种情况下,我们将该网关设置为10.10.10.1
并将其绑定到接口eth0
。可能不用说,但一旦重新启动此计算机或重新启动网络,除非通过更新接口卡的init
脚本使其永久化,否则此设置可能会丢失,正如我们之前讨论的那样。
要查看您的路由表,只需执行route -n
命令而不带任何参数。如果找不到该命令,您可能需要调用路径(例如/sbin/route
)或以 root 身份运行它。当您执行此命令时,您将看到路由表。这也将显示您的默认网关。
route -n 命令的输出
在讨论此表时,首先要讨论的是0.0.0.0
的 IP 地址。在网络方面,这指的是一切。正如您在前面的示例中所看到的表中所示的,目的地0.0.0.0
的网关在这个网络上是192.168.1.1
。因此,任何通信都会发送到这个 IP(毕竟,这是默认网关)。在此表中还显示了其他网络。在我的情况下,它们指的是在此测试机器上运行的 Docker 实例以及 KVM 虚拟化,并且每个都有自己独立的虚拟网络。由于它们都在同一台机器上运行,它们的网关是本地的:0.0.0.0
。
Linux 机器可以很容易地充当路由器,而无需来自诸如思科公司等公司的昂贵网络设备。这种灵活性使 Linux 成为网络的一个非常突出的选择,基于 Linux 的硬件路由器变得非常普遍。这至少部分是因为配置 Linux 系统成为路由器是多么容易。简而言之,将 Linux 节点变成路由器所需的只是多个网络接口卡。每个接口卡都可以有自己的默认网关,因此你实际上可以像我们在本节前面为eth0
添加默认网关一样配置路由。你只需对eth1
、eth2
或者系统上其他任何接口执行相同的操作。
然而,有一个例外。对于大多数 Linux 发行版,默认情况下通常禁用网络接口之间的路由。在我职业生涯的早期,这给你的作者带来了很多痛苦和挫折,直到这一点变得众所周知,所以我会为你节省麻烦,并向你展示如何在 Linux 系统上启用网络接口之间的路由。
首先,看看这是否已经为你完成。虽然我发现许多发行版默认情况下不启用转发,但有些发行版会启用。检查这一点很容易:
cat /proc/sys/net/ipv4/ip_forward
那个命令的输出是什么?是1
吗?如果是,那就没问题了。如果不是,我们需要进行更改。要做到这一点,只需将值替换为 1(作为 root):
echo 1 > /proc/sys/net/ipv4/ip_forward
就是这样,你完成了。你刚刚启用了网络接口之间的路由(转发)。这并不难。但是,我想你可能更希望这是一个永久性的改变。一旦重新启动系统,这个设置很可能会恢复到默认值。要使这个改变永久生效,用你喜欢的文本编辑器(作为 root)编辑/etc/sysctl.conf
,并在文件末尾添加以下行:
net.ipv4.ip_forward = 1
现在,无论何时重新启动系统,你都将保留这个设置。在我让你做的所有网络调整中,这绝对是最容易的。
最后,让我们花一点时间来讨论网络地址转换(NAT)。NAT 的概念是改变那些目的地是一个主机的数据包,并改变它们的目的地,使其变成其他东西。这种改变实际上是通过改变数据包本身来完成的,对于管理网络路由来说非常有用。NAT 最常见的用途是保留 IP 地址,尤其是考虑到当前 IPv4 地址短缺的情况下。如果你家里有一台路由器,你可能已经很熟悉这个概念了。你的互联网服务提供商(ISP)给你一个 IP,这个 IP 就是世界其他地方看到你的 IP。但是在你的本地网络中,你可能有十几个设备连接并使用同一个互联网连接。你的每个内部设备都有一个由本地 DHCP 服务器分配的 IP 地址,但这个地址只是本地的,不能路由到外部世界。在这种情况下,你的路由器会跟踪每个设备收发的数据包,并改变数据包,使它们不会混淆,并最终到达正确的位置。
例如,假设你有一台笔记本电脑和一台台式机(在同一个网络上),你在笔记本电脑上访问www.packtpub.com/
。你的路由器将请求发送到互联网,并传递结果。基本上,你的路由器代表你的笔记本电脑发出请求。当来自www.packtpub.com/
的返回数据包到达时,数据包的目的地地址会从你的公共 IP 地址更改为请求信息的机器的 IP 地址。这样,你可以相当肯定你的笔记本电脑会得到回复,因为它是最初发出请求的那个。
NAT 的概念很聪明,这甚至不是唯一的用例。您甚至可以手动更改目标地址,这可以帮助您将数据包发送到内部计算机原本无法路由到的其他网络。要手动更改 NAT,我们使用ip rule
命令。利用这个命令只是根据流量的来源改变目的地。考虑以下示例:
# ip rule add nat 10.10.10.1 from 192.168.1.134
这再简单不过了。在这里,我们告诉我们的系统查找任何来自192.168.1.134
的数据包,并将其重写为流向10.10.10.1
。对于您需要执行的任何其他NATing,请重复此操作。
创建冗余的 DHCP 和 DNS 服务器
在第六章中,我们设置了 DHCP 和 DNS 服务器。这很好,但不幸的是有一个主要问题。任何一个都是单点故障。如果 DHCP 服务器崩溃,新设备将无法接收 IP 地址,并且当前连接的客户端将在其当前 IP 租约到期时从网络中断开。如果 DNS 服务器崩溃,客户端将无法通过主机名到达目的地。根据您的网络范围,这种停机时间可能很难处理,因此为这些服务提供冗余可能是一个好主意。
配置了另一台服务器进行冗余的 DHCP 服务器将同步其已发出的 IP 地址列表,并且每台服务器都会检测另一台服务器是否停止响应。在这种情况下,备用服务器将接管发放新的 IP 地址的任务。对于 DNS,只需在网络上添加另一台 DNS 服务器,但我稍后会详细讨论这个问题。
让我们从向我们的 DHCP 服务器添加冗余开始。之前创建的初始服务器可以简单地视为主服务器。接下来要做的是创建另一台服务器作为辅助服务器。这可以是另一台物理服务器,甚至是虚拟机,选择权在你。安装isc-dhcp-server
,就像我们在第六章中讨论的那样,配置网络服务。一旦你有了第二台服务器,我们就可以开始了。
注意
在将 DHCP 服务器投入生产之前,务必确保两台 DHCP 服务器的时钟同步。在继续之前,最好再次检查两者上是否配置了 NTP 并且正常工作。在第六章中,包括了有关设置 NTP 的信息。
从我们的主节点开始,我们应该向我们的/etc/dhcp/dhcpd.conf
文件添加一些额外的代码。我已经加粗了新的配置行,以实现冗余:
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
option domain-name "local.lan";
authoritative;
failover peer "dhcp-failover" {
primary;
address 10.10.96.2;
port 647;
peer address 10.10.96.1;
peer port 647;
max-response-delay 60;
max-unacked-updates 10;
load balance max seconds 3;
mclt 3600;
split 128;
}
subnet 10.10.96.0 netmask 255.255.252.0 {
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
pool {
failover peer "dhcp-failover";
range 10.10.99.100 10.10.99.254;
}
}
注意
请注意,以下行已被删除:
range 10.10.99.100 10.10.99.254;
它被同一部分中的{}
块替换了。
在很大程度上,我们在主服务器上做的相同配置可以复制到辅助服务器上。请随意使用我们在这里的/etc/dhcp/dhcpd.conf
文件作为在第二台服务器上开始配置的基础。我将再次强调两者之间的不同之处。代码如下:
default-lease-time 86400;
max-lease-time 86400;
option subnet-mask 255.255.252.0;
option broadcast-address 10.10.99.255;
option domain-name "local.lan";
authoritative;
failover peer "dhcp-failover" {
secondary;
address 10.10.96.1;
port 647;
peer address 10.10.96.2;
peer port 647;
max-response-delay 60;
max-unacked-updates 10;
load balance max seconds 3;
}
subnet 10.10.96.0 netmask 255.255.252.0 {
option routers 10.10.96.1;
option domain-name-servers 10.10.96.1;
pool {
failover peer "dhcp-failover";
range 10.10.99.100 10.10.99.254;
}
}
注意
从辅助服务器的配置中删除了以下行:
mclt 3600;
split 128;
你应该注意到主要和次要的地址在每个配置文件中是颠倒的。在第一个配置文件中,主要是10.10.96.1
,次要设置为10.10.96.2
。在第二个配置文件中,这被更改为10.10.96.2
和10.10.96.1
。此外,要特别注意 IP 地址、子网掩码和任何其他值,这些值可能会因网络而异。如果你在两台服务器上启动 DHCP 服务(在 Debian 上是isc-dhcp-server
,在 CentOS 上是dhcpd
),你应该看到它们通过日志进行通信。要检查的具体日志将在基于 Debian 的系统中是/var/log/syslog
,在 CentOS 系统中是/var/log/messages
。你可以很容易地测试这是否有效,方法是在其中一台服务器上禁用 DHCP 服务,然后你应该看到另一台服务器代替它发放 IP 地址。
现在我们已经为 DHCP 配置了冗余,让我们为 DNS 做同样的事情。事实上,这要容易得多。你所需要做的就是指定另一台服务器作为你的次要 DNS 服务器(你可以创建一台新的机器,或者只是将它添加到你的次要 DHCP 服务器),然后将你的配置文件和区域文件复制到新的服务器上。同样,第六章,“配置网络服务”,包含了这些文件的所有相关细节。如果你想节省一些时间,甚至可以将你的原始 DNS 服务器克隆到一台新的机器上,如果你使用虚拟化或了解如何使用dd
命令,这是很容易做到的。无论你喜欢使用哪种方法来创建次要服务器并复制你的区域文件,都要测试 DNS 是否在新服务器上工作。一旦它工作了,我们就回到我们的 DHCP 配置,将这个次要服务器部署到我们所有的节点上。
在我们的/etc/dhcp/dhcpd.conf
文件中,查找以下行:
option domain-name-servers 10.10.96.1;
将其更改为以下内容:
option domain-name-servers 10.10.96.1, 10.10.96.2;
你完成了。现在,每当你的客户的租约到期或他们请求一个新的 IP 地址时,他们将自动获得次要 DNS 地址。
在这一点上唯一剩下的事情就是配置你可能设置了静态 IP 地址的任何节点来使用次要 DNS 服务器。正如我现在已经提到过大约一千次,出于这个原因和更多原因,我非常喜欢静态租约(为 DHCP 服务器上的各个节点保留 IP 地址)而不是手动静态 IP 分配。你只需要在 DHCP 服务器中配置它们。但是,如果你有任何你手动配置了网络的节点(各有各的方式),只需更新它们的init
脚本。同样,你会在/etc/network/interfaces
(Debian)或/etc/sysconfig/network-scripts/<if-name>.cfg
(CentOS)中找到这个配置。
总结
在我们的旅程中的这一点上,你的网络应该处于更好的状态。在本章中,我们完成了相当多的工作。我们讨论了诸如路由、NAT、子网划分、服务质量等高级主题,甚至为我们的 DHCP 和 DNS 服务器设置了冗余。如果我们了不起的网络发生了什么事情,那真是太遗憾了。这就是为什么在下一章中,我将介绍如何加强我们网络的安全性。到时见!
第九章:保护您的网络
安全漏洞和利用它们的不法分子无处不在。在典型网络上运行的软件中包含数百万行代码,从统计上讲,要想百分之百地安全防范所有可能的威胁是不可能的。然而,一个好的网络管理员会关注网络安全的当前趋势,并采取一切可能的预防措施,以确保网络尽可能安全。在本章中,我们将探讨一些可以增加网络安全性的方法。
在本章中,我们将涵盖:
-
限制攻击面
-
保护 SSH
-
配置 iptables 防火墙
-
使用 fail2ban 保护系统服务
-
了解 SELinux
-
配置 Apache 以利用 SSL
-
部署安全更新
限制攻击面
网络安全的最重要规则是限制攻击面。简而言之,这意味着您安装的软件越少和/或运行的服务越少,就越不容易被利用。更糟糕的是,在某些情况下,服务器软件中的未修补漏洞可能允许不法分子使用您的服务器来攻击其他人。通过限制系统中使用的软件包的数量,您降低了发生不良事件的可能性。
这听起来很简单,而且确实如此,但重要的是要记住,这不仅仅是安装您需要的软件。许多 Linux 发行版都附带了您可能永远不需要使用的软件。这不仅适用于服务器。即使您的最终用户工作站可能运行着不必要的服务,这对攻击者来说将是一个宝藏。一个常见的例子是在系统上运行邮件传输代理(MTA)。令人惊讶的是,许多 Linux 发行版默认情况下都运行着 MTA。除非您明确需要 MTA(例如,您安装了需要向管理员发送电子邮件的脚本),否则应该从系统中删除这些软件包。
在任何网络上部署 Linux 时,您应该首先找出安装了什么以及正在运行什么,然后决定关闭和/或卸载什么。这就是所谓的限制攻击面。的确,Linux 是最安全的系统之一,但如果您不注意系统上正在运行和监听网络连接的内容,那么什么也帮不了您。在本节的其余部分,我将介绍一些限制攻击面的方法。
首先,让我们打印出系统上安装的所有软件包的列表。这将使我们能够看到安装了什么,然后我们可以删除任何突出显示的我们确定不需要的东西。这个列表可能会很长,因为它将包括一切; 我是指一切-甚至是让我们的系统运行的库和各种软件包。您肯定不会理解每个软件包的用途,但随着您对 Linux 的了解越来越多,您将更加理解这些内容,并知道需要删除什么。例如,我知道要从所有的安装中删除exim
或postfix
软件包,因为我个人在任何地方都不需要它们。由于您不会理解系统上安装的所有软件包的用途,我建议您快速查看并删除您确定不需要的软件包。要打印已安装软件包的列表,请运行以下命令之一:
对于基于 Debian 的系统,请执行以下命令:
# dpkg --get-selections > installed_packages.txt
对于 CentOS 系统,请执行以下命令:
# rpm -qa > installed_packages.txt
无论哪种情况,您最终都会在当前工作目录中得到一个名为installed_packages.txt
的文本文件。这个文本文件将包含您系统上安装的所有软件包的列表。请随意检查它,看看是否有什么可以删除的内容。此外,这个文件也可以作为一个方便的备份。如果您需要停用一个服务器并设置一个具有类似目的的新服务器,您可以将一个服务器的软件包与另一个服务器进行比较,以确保正确的软件包已安装。
另一个发现系统上正在运行的内容的好方法是使用netstat
命令。虽然我们将在第十章中进一步讨论这个命令,故障排除网络问题,现在让我们试一试:
netstat -tulpn
您应该看到正在本地计算机上运行的实际上正在监听网络连接的服务列表。这些应该受到重视,因为任何监听外部连接的东西都可能是系统的入口点。如果您看到这里有一些正在监听连接而您不需要它,可以删除该软件包。您可以随时禁用服务,但删除底层软件包更好,因为它们不会被意外启动。如果您发现实际上确实需要它们,软件包总是可以重新安装的。
netstat 命令,列出正在运行和监听的服务。
在我的情况下,我可以看到 Syncthing 和 Chrome 正在监听外部连接。这是预期的。但在生产环境中,比如服务器,需要注意的是 Apache web 服务器(如果服务器实际上不是 web 服务器的话),postfix,或者任何不应该安装的文件传输工具。
另一个有用的工具是ShieldsUP,这是 GRC 在互联网上提供的一项服务。这绝对不是一个特定于 Linux 的工具,但如果您在路由器上使用 Linux,并希望确保它配置为尽可能隐秘,这个工具可以用于测试。您可以在以下网址访问这个工具:
注意
请记住,ShieldsUP 是一个在线工具,不受作者或出版商的控制或管理。因此,它随时可能会发生变化。话虽如此,这个网站已经有一段时间没有变化了,它是一个非常有用的工具。
要使用它,点击继续,然后点击所有服务端口。这项服务通过检查哪些端口回应外部请求来工作。如果一个端口是打开的,它会显示为红色,您应该能够点击它以了解更多关于该端口通常用于什么的信息。这将为您提供有关禁用什么的线索。如果服务不包含有关特定端口的信息,只需在 Google 上搜索以寻找线索。
使用 ShieldsUP!查看哪些端口回应外部请求
最后,systemctl
命令也可以用来查看当前安装在您的机器上的服务:
systemctl list-units -t service
使用前一个命令打印到终端的列表,您将能够看到当前安装的单元文件及其状态。
这基本上总结了如何审问您的系统以找出正在运行的内容。随着时间的推移,您会学到典型服务的名称,可能需要进行一些 Google 搜索以了解每个服务的目的,但随着时间的推移会变得更容易。如果您对可以禁用的内容有任何疑问,请在实际调整运行服务之前先进行研究。最坏的情况是,如果您禁用了一个必要的服务,您的服务器可能在下一次启动时无法启动。如常,在更改系统服务之前,请确保您有良好的备份。
Securing OpenSSH
OpenSSH 是一个很棒的工具;它是 Linux 管理员的好朋友。它可以让你不必走进服务器房间,连接显示器和键盘就可以在网络上进行工作。使用连接到同一网络的任何计算机,你几乎可以做任何你想做的事情,就像你站在机器前面一样。问题是,一个不安全的 SSH 实现给了不法分子同样的便利。在你的网络上运行的所有东西中,SSH 绝对是你想要给予重点关注的。
SSH 的第一个和最常见的安全调整是只使用协议的 2 版本。要确定你的 Linux 安装使用的是哪个版本,可以使用grep
命令查看/etc/ssh/sshd_config
文件:
cat /etc/ssh/sshd_config |grep Protocol
如果答案是 1,你应该编辑这个文件并将Protocol 1改为Protocol 2,然后重新启动 SSH。这很重要的原因是因为协议 1 的安全性比协议 2 要弱得多。值得庆幸的是,SSH 7 版本及更高版本现在默认使用协议 2,所以这不像以前那样常见。但在写这篇文章的时候,7 版本刚刚发布,并且还没有在许多发行版中得到应用。希望到你读到这篇文章的时候,你的发行版已经升级到 7 版本。但如果没有,你需要确保你的所有服务器只使用 SSH 的协议 2。你可以通过更改sshd_conf
文件中的相关行,然后重新启动 SSH 服务来实现这一点。
SSH 的另一个值得改变的地方是改变它监听的端口。默认情况下,SSH 监听在端口 22上。你可以使用以下命令确认:
cat /etc/ssh/sshd_config |grep Port
除非你改变了它,答案将是 22。由于 22 是 SSH 的默认端口,这是每个人(包括坏人)都期望的端口。在/etc/ssh/sshd_config
文件中,顶部附近将有一个端口选项。如果你将它改成其他端口,对外部人员来说就不那么明显了。然而,我不想让你产生一种虚假的安全感。改变 SSH 端口并不能奇迹般地阻止通过 SSH 的入侵。在有针对性的攻击中,不法分子会扫描你服务器上的每个端口,所以如果他们决心的话,他们会找出你将端口改成了什么。我建议这种改变的原因是因为这是一个非常容易的改变。只需要几秒钟就可以改变你的 SSH 端口,任何你可以做的事情来使你的网络对外部人员不那么明显都是受欢迎的。改变 SSH 端口可能成为潜在问题的唯一时机是如果你的网络用户期望它在 22 端口。只要你向每个人传达这个改变,这应该不是问题。
为了连接到一个非标准的 SSH 端口的服务器,使用-p
标志:
ssh -p 63456 myhost.mynetwork
你也可以在使用scp
时指定端口:
scp -P 63456
注意
请注意,-P
参数在scp
命令中是大写的,但在ssh
命令中不是。这是有意为之的。原因是因为在scp
中小写的-p
选项已经被使用了,它用于在传输文件时保留修改时间。
如果你似乎无法养成请求 SSH 的不同端口的习惯,可以为它创建一个别名。然而,如果你的一些主机仍在使用端口 22,这可能会成为一个问题,所以只有当你连接的所有东西都在同一个端口上时才使用这个别名。在下面的例子中,我们可以设置一个别名为ssh
,强制它总是使用端口63456
:
alias ssh="ssh -p 63456"
你的 SSH 配置的另一个非常重要的改变是不允许 root 登录。在任何情况下,都不应该允许在任何 Linux 服务器上以 root 身份登录。如果你的配置要求你通过 SSH 以 root 身份登录到服务器,那么你需要更正你的配置。要检查 SSH 是否允许 root 登录,运行以下命令:
cat /etc/ssh/sshd_config |grep PermitRootLogin
如果启用了 root 登录,则通过更正/etc/ssh/sshd_config
中的以下配置行来禁用它。但是,请确保您能够首先使用普通用户帐户通过 SSH 访问服务器;否则,您将被锁定。sshd_config
中的以下配置行将禁止 root 登录:
PermitRootLogin no
注意
如往常一样,在对其配置进行任何更改后重新启动ssh
。不要担心在使用 SSH 时重新启动它,当前连接不会中断。
对于 Debian 系统,请执行以下命令:
# systemctl restart ssh
对于 CentOS 系统,请执行以下命令:
# systemctl restart sshd
另一个值得实施的做法是将 SSH 限制为仅允许通过特定用户和/或组进行连接。默认情况下,系统上的任何用户都可以通过 SSH 访问。要更改此设置,请将以下行添加到配置文件的最底部:
AllowUsers jdoe
如果您有多个用户,您可以在同一行上添加多个用户:
AllowUsers jdoe bsmith
您还可以允许特定的组。首先,创建一个用于 SSH 访问的组:
groupadd ssh_admins
接下来,将一个或多个用户添加到组中:
usermod -aG ssh_admins jdoe
最后,在 SSH 配置文件的底部添加以下行。重新启动 SSH 后,访问将受到限制,只有属于该组的人才能访问。每次需要向某人授予 SSH 访问权限时,您只需要将其用户 ID 添加到该组中,而无需每次都重新启动sshd_config
配置文件。
AllowGroups ssh_admins
最后,SSH 的最安全选项是根本不允许基于密码的身份验证。相反,用户可以使用公钥/私钥对进行访问。使用这种方法,密码不会通过网络传输,而那些没有与接受的公钥匹配的私钥的用户将不被允许访问。这是我向每个人推荐的做法。不利的一面是,它也带来了最多的管理开销。要实施此更改,每个用户都需要使用以下命令为 SSH 生成密钥对:
ssh-keygen
您将被要求回答几个问题,其中大多数问题您可以保持默认设置。对于密码短语,请想出一个独特的短语,并确保它与您的密码不同。如果您不想在进行连接时被要求输入密码短语,可以将其留空,但我建议创建一个密码短语。
接下来,配置服务器以允许您通过密钥连接的最简单方法是在禁用密码身份验证之前将该密钥导入服务器。要做到这一点,请使用以下变体:
ssh-copy-id -i ~/.ssh/id_rsa.pub myserver.mynetwork.com
在这一点上,您将被要求使用普通密码登录服务器。然后,下次连接时,您将默认使用您想出的密钥对,并且如果您创建了密码短语,系统将要求您输入密码短语。
在所有用户生成并将其密钥导入服务器后,您可以实施此更改。在 SSH 配置文件中查找类似以下内容的行:
PasswordAuthentication yes
只需将该选项更改为 no,重新启动 SSH,您就可以了。这样做的原因是,当您使用ssh-copy-id
命令复制 SSH 密钥时,它实际上是在将本地计算机上的公钥(~/.ssh/id_rsa.pub
)的内容复制到远程计算机上的~/.ssh/authorized_keys
文件的末尾。禁用密码身份验证后,SSH 将检查那里列出的密钥是否与您的私钥(~/.ssh/id_rsa
)匹配,然后允许您访问。
通过这些调整,您的 SSH 实现应该是相当安全的。如果您使用弱密码或密码短语,它肯定不会帮助您,但这些是您应该在所有服务器上采取的一般步骤。
配置 iptables 防火墙
默认情况下,Linux 包括一个防火墙iptables。这个防火墙应该在大多数(如果不是所有)Linux 发行版上自动可用。在这个小活动中,我们将在我们的 Linux 系统上设置一个防火墙。无论你使用哪个主要的发行版,这应该都可以正常工作,但我会指出可能是特定于发行版的任何内容。不过,在我们开始之前,我建议你在测试机器上玩一下,比如虚拟机或者你可以物理访问的东西。如果你使用 SSH,在我们启用防火墙时可能会断开连接,尽管我会按照一个不会断开你连接的顺序提供这些步骤。无论如何,有一个专门的测试机器来玩耍是一个好主意。
有了这个,让我们开始吧。不幸的是,默认情况下,iptables
是完全开放的。事实上,它是如此开放,以至于什么都不阻止。要自己看一下,以 root 身份发出iptables -L
。你的输出可能看起来像这样:
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)
你在这里看到的是iptables
的三个链,分别对应输入、输出和转发。如果你还没有配置这个(并且你的发行版没有提供任何默认配置),你可能会看到每个的默认策略都是ACCEPT
,这意味着它允许一切。
我喜欢实施的第一条规则之一是允许 SSH:
# iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
通过这个命令,我们在接口eth0
上的INPUT
链上附加了一个新规则(-A
),使用 TCP 并接受来自dport
(目标端口)22
的流量。如果你之前更改了 SSH 端口,请确保相应地调整这个命令。另外,如果你的接口不是eth0
,也要进行更改。当然,我们的防火墙无论如何都允许任何东西,因为我们从未更改过默认策略。如果你还记得,它默认接受一切。让我们用以下命令来改变这一点:
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT DROP
现在,如果我们查看iptables -L
的输出,我们应该看到默认策略是在所有内容上都是DROP
,并且允许 SSH。
然而,有一个问题——我们无法做其他任何事情。我们已经无法安装软件包。实际上,我们根本无法在互联网上做任何事情。例如,尝试 ping 谷歌。你做不到。如果你跟着做了,我们将默认策略设置为DROP
,这确实意味着DROP
。除了 SSH 之外,目前不允许服务器之间或服务器之外的任何流量。为了恢复网络连接,我们需要允许更多的东西。首先,让我们允许 DNS,它使用端口53
:
# iptables -I INPUT -s 10.10.96.0/22 -p udp --dport 53 -j ACCEPT
# iptables -I OUTPUT -s 10.10.96.0/22 -p udp --dport 53 -j ACCEPT
在这里,我们允许端口53
,但只允许我们内部的10.10.96.0/22
网络。请注意,DNS 使用 UDP,所以我们在命令中包含了-p udp
。不用说,但根据你的网络方案调整10.10.96.0/22
部分。
在这一点上,我们的系统比我们想要的还要严格一些。例如,我们现在有了 DNS,但如果不允许端口80
和443
,我们将无法浏览互联网。让我们接下来处理这个问题。
# iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -i eth1 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth1 -p tcp --dport 443 -m state --state ESTABLISHED -j ACCEPT
从这一点开始,你应该能够在这台机器上浏览互联网并通过 SSH 访问它,尽管其他端口和服务不应该是可访问的。如果问题机器是一个路由器,你可能也想配置端口转发。这是一个端口转发的例子:
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 65254 -j DNAT --to-destination 10.10.96.10
在这个例子中,我们将在端口65254
上接收的流量转发到10.10.96.10
。如果你有类似 SSH 的东西在除22
之外的端口上可用,并且想要能够使用该端口访问一台计算机(在这种情况下是10.10.96.10
),这个例子就很有用。服务器现在将在该端口接收到的流量转发到该计算机。这使用了PREROUTING
的概念,它处理传入的数据包,并能够通过 NAT 重新分配它们。在这种情况下,我们使用防火墙创建一个 NAT 规则,将这些流量发送到适当的位置。
如果您要在设置此防火墙的服务器上成为路由器,您还需要启用接口之间的路由。我们在上一章中已经从 Linux 级别处理了这个问题,但由于我们将防火墙配置为默认情况下DROP
一切,我们不能再这样做了。为了继续在接口之间进行路由,我们还需要在我们的防火墙中启用路由。为此,我们可以使用以下命令:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# iptables -A FORWARD -i eth1 -j ACCEPT
在上一个命令中,我们允许在eth0
和eth1
接口之间进行路由。调整前面的命令以适应您的发行版网络接口命名方案,以使其适应您的环境。我们还使用POSTROUTING
,在iptables
方面,这是出站流量的另一个说法。
可能有用的另一个更改是允许 ping。根据我们目前的配置,ICMP ping 数据包被阻止。如果您 ping 您的服务器,您将得不到响应。我们可以通过以下命令重新启用 ping 响应。请确保更改 IP 地址以匹配您的服务器:
# iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -d 10.10.96.1 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -p icmp --icmp-type 0 -s 10.10.96.1 -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT
如果由于某种原因您犯了错误,或者您想重新开始这个活动,可以使用以下命令来刷新(重置)iptables
防火墙:
# iptables –flush
请注意,这不会撤消您的默认策略,如果您希望撤消到目前为止所做的一切,可以将默认策略明确设置为ACCEPT
。我们可以使用以下命令将每个表设置为其默认值(ACCEPT
):
# iptables -P INPUT ACCEPT
# iptables -P FORWARD ACCEPT
# iptables -P OUTPUT ACCEPT
我们选择DROP
作为默认策略,因为在这种模式下,防火墙在拒绝流量时不会向发送主机发送状态响应。在某种意义上,当策略设置为DROP
时,数据包被发送到一个无尽的黑洞,几乎就好像没有响应。这是一件好事,因为坏人可以利用从服务器收到的响应更好地针对他们的攻击。最好是他们根本得不到任何响应。
因此,随意使用iptables
进行尝试,直到您能够执行通常能够执行的所有任务为止。一旦您有一个工作正常且经过充分测试的防火墙,就该保存配置了。否则,当您重新启动时,所有这些辛苦工作都会丢失。使用以下命令保存您的防火墙配置:
# iptables-save > /etc/iptables.rules
要导入这些规则,我们可以使用以下命令:
# iptables-restore < /etc/iptables.rules
您可能希望这些更改在系统启动时自动恢复。Debian 和 CentOS 都有各自的方法来实现这一点。以下是保存规则的方法。
在 Debian 中,首先保存规则,就像我们之前做的那样:
iptables-save > /etc/iptables.rules
接下来,创建以下文件:
/etc/network/if-pre-up.d/iptables
在该文件中,放入以下文本:
#!/bin/sh
/sbin/iptables-restore < /etc/iptables.rules
在 CentOS 中,执行以下命令:
# iptables-save > /etc/sysconfig/iptables
从这一点开始,每次重新启动服务器时,您的防火墙规则应该会持久保存。
使用 fail2ban 保护系统服务
防火墙是一件很好的东西,但它对允许的服务的保护作用不大。防火墙只允许或不允许访问。但一旦允许访问某项服务,其安全性取决于其配置以及是否存在任何安全漏洞。一个值得安装的服务是fail2ban,这是一个很好的小工具,可以在后台运行,并监视您的日志是否有异常情况,比如多次尝试访问某项服务失败。fail2ban
最常见的用途是保护 SSH 免受尝试暴力破解的攻击。在很多方面,fail2ban
是denyhosts的继任者,它们的功能基本相同。但fail2ban
能够保护的服务不仅仅是 SSH,另一个例子是 Apache。
当fail2ban
发现某个来源正在尝试访问服务并失败时,它将即时设置防火墙规则来阻止该服务从您的服务器访问。首先,在服务器上安装fail2ban
软件包。在 Debian 系统中,这在默认存储库中可用。CentOS 系统将在我们过去设置的epel
存储库中找到此软件包。安装后,如果尚未使用以下命令启用并启动它:使用systemctl
。
# systemctl start fail2ban
# systemctl enable fail2ban
在/etc/fail2ban
目录中,您应该看到主配置文件jail.conf
。将此配置复制到本地副本是个好主意,因为如果您编辑jail.conf
,可能会被包升级覆盖。如果fail2ban
服务找到jail.local
,它将读取它,并且如果被升级,不会覆盖它:
# cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
现在我们有了本地副本,我们可以配置它来保护我们的服务。让我们从 SSH 开始。为此,请在文本编辑器中打开/etc/fail2ban/jail.local
,并查找[ssh]
部分。在我的系统中,这个部分看起来是这样的:
[ssh]
enabled = true
port = 65256
filter = sshd
action = iptables[name=SSH, port=65256, protocol=tcp]
logpath = /var/log/auth.log
maxretry = 6
如您所见,配置相当简单易懂。第一行启用了 SSH 监狱,它使用sshd
过滤流量,并在/var/log/auth.log
中查找与 SSH 相关的消息。虽然您可能已经注意到,我们需要在此文件中调用 SSH 端口。如果您坚持使用端口 22,可以将文件中相关部分保持原样。但是,如果您将 SSH 端口更改为其他端口,请务必相应调整。SSH 的端口有两个地方需要设置,第一个在第三行,第二个在第五行。
现在我们已经配置好了,我们可以重新启动fail2ban
来开始为我们保护 SSH:
# systemctl restart fail2ban
查看其他我们可能想要启用的服务的配置文件。例如,我们的 Web 服务器可能是 Apache,甚至如果您已经设置了 NGINX。默认配置文件包含许多示例供您使用。要使用其中一个,只需将enabled = false
更改为enable = true
,然后重新启动fail2ban
。
理解 SELinux
安全增强型 Linux(SELinux)是一个旨在通过执行强制访问控制来增加安全性的内核模块。这个概念让您可以控制确保用户和应用程序只能访问他们绝对需要完成任务的东西。虽然防火墙有助于保护系统免受外部入侵,但 SELinux 有助于防止内部资源执行不应该执行的操作。这可能听起来模糊,因为这是 SELinux 的用法,您如何从中受益完全取决于您如何实施它。想要防止用户使一个非常私人的文件变为可全球读取?当然可以。也许确保 Apache 无法访问/var/www
之外的文件?也可以。没有 SELinux,您将完全依赖于组和用户权限。SELinux 通过添加额外的安全层来帮助您实施更精细的安全限制。
SELinux 不是任何一个发行版的专属功能,尽管您最常见的是在 Red Hat、Fedora 和 CentOS 系统上安装它。在 Debian 等系统中,如果您希望使用它,您需要安装selinux
。不幸的是,在撰写本文时,由于一个必需的包(selinux-policy-default
)包含的错误没有及时修复,SELinux 在 Debian 中无法正常工作,因此这个包被省略在官方的 Debian 8.x“Jessie”存储库中。然而,在 Debian 中安装 SELinux 的过程(如果此包在发布后变得可用)就是安装该包以及selinux-basics
。安装这些包后,您应该能够通过运行以下命令并重新启动系统来完成 SELinux 的安装:
# selinux-activate
# systemctl enable selinux-basics.service
SELinux 通过策略来确定是否允许某个操作。策略是使用存在于所谓的SELinux 用户空间中的工具创建的,实际检查是在内核层进行的。每个默认实现 SELinux 的发行版通常都会配备经过测试和支持的一套策略,以确保您合理期望的所有服务都能正常运行。如果没有默认的策略集,手动配置 SELinux 可能会非常麻烦(如果它甚至能启动的话)。正如前面提到的,目前 Debian 的策略包不是主要存储库的一部分,因此在 Debian 中启用 SELinux 可能会很混乱。不过,在 CentOS 的情况下,您需要使用 SELinux 的所有内容都将可以直接使用。实际上,除非您已禁用它,否则您已经在使用它!
SELinux 有三种操作模式,分别是强制执行,宽松和禁用。默认情况下,我最近看到的大多数安装都设置为强制执行
,但您可以通过执行sestatus
来查看您的设置是哪种模式。
在 CentOS 上的 sestatus 输出
在强制执行
模式下,SELinux 配置为启用其策略,并将对违反策略的任何操作进行处理。如果发生违规行为,SELinux 将阻止该操作并记录下来。在宽松
模式下,操作不会被阻止,但仍会记录下来,以便您稍后自行审计服务器。禁用
状态是不言而喻的;在该模式下,SELinux 将在禁用时不会阻止或记录任何操作。管理员通常会简单地禁用 SELinux,认为它会在合法用例受阻时成为负担。但除非您绝对必须这样做,否则不建议禁用 SELinux,因为它是您可以从中受益的另一层安全性。至少,您可能希望从宽松
模式中受益,以便在服务器上出现可疑情况时可以获得更多信息。
要在运行时更改 SELinux 的操作模式,请使用setenforce
命令。例如,使用setenforce Enforcing
将模式更改为强制执行
。通过setenforce
进行的更改不是永久的。一旦重新启动计算机,模式将切换回默认模式或您在配置文件中配置的模式。永久更改模式的配置文件是 Red Hat 风格发行版中的/etc/sysconfig/selinux
文件,或者在 Debian 中是/etc/selinux/config
。该文件允许您配置两个主要设置来确定 SELinux 的配置方式,即模式和类型。要永久更改任一设置,请更新此文件并重新启动服务器。我们已经讨论了模式(可以设置为强制执行
,宽松
或禁用
),而类型是我们配置 SELinux 要使用的策略。这可以设置为targeted
,minimum
或多级安全(mls
)。
关于更新策略,targeted
是默认情况下新安装(至少在涉及 Red Hat/CentOS 时)使用的进程。它得到 Red Hat 的全面支持。在这个策略中,每个进程都在一个称为unconfined_t
的类型下运行,实际上根本没有受到限制。相反,进程将在 Linux 本地的DAC(Discretionary Access Control的缩写)下运行,这使它们与其他进程隔离,以帮助遏制可能被破坏的任何内容。MLS,或多级安全,在启用时会为对象分配一个敏感度等级,由s0
指定。(通过执行sestatus
,您可以看到 MLS 是否已启用)。我们很快将看到一些上下文输出的示例。在最小类型中,只有我们明确选择的进程才会受到保护。
SELinux 启用系统中的每个资源都包含一个标签,这是 SELinux 识别资源并了解如何监管它的方式。您可以通过使用-Z
参数与一个或多个命令(如ls
、id
或ps
)来自己查看这些标签(也称为上下文)。这个特殊的参数仅在系统配置为使用 SELinux 时才对这些命令可用,并且它允许您查看上下文作为正常输出的一部分。例如,您可以在 SELinux 系统上使用ls
命令与-Z
参数,您会看到如下输出:
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 myfile
通常,ls
命令的输出会包含诸如修改日期和大小等字段,当查看ls
命令的输出时。但是,-Z
参数是特殊的。它意味着您想要查看命令的输出与 SELinux 相关,而不是通常获得的输出。您还可以尝试使用id
(id -Z
)和ps
(ps auxZ
)来查看这些命令的输出,以及它们的 SELinux 上下文。
标签包含多个字段。在我粘贴的ls
命令的输出中,我们可以看到字段unconfined_u
、object_r
、admin_home_t
和s0
。为了更好地理解这一点,看一下每个字段的最后几个字符。_u
表示用户,_r
表示角色,_t
表示类型。因此,我们可以从之前的输出中看到,名为myfile
的文件具有unconfined_u
的用户上下文;它被分配了object_r
的角色和admin_home_t
的类型。让我们看另一个例子。在我的 CentOS 系统上,通过ps auxZ
命令的输出中,我看到了我的 SSH 会话的以下行:
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 jay 20575 0.0 0.0 135216 2080 ? S 10:40 0:00 sshd: jay@pts/0
再看一下行的开头,我们再次看到用户、角色和类型的上下文。在这种情况下,每个都被命名为 unconfined,但我们可以通过最后两个字符来判断哪个是哪个。
类型是输出中最重要的部分,因为这是 SELinux 执行其强制执行的方式。根据类型,SELinux 知道如何限制(或不限制)对象。在第一个示例中,我们有admin_home_t
,在第二个示例中我们有unconfined_t
。从中我们可以得知,SELinux 并未对我的 SSH 会话(unconfined_t
)执行任何强制,但对我的主目录有一个特定的策略,这也是文件输出的来源。我们在示例输出中看到的另一个上下文是角色,由后缀_r
指定。应用角色时,SELinux 能够将各种上下文组合在一起,并一次性将它们应用到用户对象上。这使得更容易指定用户能够做什么以及他们如何与其他对象进行交互。
有几个命令可以用来重新标记对象的上下文信息。首先是chcon
命令。chcon
命令使用-t
参数,该参数指定您要将对象更改为的类型,后跟对象的名称:
# chcon -t admin_home_t myfile
使用-R
,我们告诉chcon
命令递归地进行更改,这对于更改目录的上下文非常有用。此外,如果您想更改角色而不是类型,还可以使用-r
。如果您犯了错误或者想要恢复更改,restorecon
正是这样做的。restorecon
命令将对象恢复到其策略中定义的默认状态。管理 SELinux 的另一个命令是semanage
。使用此命令,我们可以对对象的处理和标记进行永久更改。需要注意的是,通过chcon
进行的更改可能并不总是持久的。虽然通过chcon
进行的更改可能会在重启后生存,但如果文件系统被重新标记,它们将持久存在。semanage
命令允许我们使这些更改更加持久。使用semanage
,我们可以更改文件上下文、用户映射以及用户上下文。
首先,将用户jdoe
映射到sysadm_u
SELinux 用户的示例:
# semanage login -a -s sysadm
接下来,这是使用fcontext
和semanage
的示例,我们可以更改文件对象所属的类型:
# semanage fcontext -a -t admin_home_t myfile
查看semanage
的 man 页面,了解更多示例。SELinux 是一个庞大的主题,已经有整本书专门写了。完整的 SELinux 演练需要多个章节,但这里提供的信息应该足够作为一个适当的入门。当正确实施时,它可以极大地增强服务器的安全性。
配置 Apache 以利用 SSL
第七章 通过 Apache 托管 HTTP 内容是关于 Apache 的。在那里,我们介绍了如何运行和配置它以在我们的网络上托管站点。但是,如果我们要创建一个可能托管个人可识别信息的站点,我们需要确保使用适当的安全措施来保护这些信息。为我们的站点使用SSL证书可以使其通过安全端口 443 访问,从而增强安全性。利用 SSL 并不是我们可以采取的唯一措施来增加我们的 Web 服务器的安全性,但这绝对是一个开始。
我们可以使用两种类型的证书。我们可以创建自签名证书,或者我们可以向证书颁发机构(CA)注册证书。后者更受青睐,尽管如果您只是为内部使用创建站点,可能会有太多的开销。区别在于自签名证书不受任何浏览器信任,因为它不是来自已知 CA 的。当您访问具有此类证书的站点时,它会抱怨该站点的证书无效。这并不一定是真的,因为自签名证书肯定是有效的;只是浏览器无法确定。注册 CA 的证书可以解决这个问题,但需要付出代价。注册证书的价格可能会很昂贵,具体取决于范围。选择权在您手中。
注意
在 Debian 系统上,确保使用以下命令启用 SSL:
# a2enmod ssl
首先,您需要选择 Web 服务器文件系统上将托管证书文件的位置。这里没有硬性规定,唯一的要求是 Apache 可以访问它(最好其他人不能!)。一些好的候选包括 Debian 中的/etc/apache2/ssl
和 CentOS 中的/etc/httpd/ssl
。我把我的放在/etc/certs
中。无论您选择哪个路径,请切换到该目录,然后我们将继续。
如果您决定创建自签名证书,可以使用以下命令:
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
在生成您的证书时,您将被要求提供有关您的组织、联系信息和域的一些信息。以下是您将被问到的问题和一些示例答案:
-
国家名称:美国
-
州或省名称:密歇根
-
地点名称(城市):怀特湖
-
组织名称:我的公司
-
组织单位名称:IT 部门
-
通用名称(完全合格的域名):myserver.mydomain.com
-
电子邮件地址:webmaster@mycompany.com
这将在您当前的工作目录中为您创建两个文件,server.key
和server.crt
。这些文件的文件名是任意的,您可以随意命名。现在,我们需要确保我们的 Web 服务器能够找到并使用这些文件。
在 Debian Web 服务器上,我们可以通过编辑/etc/apache2/sites-available/default-ssl.conf
来实现这一点。在该文件中,将有一个部分供我们添加启用密钥的指令。查找一个有关 SSL 的注释的部分,在该部分中添加以下行:
SSLCertificateFile /etc/certs/server.crt
SSLCertificateKeyFile /etc/certs/server.key
在 CentOS 中,我们将在/etc/httpd/conf/httpd.conf
文件中添加相同的行,但同时也要加上SSLEngine on
指令。这应该放在自己的VirtualHost
指令中,类似于以下示例。只需确保更改路径以匹配您的 Web 服务器的设置:
<VirtualHost *:443>
SSLEngine On
SSLCertificateFile /etc/certs/server.crt
SSLCertificateKeyFile /etc/certs/server.key
SSLCACertificateFile /etc/certs/ca.pem (Only include this line if the certificate is signed).
DocumentRoot /var/www/
</VirtualHost>
设置签名 SSL 证书类似,但不同之处在于您请求它的方式。该过程涉及创建一个证书请求(CSR),您将提交给您的提供商,提供商将为您提供一个签名证书。最终结果是相同的——文件最终会出现在同一个位置。您只需在提交 CSR 后使用提供商给您的文件。让我们开始创建一个 CSR,我们将使用openssl
命令为我们生成:
openssl req -new -newkey rsa:2048 -nodes -keyout server.key -out server.csr
您将被问到与之前相同的问题,但请注意,我们告诉openssl
给我们一个.csr
,所以我们将在我们的工作目录中有一个server.csr
文件,我们将使用它来向我们的 CA 请求一个密钥。在您从证书提供商那里收到文件之后,您只需像之前一样更新 Apache。
部署安全更新
虽然对于那些在安全方面更有经验的人来说,更新您的分发似乎是常识,但请注意,更新是有原因的。在某些情况下,更新只是为了添加新功能或将软件更新到最新版本。但对于 CentOS 和 Debian 等企业分发来说,这些更新甚至更加重要。
这是消费者分发和企业分发之间的一种区别。像 Ubuntu 的非 LTS 版本、Linux Mint 和 Fedora 这样的分发,比如 CentOS、Debian 和 Red Hat 这样的企业分发,会收到更多的前沿软件包。这是因为最终用户通常希望他们的网络浏览器、电子邮件客户端、文字处理器或游戏的最新版本。但在企业中,这并不重要。在企业中,安全更新至关重要。虽然面向消费者的分发在大多数情况下肯定会与安全补丁保持同步,但这些补丁会与可能会损害稳定性而不是帮助稳定性的功能更新混合在一起。
在 Debian 的情况下,实际上提供了两种风格。被称为Debian stable的主要发行版几乎只接收安全补丁。甚至默认的网络浏览器(Iceweasel)的更新频率也不如其他平台上的 Firefox。这里的想法是,改变代表着潜在的破坏。为了确保您在稳定版中获得的软件包经过了充分的测试,而不是最新和最好的,付出了相当大的努力。这个概念在 CentOS 中也是类似的,尽管它的软件包通常比 Debian 中的软件包更老。举个例子,我写这一章节时,最新的 Linux 内核是 4.1。Debian Jessie(最新的“稳定版”)包括内核 3.16,而 CentOS 7 甚至更老,是 3.10。老内核并不是什么问题,我只是举个例子。红帽和 Debian 都有更前沿的发行版可用。Fedora由红帽赞助,包括更更新的软件包。它面向那些喜欢拥有最新软件的用户。Debian testing也包括更更新的软件包,尽管它不像 Fedora 那样稳定,偶尔会出现软件包破坏。Debian testing 面向那些想要测试下一个 Debian 发布版的人,因为 Debian testing 最终会成为新的 Debian 稳定版。
出于安全目的,安装最新的安全更新至关重要。Linux 确实比许多其他平台更安全和稳定,但无论操作系统有多安全,归根结底,它的安全性取决于管理方式。如果安装了滞后更新的 Linux 发行版,一旦发现可利用的漏洞,它就会成为易受攻击的目标。
考虑到终端用户和企业发行版的存在,管理它们的安全更新可能是一个挑战。如果您的组织在服务器和终端用户设备上都使用 Linux,您很可能会同时使用这两种类型的发行版。这是因为尽管 CentOS 安全稳定,但您不太可能成功地将其部署到终端用户设备上。由于 CentOS 内核较老,它不支持今天可用的所有新硬件。此外,也没有太多的定制来使其适合台式机或笔记本电脑使用。虽然可以做到(许多人都这样做),但在终端用户设备上安装 CentOS 通常是一种令人沮丧的经历。对于终端用户设备,您可能会选择 Ubuntu、Linux Mint 或 Fedora。但对于这些发行版,您需要花更多的时间关注哪些更新是安全更新,哪些更新是应用程序的新功能。根据更新的性质,您可能会选择以不同的方式推出更新。
理想情况下,在一个完美的服务器房间里,服务器的所有更新都会在发布后立即安装,永远不会出现任何问题,一切都会顺利进行。但现实中,保持安全更新的挑战很大。也许会出现导致重要应用程序无法运行的回归。或者,也许在打包过程中出现错误,实际上破坏了 RPM 数据库(这是一种极其令人沮丧的经历!),因此,虽然更新很重要,但也需要谨慎行事。
最好的策略,或者至少我发现对我来说效果很好的一个策略,是创建测试服务器,可以用来在将更改推出到生产环境之前进行测试。在虚拟机服务器的情况下,甚至可以克隆生产服务器并在其上测试更新或其他更改,以查看它们在推出到生产环境时会有什么反应。然后,您可以相当有信心地认为新的更新不会破坏生产服务器。公平地说,这些类型的情况很少发生。但鉴于 Linux 的灵活性以及 Linux 服务器易于克隆,没有理由不进行测试。
在 CentOS 系统中,您可以使用yum update
命令来更新服务器上的所有软件包。您可以使用yum update
以及软件包名称来仅更新该软件包。在 Debian 系统中,您可以使用apt-get update
来刷新您的源,然后您可以使用apt-get install
加上软件包名称来更新软件包。要更新所有内容,您需要更新您的源,然后运行apt-get dist-upgrade
。
在实际安装中,您可能不会更新服务器上的所有可用软件包。相反,一种方法是根据需要更新软件包。这需要管理员进行大量的研究,以关注当前的安全趋势,然后选择影响当前在生产中使用的服务的安全更新。对于基于 Debian 和 Red Hat 的系统,有两个与通用漏洞和暴露(CVE)相关的方便的网站,您应该将其加为书签。
对于 Red Hat,请使用以下 URL:
access.redhat.com/security/cve/
对于 Debian,请使用以下 URL:
security-tracker.debian.org/tracker
两个网站都允许您查看单独的 CVE 报告,这将告知您有关受影响软件包以及它们是否已经修补的信息。在某些情况下,CVE 甚至可能在您特定的发行版中无法被利用,这种情况下您就不需要做任何事情。但是通过遵循这些报告,您可以就潜在的漏洞可能影响您的组织做出明智的决定。这将使您能够制定一个计划,将必要的补丁推出到您的服务器上。
摘要
安全是一个非常复杂的主题。如此复杂,以至于没有一个人可以成为全知的专家,即使是行业中的顶尖人物也在不断学习。同样,创建一个无法被破坏的防弹服务器是统计上不可能的。但作为网络管理员,您有责任尽力使您的节点尽可能安全。安全通常是一种反应性的,这需要您保持警惕。在本章中,我们探讨了一些帮助您保护网络免受风险的方法。我们涵盖了诸如保护 SSH、限制攻击面、使用 SSL 保护 Apache、fail2ban 和部署安全更新等概念。
在下一章中,我们将探讨当出现问题时您可以采取的解决方法。
第十章:故障排除网络问题
没有网络是完美的。无论我们计划和实施基础设施的多么完美,问题都可能发生。作为网络管理员,您需要的最重要的技能是解决问题的能力。当问题发生时,您的理性思考和通过排除法缩小问题范围的能力将帮助您度过难关。尽管当事情变得一团糟时肯定会很有压力,但网络管理员们享受着工作的安全性。在本章中,我们将解决 Linux 网络中可能出现的一些常见问题。在我们旅程的最后一章中,我们将涵盖:
-
跟踪路由问题
-
故障排除 DHCP 问题
-
故障排除 DNS 问题
-
使用 netstat 显示连接统计信息
-
使用 nmap 和 Zenmap 扫描您的网络
-
在 Debian 系统上安装缺失的固件
-
使用网络管理器解决问题
跟踪路由问题
网络的整个目的是将数据从 A 点传输到 B 点。如果由于某种原因我们无法将数据传输到需要的地方,有时很难准确定位问题发生的地方。但是通过排除法,确定路由问题发生的地方不应该太困难。
每当我遇到节点无法与特定服务器或网络通信的问题时,我喜欢从他们的工作站开始逐步排查到交换机堆栈,直到找到问题所在。首先,我检查一些显而易见的事情,比如 IP 地址是什么(或者机器是否有 IP 地址),然后我还会检查路由表。如果问题是间歇性的,您可能会想测试一下网线。出于某种原因,我遇到过很多问题都是由于坏网线导致的。我不知道为什么,但似乎其他我认识的管理员没有这种运气。但是检查一下网络电缆是否运行正常永远不会有坏处。
假设您已经尝试了简单的方法,接下来您会想确定您是否可以到达默认网关。如果您知道本地默认网关的 IP 地址,只需 ping 它以查看您是否可以到达它,并注意结果。您的尝试是否超时,还是顺利通过?如果您不知道网关的 IP 地址,请在终端模拟器中运行route -n
来查找。如果您可以通过 IP 到达默认网关,请尝试通过主机名以及您首先尝试连接的目标节点的 IP 地址来到达它。如果您能够通过 IP 而不是主机名到达资源,这很可能是 DNS 问题。我们将在本章后面讨论故障排除 DNS。但现在,确定您是否可以到达 DNS 服务器和/或网关将是一个很好的第一步。如果您不能,您可能有一个资源已经宕机,并且一群愤怒的同事正在等待您回到您的办公桌。
如果问题是间歇性的,我们可以从询问本地机器开始故障排除。ip address show
命令将为我们提供有关本地机器 IP 地址的一些详细信息。我们实际上可以通过缩写为ip addr show
来缩短这个命令,或者如果您真的不喜欢输入,您还可以进一步简化为ip a
。以下是来自示例系统的ip addr show
的输出:
调查本地机器上的 IP 地址
在本书的这一部分,ip a
的输出不应该有什么太让人惊讶的地方。然而,我的机器的输出可能与您在实际情况中看到的不同,因此值得一提。首先,您可以看到我用于测试的 Debian 机器上有五个网络接口。第一个是本地环回适配器lo
;第二个是eth0
。由于这台机器目前正在使用 Wi-Fi,eth0
没有 IP 地址并不奇怪。接下来的接口wlan0
的 IP 地址是192.168.1.106
。最后两个接口是独特的;它们存在为 Docker 和 KVM 虚拟化提供自己的网络。即使 Docker 和 KVM 不在本书的范围内,我提到它们做自己的网络,因为当安装了这些服务之一时,您可能会看到您的 Linux 桌面环境报告您已连接到网络,即使在技术上您并没有连接。在我的机器上,如果我断开wlan0
,它仍然会显示我已连接。这是因为大多数图形发行版所附带的 Network Manager 的 GUI 版本在报告与您的连接状态相关的准确状态方面做得很糟糕,这可能会混淆情况。
现在你已经确定了机器有一个 IP 地址,你可以采取的另一个步骤是使用traceroute
命令。那些使用过 Windows 的人可能已经熟悉这个概念,因为 Windows 实用程序tracert
的工作方式基本相同。traceroute
实用程序在设置 Linux 发行版时并不总是默认安装的,因此您可能需要安装traceroute
软件包。从这里,您应该能够使用traceroute
以及资源的主机名或 IP,查看进程在哪里中断。如果您的工作站无法访问公共互联网,您还可以针对网站的 URL 使用traceroute
。在下面的截图中,显示了针对google.com
的traceroute
:
运行 traceroute 以排除访问公共互联网的问题
在上一张截图中,我对www.google.com运行了traceroute
。从输出中,我们可以立刻看出几件事。首先,我们可以看到我们的命令尝试到达的第一个“跳跃”是一个名为m0n0wall.local
的设备,IP 地址为192.168.1.1
。如果我运行route -n
,我会看到这是我当前使用的网络的默认网关。m0n0wall
是 FreeBSD 的防火墙分发版,在这个网络上使用。当我运行命令时,我发现了这一点。接下来,我们可以看到我们通过m0n0wall
设备到达了另一个私有网络172.21.0.1
,然后是198.111.175.120
,但当我的请求到达198.108.22.150
时,输出就停止了。之后,我们只能看到星号,但我们没有超越这一点。在我的机器无法访问互联网的假设示例中,我可能想调查198.108.22.150
处的设备,并找出为什么它不让我的流量通过。然而,在我的情况下,这个设备正在丢弃 ICMP 数据包,这导致traceroute
命令本身失败。
在排除路由问题时,您绝对要检查的一件事是您的路由表。我们在第八章中涵盖了路由,理解高级网络概念,以及路由表和添加路由。但作为一个复习,您可以使用route -n
将路由表打印到您的 shell 上。如果您正在排除故障的机器没有到达需要访问的网络的路由,那么根本原因就很明显了。然后,您需要添加一个默认网关,以便让机器能够到达该网络。
查看本地路由表
故障排除 DHCP 问题
如果由于某种原因您有一台机器拒绝获取 IP 地址,那么这一部分就是为您准备的。DHCP 问题并不是非常常见,而且幸运的是也不难排除故障。
我见过的 DHCP 服务器最常见的问题之一是服务器或客户端的日期和时间错误。在 Linux 世界中,NTP 至关重要,应该始终正常工作。在 DHCP 的情况下,只有在服务超时请求 IP 地址之前才会等待很长时间。如果时钟差了一个小时,而传入的请求时间戳是一个小时前,那会让服务器困惑,客户端将无法收到地址。请务必确保所有客户端和服务器上的 NTP 都正常工作。DHCP 并不是唯一会因为任一端的时间不正确而受影响的服务。在这种情况下可能会发生很多奇怪的事情。
失败的原因是可用 IP 地址的不足。这听起来很明显,但您会惊讶地发现这种情况经常发生。即使是具有254
个可用 IP 地址的/24
网络,如今也可能很快就会饱和,因为从移动设备到冰箱(是的,冰箱)都想要获取 IP 地址。对于普通人来说,使用三个 IP 地址甚至都不会注意到是很常见的。如果您将 DHCP 租约时间设置为一天以上,这样的问题可能会变得越来越烦人。在大多数情况下,24 小时的租约时间对大多数网络来说是足够的。需要访问的设备将在到期时更新其租约,而临时设备则不会尝试更新其分配的 IP 地址,这将导致其返回到池中。
我希望我有一个您可以运行的魔术命令,可以给您一个可用 IP 地址数量的打印输出。不幸的是,我从来没有找到过一个,除了可能构建一个笨重的 Bash 或 Python 脚本。在遇到任何 DHCP 问题时,最好的做法是观察日志文件,并让客户端再次尝试连接。
工作中的 DHCP 服务器的输出
在 Debian 中,您可以通过运行cat /var/log/syslog |grep dhcp
来调查与 DHCP 服务器相关的消息。在 CentOS 中,您可以使用journalctl -u dhcpd
来查看这些消息。更好的方法是在客户端尝试连接时实时跟踪这些日志,这样您就可以看到发生的情况。要做到这一点,在 Debian 中使用tail -f /var/log/syslog
,在 CentOS 中使用journalctl -f -u dhcpd
。DHCP 服务器的错误应该相当容易跟踪,因为服务器通常会明确说明它在做什么。您可能会看到它向客户端提供地址,或者抱怨没有足够的 IP 地址可用。如果您看到服务器向客户端提供 IP 地址,但客户端似乎永远无法完成连接,那么一定要检查客户端上的 NTP 服务器。
故障排除 DNS 问题
DNS 问题通常很少发生,除非配置无效。在大多数情况下,您所做的任何故障排除都将在本地 DNS 服务器上进行,因为互联网上的公共 DNS 服务器不在您的控制范围之内。在外部 DNS 服务器失败的情况下,比如您的 ISP 的 DNS 服务器,您唯一的补救措施可能是使用不同的 DNS 提供商,比如使用谷歌的公共 DNS 地址8.8.8.8
和8.8.4.4
。但是如果您的本地 DNS 服务器失败,您就有更多的控制权。
与往常一样,您可以通过检查是否可以访问 DNS 服务器来开始故障排除 DNS 问题。首先,检查/etc/resolv.conf
,看看您的机器正在使用哪个 DNS 服务器。这是正确的服务器吗?如果不是,请在您的网络脚本中更正这一点,并重新启动网络。如果是正确的服务器,您能够访问它吗?尝试简单的 ping,只要服务器配置为响应 ICMP 回显请求,您应该会看到响应。如果您可以访问服务器,请通过 SSH 登录并检查其日志。也许守护程序(Debian 中的bind
和 CentOS 中的named
)没有运行。
除了简单的事情之外,我们还可以使用一个特定的实用程序来帮助排除特定于 bind 的问题,这个实用程序就是nslookup
。使用nslookup
命令以及您要查找的资源的名称,比如主机名或网站的 URL。
工作的 DHCP 服务器的输出
nslookup
的输出告诉我们一些有用的东西,可以帮助我们进一步进行故障排除。首先,它会给出回答我们请求的服务器的 IP 地址。在我的情况下,10.10.96.1
通过端口 53 回答了我。然后,我可以看到我对packtpub.com
的查询结果,它给了我一个外部 IP 地址83.166.169.231
。到目前为止,一切都很顺利。如果您的 DNS 服务器是可达的,守护程序正在运行,并且您的本地工作站已配置为指向它,一个非常常见的问题是您域记录中的序列号。如果您向 DNS 服务器添加了资源但忘记递增序列号,这可能导致查找失败,即使您已经为该主机添加了配置。这可能看起来是常识,但您会惊讶地发现它有多容易被遗忘。
如果nslookup
没有返回记录,请检查您是否确实将该记录添加到了服务器上。如果它返回了记录,那么只要您已经配置了本地工作站指向正确的服务器,一切都应该运行正常。
使用 netstat 显示连接统计
netstat
命令是一个有用的实用程序,允许您查看有关当前连接的一些统计信息。我们在上一章中稍微提到了它。这个命令允许您显示有用的网络信息,比如显示在您的网络卡上监听连接的服务,并打印您的路由表,等等。
在上一章中,我举了netstat -tulpn
的例子,让你可以查看当前连接和监听服务。这个命令显示了所有正在监听的东西,以及它正在监听的端口。分解这个命令,我们传递了一些参数。第一个-t
,表示我们想要查看与 TCP 相关的信息,-u
代表 UDP,-l
请求监听套接字,-p
尝试显示程序的名称,-n
也显示数字值。把它们放在一起,我们得到netstat -tulpn
。在行业中,这是我见过的netstat
最常见的用法。
netstat
的其他用途包括显示路由表(netstat -r
),它给出了与route -n
类似的输出。要查看连接统计,使用netstat -s
。最后,您还可以使用netstat -i
查看系统上的网络接口列表。不过,总的来说,这个命令是您在尝试故障排除问题或锁定节点时最常用的用于将网络信息打印到终端的命令。
使用 Nmap 和 Zenmap 扫描您的网络
nmap
实用程序是一个网络扫描工具,可以为您提供有关网络资源的大量信息。您只需要安装nmap
软件包。一旦您在您的工具库中拥有了这个实用程序,您就可以在您的网络上做一些相当不错的事情。在大多数情况下,nmap
被用来询问系统并提取信息。虽然nmap
本身并不能解决任何实际问题,但它可以帮助您发现您可以用来建立对网络在任何给定时间发生的情况的理解的信息。
它也需要非常小心地使用,因为nmap
能够披露关于可能是私人的网络的信息,除非您有明确的许可来使用它,否则您应该谨慎行事。由于nmap
可以用于黑客目的,如果网络管理员(如果不是您)看到这种类型的活动,那肯定是一个红旗。但在现实世界的场景中,nmap
确实可以拯救生命。根据我的经验,我发现它在追踪和审问在网络上托管恶意软件的机器方面非常有用,而奇怪的是,这些机器似乎总是运行 Windows(想象一下)。如果一个漏洞报告只显示了被感染机器的 IP 地址,那么很难追踪到这台机器是谁的。但是通过nmap
,我可以找出诸如该主机上运行的操作系统、机器的主机名(甚至可能包括用户的名称)以及该机器的网络卡的 MAC 地址等信息。
nmap
有许多用途,但我将从一些我最喜欢的用途开始。首先,正如我刚才提到的,您可以使用nmap
来尝试确定特定主机使用的操作系统。这将使您能够进一步调整命令以专门针对该机器,因为您调查节点的方式取决于它们运行的操作系统。要使用nmap
尝试查找这些信息,使用它与-O
参数和主机的 IP 地址。基本上,执行以下命令:
nmap -O 10.10.98.124
nmap
的另一个有用用例是扫描整个子网以确定连接了哪些主机。如果您试图查看哪些 IP 地址是空闲的,这是一种方法(假设没有节点有任何阻止扫描的防火墙):
nmap -sP 10.10.96.0/22
在前面的例子中,如果我们希望不扫描或包括特定 IP 地址,我们还可以使用--exclude
选项:
nmap -sP 10.10.96.0/22 --exclude 10.10.98.223
如果一台机器在防火墙后面,我们仍然可以尝试扫描它:
nmap -PN 10.10.98.104
好像我们已经有足够的实用程序可以显示我们本地机器的路由和接口信息,nmap
也可以做到:
nmap --iflist
除了在终端中使用nmap
命令之外,还有 Zenmap,它更或多是一个图形界面的等效工具。使用它,我们可以做几乎与nmap
相同的事情,但它还允许您保存您的扫描、打开先前保存的扫描、在两个保存的扫描之间比较结果,甚至保存命令配置文件以供以后使用。如果您发现自己经常使用nmap
,那么从 Zenmap 的附加功能中受益可能对您有用。
Zenmap 扫描本地网络
开始测试 Zenmap 的一种简单方法是尝试在本章中给出的任何示例中使用它。您应该能够将这些命令中的任何一个粘贴到窗口顶部的第三个文本框中,该文本框显示命令。从这里,您可以单击扫描开始扫描。完成后,您可以通过单击扫描然后保存扫描来保存结果。如前所述,您还可以将扫描结果进行比较。如果您想知道哪些新设备已添加到您的网络,这可能很有用。您可以在一天内对子网进行扫描(使用我之前提到的nmap -sP 10.10.98.0/24
示例),然后第二天再次运行扫描。如果每次都保存了结果,您可以比较它们,然后立即确定是否有新设备添加到您的网络。这是一个很好的定期执行的做法(特别是如果您是指定批准新设备的人),以确定是否存在任何流氓或未经授权的设备。
在 Zenmap 中比较网络扫描
在使用nmap
和 Zenmap 之间进行选择只是一种偏好问题。Zenmap 的功能非常好,但它提供的唯一东西就是易用性。例如,在nmap
中,您可以简单地将结果导入文本文件,然后可以针对两个输出文件的结果运行diff
命令,而无需使用 GUI 应用程序来执行此任务。
nmap -sP 10.10.98.0/24 > scan1.txt
nmap -sP 10.10.98.0/24 > scan2.txt
diff scan1.txt scan2.txt
在典型的网络管理员桌面上,您可能会使用带有图形用户界面的 Linux 或 Windows 安装;在这种情况下,Zenmap 可能是您工具集中的一个不错的选择。
在 Debian 系统上安装缺失的固件
许多 Linux 发行版默认情况下更喜欢包括只有自由软件和驱动程序,Debian 也属于这一类。这可能是出于道德决定或许可限制,但结果可能是特定的网络卡或硬件设备在开箱即用时无法正常工作。无线网卡通常是这种情况的典型例子。其中一个例子是英特尔无线网卡。虽然在终端用户发行版(如 Ubuntu、Linux Mint 等)中,这些通常无需任何调整即可正常工作,但企业发行版(如 Debian)通常不包括这些,并强制您通过额外的步骤。原因是这些网卡要正常工作所需的软件不是开源的,因此决定不将其包含在默认存储库中。幸运的是,通常这并不太难纠正,只要您知道步骤即可。
在 Debian 系统上,有一个非自由参数,可以添加到您的 APT 源中,告诉发行版在搜索和安装软件时包括这些软件包。但在这样做之前,请确保您确实需要额外的固件。一个明显的迹象是,如果 Debian 在启动时抱怨缺少固件。在不重新启动的情况下,您可能会看到日志中有关硬件设备缺少固件的错误。要查看系统上可能抱怨缺少固件的任何输出,请尝试以下命令:
dmesg |grep firmware
要在 Debian 中添加 APT 源的非自由组件,首先备份您的原始sources.list
文件:
# cp /etc/apt/sources.list /etc/apt/sources.list.bak
然后,将非自由参数添加到主存储库。在我的 Debian Jessie 系统上,该行如下:
deb http://ftp.us.debian.org/debian/ jessie main contrib non-free
完成后,使用以下命令刷新您的源:
# apt-get update
从这一点开始,非自由的二进制软件包应该对您可用。您可以通过搜索和列出系统上可用的固件软件包来确认这一点。输出应该包含几个nonfree
软件包。要执行此搜索,请尝试以下命令:
aptitude search firmware
例如,如果firmware-linux-nonfree
出现在您的可用软件包列表中,那么您已经正确执行了这些步骤。
不幸的是,详细列出 Debian 的硬件兼容性和每个所需的固件将超出本书的范围。然而,日志应该让您对缺少的固件有一个大致的了解,从而可以在软件包数据库中搜索特定的软件包。通常,从dmesg
中关于无法加载固件的输出复制一行并进行谷歌搜索,将带您找到解决情况所需的软件包。在我的情况下,我经常需要的固件包是firmware-iwlwifi
。此外,firmware-atheros
和firmware-b43-installer
也很常见。
排除 Network Manager 问题
Network Manager是用于管理 Linux 中的网络连接的工具。它由在后台运行的守护程序和大多数桌面发行版都包含的可选图形实用程序组成,以便随时显示您的连接状态。Network Manager 并不是必需的,但它简化了网络接口及其配置的管理。在许多实际网络中,Network Manager 通常是禁用的,而是使用静态 IP 地址。正如我之前提到的那样,我总是更喜欢静态租约而不是静态 IP。使用静态 IP,您没有中央管理点,并且需要手动跟踪并更改服务器的 IP 地址。因此,我建议您保持 Network Manager 运行。它将监视连接,激活您的 DHCP 客户端,然后从 DHCP 服务器接收 IP 地址租约。如果您设置了静态租约(保留),那么一旦 Network Manager 启动您的连接,您就已经准备好了。
在您已经排除为 Network Manager 本身的本地问题的网络问题的情况下,有几件事情可以帮助您准确定位问题。
首先,在 CentOS 系统上,请确保您的网络接口已配置为在启动时启动。出于我无法理解的某种原因,CentOS 实际上在安装过程中默认关闭您的网络接口。除非您在运行安装程序时将其打开,否则在启动后它也将默认处于禁用状态。如果接口未启用,则 Network Manager 将无法管理它。纠正这个问题只是简单地编辑接口的 init 脚本。您将在 CentOS 中的网络接口卡的 init 脚本找到在以下位置:/etc/sysconfig/network-scripts
。在我的系统上,我发现我的接口卡的init
脚本在/etc/sysconfig/network-scripts/ifcfg-enp0s3
,尽管您的接口名称当然会有所不同。
查看最后一行,您应该看到ONBOOT="yes"
。如果您没有看到,修改该行,然后重新启动网络:
# systemctl restart network
其次,在 Debian 和 CentOS 系统上,请确保 Network Manager 正在运行。这是那些命令在两个发行版中都相同的罕见情况之一。使用以下命令,我们可以检查 NetworkManager 守护程序的状态:
# systemctl status NetworkManager
在排除问题时,systemctl
可能非常有用,因为它不仅告诉您服务是否已启动,还会从日志中给出一些行,如果您遇到问题,可能会指引您朝正确的方向。
要完整查看 Network Manager 日志,您可以使用journalctl
:
journalctl -u NetworkManager
您还可以使用-f
标志来跟踪日志,这样您将在发生新条目时看到它们。在排除为什么机器无法连接到无线网络时,这是特别有用的。错误将在用户尝试连接时出现。以下示例显示了如何跟踪写入日志的 NetworkManager 输出。
journalctl -f -u NetworkManager
与大多数 systemd 单元一样,我们可以用一个简单的命令重新启动 Network Manager:
# systemctl restart NetworkManager
前面的命令可能看起来很简单,但出于某种原因,我不得不重新启动网络管理器的次数比我想象的要多。这在将一台机器从一个网络切换到另一个网络,或者从暂停中恢复时尤其如此(尽管这些问题主要只出现在最终用户工作站上)。
大多数情况下,网络管理器的问题很少,而且故障排除相对简单。使用 systemd 的journalctl
,我们可以观察网络管理器的输出并确定根本原因。在大多数情况下,问题将归结为网络卡配置错误。
总结
在本章中,我们介绍了一些可能出现在基于 Linux 的网络上的故障排除方法。虽然不可能详细列出所有可能出错的情况,但本章作为您可能面临的常见问题的起点。我们首先看了路由问题以及 DHCP 和 DNS 故障排除。此外,我们还介绍了诸如nmap
之类的有用的故障排除工具,以及缺少的固件安装概述,这可能是在 Debian 中设置网络卡所需的。最后,我们提供了有关故障排除网络管理器的信息。
随着这一切,本书也告一段落。感谢您与我一起走过 Linux 网络管理的世界。我希望这本书能引起您的共鸣,并帮助您更好地理解。与 Linux 一起工作是我做出的最佳职业选择,我要感谢所有的读者和同事,使这成为了一次美妙的经历。祝愿大家成功,希望您的 Linux 之旅对您像对我一样有益。