原文:
zh.annas-archive.org/md5/A72D356176254C9EA0055EAB3A38778D
译者:飞龙
前言
欢迎来到Linux 网络专业人士!如果您曾经想知道如何降低支持您的网络的主机和服务的成本,您来对地方了。或者,如果您正在考虑如何开始保护 DNS、DHCP 或 RADIUS 等网络服务,我们也可以帮助您。
如果有一个服务可以帮助您支持您的网络,我们已经尽力覆盖了如何进行基本配置,并帮助您开始保护该服务。在这个过程中,我们还尽力帮助您选择 Linux 发行版,向您展示如何使用 Linux 进行故障排除,并向您介绍一些您可能不知道需要的服务。
希望在本书中我们所走过的旅程能帮助您向您的网络添加新的服务,并且在这个过程中或许能更好地理解您的网络!
这本书适合谁
这本书适合几乎所有负责管理几乎任何类型网络基础设施的人。如果您对网络中事物的运作方式感兴趣,这本书适合您!如果您经常在想如何提供您的组织需要的各种网络服务,但又没有预算购买商业产品,您也会发现我们的讨论很有趣。我们将介绍我们讨论的每个 Linux 服务的工作原理,以及您如何在典型环境中配置它们。
最后,如果您关心攻击者如何看待您的网络资产,您会发现有很多有趣的内容!我们将讨论攻击者和恶意软件如何常见地攻击您网络上的各种服务,以及如何保护这些服务。
由于本书的重点是 Linux,您会发现我们所涵盖的部署和保护服务的预算更多地是通过您学习新鲜有趣的事物的热情和时间来衡量,而不是金钱!
本书涵盖内容
[第一章],欢迎来到 Linux 大家庭,包括 Linux 的简短历史和各种 Linux 发行版的描述。此外,我们还提供了一些建议,供您选择适合您组织的 Linux 发行版。
[第二章],基本的 Linux 网络配置和操作-使用本地接口,讨论了 Linux 中的网络接口配置,这对许多管理员来说可能是一个真正的障碍,特别是当决定不需要 GUI 时。在本章中,我们将讨论如何从命令行配置各种网络接口参数,以及 IP 和 MAC 层的基础知识。
[第三章],使用 Linux 和 Linux 工具进行网络诊断,涵盖了诊断和解决网络问题,这几乎是所有网络管理员每天都要面对的挑战。在本章中,我们将继续探讨上一章开始的内容,介绍 TCP 和 UDP 的基础知识。有了这些知识,我们将讨论使用本机 Linux 命令以及常见附加组件进行本地和远程网络诊断。最后,我们将讨论对无线网络进行评估。
[第四章],Linux 防火墙,解释了 Linux 防火墙对许多管理员来说可能是一个真正的挑战,特别是因为 iptables/ipchains 防火墙实现有多个不同的“版本”。我们将讨论 Linux 防火墙的演变,并实施它来保护 Linux 上的特定服务。
第五章《具有实际案例的 Linux 安全标准》涵盖了保护您的 Linux 主机,这始终是一个不断变化的目标,取决于在主机上实现的服务和部署到的环境。我们将讨论这些挑战,以及您可以用来指导安全决策的各种安全标准。特别是,我们将讨论《互联网安全中心》(CIS)的关键控制,并在 Linux 的 CIS 基准中解释一些建议。
第六章《Linux 上的 DNS 服务》解释了 DNS 在不同情况下的工作方式,以及如何在 Linux 上实现 DNS 服务,无论是内部还是面向互联网。我们还将讨论针对 DNS 的各种攻击,以及如何保护服务器免受这些攻击。
第七章《Linux 上的 DHCP 服务》涵盖了 DHCP,用于向客户工作站分配 IP 地址,以及向各种客户设备“推送”各种配置选项。在本章中,我们将说明如何在 Linux 上为传统工作站实现这一点,并讨论您应该考虑的其他设备的事项,例如 VoIP 电话。
第八章《Linux 上的证书服务》涵盖了证书,这在许多网络基础设施中经常被视为“鬼怪”。在本章中,我们试图揭开它们的工作原理,并介绍如何在 Linux 上为您的组织实现免费的证书颁发机构。
第九章《Linux 上的 RADIUS 服务》解释了如何在 Linux 上使用 RADIUS 作为各种网络设备和服务的认证。
第十章《Linux 的负载均衡器服务》解释了 Linux 是一个很好的负载均衡器,允许“免费”地将负载均衡服务与每个工作负载联系起来,而不是传统的昂贵和单一的“每个数据中心”负载均衡解决方案。
第十一章《Linux 中的数据包捕获和分析》讨论了使用 Linux 作为数据包捕获主机。本章涵盖了如何在网络方面实现这一点,以及探索各种过滤方法来获取解决问题所需的信息。我们使用各种攻击来说明如何完成这项工作!
第十二章《使用 Linux 进行网络监控》涵盖了使用 Linux 来通过 syslog 集中记录流量,以及在日志中发现关键字时进行实时警报。我们还讨论了使用 NetFlow 和相关协议记录网络流量模式的内容。
第十三章《Linux 上的入侵防范系统》解释了 Linux 应用程序用于警报和阻止常见攻击,以及向流量信息添加重要的元数据。在这方面,我们探讨了两种不同的解决方案,并展示了如何应用各种过滤器来发现流量和攻击中的各种模式。
第十四章《Linux 上的蜜罐服务》涵盖了使用蜜罐作为“欺骗主机”来分散和延迟攻击者,同时为防御者提供高保真度的警报。我们还讨论了使用蜜罐来研究公共互联网上恶意行为趋势的内容。
为了充分利用本书
在本书中,我们将大多数示例和构建基于 Ubuntu Linux 的默认安装。您当然可以在“裸机”硬件上安装 Ubuntu,但您可能会发现使用虚拟化解决方案(如 VMware(Workstation 或 ESXi)、VirtualBox 或 Proxmox)可以真正有助于您的学习体验(除了 VMware Workstation 外,所有这些解决方案都是免费的)。使用虚拟化选项,您可以在途中的已知良好点处拍摄“快照”,这意味着如果您在尝试工具或功能时弄乱了某些东西,只需轻松地撤消该更改并再次尝试。
此外,使用虚拟化还允许您制作主机的多个副本,以便您可以以逻辑方式实现特性或服务,而不是尝试将本书中讨论的所有服务都放在同一主机上。
在本书中,我们使用了几个 Linux 服务,大多数是在 Ubuntu Linux 版本 20(或更新版本)上实现的。这些服务在这里总结:
此外,我们使用或讨论了几个您可能不熟悉的“附加”Linux 工具:
随着本书的进行,大多数工具和服务都可以安装在单个 Linux 主机上。这对实验室设置很有效,但在真实网络中,您当然会将重要的服务器分布在不同的主机上。
作为预先构建或预打包的分发的一部分,我们探讨了一些工具。在这些情况下,您当然可以在您的虚拟化程序中安装相同的分发,但您也可以在该章节中跟随,以便对所展示的概念、方法和陷阱有一个良好的理解。
下载彩色图像
我们还提供了一个 PDF 文件,其中包含本书中使用的屏幕截图/图表的彩色图像。您可以在这里下载:www.packtpub.com/sites/default/files/downloads/9781800202399_ColorImages.pdf
。
下载示例代码文件
您可以从 GitHub 上下载本书的示例代码文件:github.com/PacktPublishing/Linux-for-Networking-Professionals
。如果代码有更新,将在现有的 GitHub 存储库中进行更新。
我们还有来自丰富图书和视频目录的其他代码包,可供下载
github.com/PacktPublishing/
。去看看吧!
使用的约定
本书中使用了许多文本约定。
文本中的代码
:表示文本中的代码字词、数据库表名、文件夹名、文件名、文件扩展名、路径名、虚拟 URL、用户输入和 Twitter 句柄。以下是一个示例:“所有这三个工具都是免费的,可以使用标准的apt-get install <package name>
命令进行安装。”
任何命令行输入或输出都以以下方式编写:
$ sudo kismet –c <wireless interface name>
粗体:表示新术语、重要单词或屏幕上看到的单词。例如,菜单或对话框中的单词会在文本中以这种方式出现。以下是一个示例:“在 Linux GUI 中,您可以通过单击顶部面板上的网络图标,然后选择设置来开始。”
提示或重要说明
看起来像这样。
联系我们
我们非常欢迎读者的反馈意见。
一般反馈:如果您对本书的任何方面有疑问,请在消息主题中提及书名,并通过电子邮件联系我们:customercare@packtpub.com。
勘误:尽管我们已经非常注意确保内容的准确性,但错误确实会发生。如果您在本书中发现错误,我们将不胜感激地接受您的报告。请访问www.packtpub.com/support/errata,选择您的书,点击勘误提交表单链接,并输入详细信息。
盗版:如果你在互联网上发现我们作品的任何形式的非法复制,我们将不胜感激,如果你能向我们提供地址或网站名称。请通过 copyright@packt.com 联系我们,并附上材料链接。
如果你有兴趣成为作者:如果你在某个专题上有专业知识,并且有兴趣撰写或为一本书做出贡献,请访问authors.packtpub.com。
分享你的想法
-
当你阅读完《Linux for Networking Professionals》后,我们很想听听你的想法!请点击这里直接进入亚马逊评论页面来分享你的反馈。
-
你的评论对我们和技术社区很重要,将帮助我们确保我们提供的内容质量卓越。
第一部分:Linux 基础
本节概述了读者可以选择的各种 Linux 选项,以及他们为什么可能选择 Linux 来提供各种网络功能或服务。此外,还深入介绍了基本的 Linux 网络配置。本节为随后的所有章节奠定了基础。
本书的这部分包括以下章节:
-
[第一章],欢迎来到 Linux 大家庭
-
[第二章],基本的 Linux 网络配置和操作 - 使用本地接口
第一章:欢迎来到 Linux 大家庭
本书探讨了 Linux 平台和各种基于 Linux 的操作系统-特别是 Linux 如何在网络服务方面发挥作用。我们将首先讨论操作系统的一些历史,然后再看其基本配置和故障排除。从那里开始,我们将通过在 Linux 上构建各种网络相关服务来工作,这些服务在大多数组织中可能经常看到。随着我们的进展,我们将在真实的主机上构建真实的服务,并着重于在进行每项服务时保护和故障排除。到我们完成时,您应该对这些服务中的每一个都足够熟悉,以便在您自己的组织中开始实施其中一些或全部服务。正如他们所说,“每个旅程都始于一步”,所以让我们迈出这一步,从对 Linux 平台的一般讨论开始。
在本章中,我们将通过探索 Linux 作为一系列操作系统来开始我们的旅程。它们都有关联,但每个都有自己独特的方式,具有不同的优势和特点。
我们将涵盖以下主题:
-
为什么 Linux 非常适合网络团队
-
主流数据中心 Linux
-
特殊的 Linux 发行版
-
虚拟化
-
为您的组织选择 Linux 发行版
为什么 Linux 非常适合网络团队
在本书中,我们将探讨如何使用 Linux 和基于 Linux 的工具来支持和故障排除您的网络,以及如何在 Linux 平台上安全部署常见的网络基础设施。
为什么要为这些目的使用 Linux?首先,Linux 的架构、历史和文化引导管理员进行脚本编写和自动化流程。虽然将这种情况推向极端可能会让人陷入有趣的境地,但编写例行任务的脚本可以真正节省时间。
事实上,编写非例行任务的脚本,比如每年需要做一次的事情,也可能是救命的-这意味着管理员不需要重新学习如何做 12 个月前做的那件事。
编写例行任务的脚本是一个更大的胜利。多年来,Windows 管理员已经了解到,在图形用户界面(GUI)中执行一项任务数百次会导致我们至少出错几次。另一方面,像这样编写脚本任务可以保证一致的结果。不仅如此,在网络上,管理员通常为数百或数千个站点执行操作,编写脚本通常是完成更大规模任务的唯一方法。
网络管理员更喜欢 Linux 平台的另一个原因是,Linux(以及之前的 Unix)自有网络以来就一直存在。在服务器端,Linux(或 Unix)服务是定义这些服务的东西,而匹配的 Windows 服务则是随着时间的推移基本上增长到特性平衡。
在工作站方面,如果您需要一个工具来管理或诊断网络上的某些东西,它可能已经安装好了。如果您寻找的工具尚未安装,只需一行命令即可安装和运行它,以及所需的任何其他工具、库或依赖项。而且添加该工具不需要许可费-在 Linux 上安装的 Linux 和任何工具(几乎没有例外)都是免费和开源的。
最后,在服务器和桌面方面,历史上,Linux 一直是免费的。即使现在,有利润的公司也为一些主要支持的发行版收取许可费(例如 Red Hat 和 SUSE),这些公司也提供这些发行版的免费版本。Red Hat 提供 Fedora Linux 和 CentOS,这两者都是免费的,并且在某种程度上充当了 Red Hat Enterprise Linux 中新功能的测试版本。openSUSE(免费)和 SUSE Linux(收费)也非常相似,SUSE 发行版经过了更严格的测试,并且版本升级的节奏更加规律。企业版本通常是按期限许可的,该许可证授予客户访问技术支持和在许多情况下的操作系统更新的权限。
许多公司选择操作系统的经过许可的企业版本,但许多其他公司选择在 OpenSUSE、CentOS 或 Ubuntu 的免费版本上构建其基础设施。免费 Linux 版本的可用性意味着许多组织可以以大大降低的 IT 成本运作,这在很大程度上影响了我们作为一个行业的发展方向。
为什么 Linux 很重要?
多年来,信息技术界的一个笑话是,明年总是会成为“Linux 桌面的一年”-在那一年,我们将停止为桌面和商业应用程序支付许可费,一切都将是免费和开源的。
相反,发生的是 Linux 一直在稳步地进入许多环境的服务器和基础设施方面。
Linux 已经成为大多数数据中心的支柱,即使这些组织认为它们是“仅限 Windows”的环境。许多基础设施组件在内部运行 Linux,并具有一个良好的 Web 前端,将其转变为供应商解决方案。如果您有存储区域网络(SAN),它很可能运行 Linux,您的负载均衡器,接入点和无线控制器也是如此。许多路由器和交换机运行 Linux,几乎所有新的软件定义的网络解决方案也是如此。
几乎所有信息安全产品都基于 Linux。传统防火墙和下一代防火墙,入侵检测和防范系统(IDS/IPS),安全信息和事件管理(SIEM)系统以及日志服务器-都是 Linux!
为什么 Linux 如此普遍?有很多原因:
-
这是一个成熟的操作系统。
-
它有一个集成的修补和更新系统。
-
基本功能很容易配置。操作系统上的更复杂功能可能比 Windows 上更难配置。请查看我们关于 DNS 或 DHCP 的章节以获取更多信息。
-
另一方面,在 Windows 环境中可能是出售产品的许多功能在 Linux 上是免费安装的。
-
由于 Linux 几乎完全基于文件,如果您是一个以 Linux 为基础的产品的供应商,很容易将其保持在已知基线。
-
只要有合适的(免费和开源)软件包、一些脚本和可能一些定制编码,您就可以在 Linux 上构建几乎任何东西。
-
如果选择正确的发行版,操作系统本身是免费的,这对于试图最大化利润的供应商或试图降低成本的客户来说是一个很好的动力。
如果新的基础设施即代码运动是吸引您的原因,那么您会发现几乎每种编程语言都在 Linux 中得到了代表,并且正在积极开发-从新语言如 Go 和 Rust,一直到 Fortran 和 Cobol。甚至源自 Windows 的 PowerShell 和.NET 也完全支持 Linux。大多数基础设施编排引擎(例如 Ansible、Puppet 和 Terraform)首先在 Linux 上开始并得到支持。
在今天的 IT 基础设施的云端,Linux 是免费的事实使得云服务提供商几乎从一开始就推动他们的客户朝着这一端发展。如果您订阅了任何被描述为“无服务器”或“作为服务”的云服务,背后很可能几乎全部是 Linux 的解决方案。
最后,现在我们已经看到 IT 的服务器和基础设施一面向 Linux 发展,我们应该注意到今天的手机正逐渐成为当今计算现实中最大的“桌面”平台。在今天的世界中,手机通常是基于 iOS 或 Android 的,这两者都是(你猜对了)基于 Unix/Linux 的!因此,“Linux 桌面年”已经通过改变桌面的定义悄悄地到来。
所有这些都使 Linux 对今天的网络或 IT 专业人员非常重要。本书侧重于将 Linux 用作网络专业人员的桌面工具箱,以及在 Linux 平台上安全配置和提供各种网络服务。
Linux 的历史
要了解 Linux 的起源,我们必须讨论 Unix 的起源。Unix 是在 20 世纪 60 年代末和 70 年代初在贝尔实验室开发的。丹尼斯·里奇和肯·汤普森是 Unix 的主要开发人员。实际上,Unix 这个名字是基于早期操作系统 Multics 的一个双关语,它启发了 Unix 的许多特性。
1983 年,理查德·斯托曼和自由软件基金会启动了 GNU(递归缩写-GNU 的不是 Unix)项目,旨在创建一个类 Unix 的操作系统,供所有人免费使用。在这一努力中产生了 GNU Hurd 内核,大多数人认为这是今天 Linux 版本的前身(SFS 希望我们称它们为 GNU/Linux)。
1992 年,Linus Torvalds 发布了 Linux,这是第一个完全实现的 GNU 内核。重要的是要注意,主流 Linux 通常被认为是可以用来创建操作系统的内核,而不是独立的操作系统。Linux 仍然由 Linus Torvalds 担任首席开发人员,但今天,有一个更大的个人和公司团队作为贡献者。因此,尽管从技术上讲,Linux 只指内核,在行业中,“Linux”通常指的是基于该内核构建的任何操作系统。
自 20 世纪 70 年代以来,已经发布了数百种不同的 Linux 版本。每个版本通常被称为发行版(或简称为 distro)。它们都基于当天的 Linux 内核,以及用于 OS 和更新的安装基础设施和存储库系统。大多数都有某种独特之处,无论是在基本软件包的混合还是发行版的重点-有些可能体积小,适合较小的硬件平台,有些可能专注于安全性,有些可能被设计为通用企业工作马操作系统,等等。
一些发行版在一段时间内一直是“主流”,而一些随着时间的推移而逐渐失去了流行。它们共享的是 Linux 内核,它们每个都建立在此基础上,以创建自己的发行版。许多发行版都是基于另一个发行版的操作系统,对其进行了足够的定制,以证明他们的实施是一个新的发行版。这一趋势使我们产生了“Linux 家族树”的概念-数十个发行版可以从一个共同的“根”发展出来。这在 DistroWatch 网站上得到了探讨。
作为 Linux 的替代品,特别是在 Intel/AMD/ARM 硬件领域,是伯克利软件发行版(BSD)Unix。BSD Unix 是原始贝尔实验室 Unix 的后代;它根本不是基于 Linux。然而,BSD 及其许多衍生版本仍然是免费的,并且与 Linux 共享许多特征(以及相当多的代码)。
直到今天,Linux 和 BSD Unix 的重点都是它们都是免费的操作系统。虽然商业版本和衍生版本当然是可用的,但几乎所有这些商业版本都有相应的免费版本。
在本节中,我们看了 Linux 在计算领域的历史和重要性。我们了解了 Linux 是如何出现的,以及它是如何在计算领域的某些部分中变得流行的。现在,我们将开始研究我们可以使用的不同 Linux 版本。这将帮助我们建立我们在本章后面做出选择使用哪个发行版的信息。
主流数据中心 Linux
正如我们讨论过的,Linux 不是一个单一的"东西",而是一个多样化甚至分裂的不同发行版的生态系统。每个 Linux 发行版都基于相同的 GNU/Linux 内核,但它们被打包成具有不同目标和理念的组,这使得组织在开始标准化其服务器和工作站平台时有多种选择。
我们在现代数据中心中常见的主要发行版是 Red Hat、SUSE 和 Ubuntu,另外还有 FreeBSD Unix 作为另一种选择(尽管现在比过去不那么受欢迎)。这并不是说其他发行版不会出现在桌面或数据中心,但这些是你经常看到的。它们都有桌面和服务器版本,服务器版本通常更加"精简",去掉了办公生产力、媒体工具,通常也去掉了图形用户界面。
Red Hat
Red Hat 最近被 IBM 收购(2019 年),但仍将 Fedora 作为其主要项目之一。Fedora 既有服务器版本,也有桌面版本,并且仍然可以免费获取。Fedora 的商业版本是 Red Hat Enterprise Linux(RHEL)。RHEL 是商业许可的,并且有正式的支持渠道。
CentOS 最初是一个免费的、社区支持的 Linux 版本,与 Red Hat Enterprise 版本在功能上兼容。这使得它在许多组织中的服务器实施中非常受欢迎。在 2014 年 1 月,Red Hat 将 CentOS 纳入其旗下,成为该发行版的正式赞助商。2020 年底,宣布 CentOS 将不再作为 RHEL 兼容的发行版进行维护,而是会在 Fedora 和 RHEL 之间"适应",既不会像"前沿"那样新,也不会像 RHEL 那样稳定。作为这一变化的一部分,CentOS 更名为 CentOS Stream。
最后,Fedora 是具有最新功能和代码的发行版,新功能在其中得到尝试和测试。CentOS Stream 发行版更加稳定,但仍处于 RHEL 的"上游"。RHEL 是一个稳定的、经过充分测试的操作系统,具有正式的支持服务。
Oracle/Scientific Linux
Oracle/Scientific Linux 也出现在许多数据中心(以及在 Oracle 的云服务中)。Oracle Linux 基于 Red Hat,并宣传他们的产品与 RHEL 完全兼容。Oracle Linux 可以免费下载和使用,但来自 Oracle 的支持是基于订阅的。
SUSE
OpenSUSE 是 SUSE Linux 基于的社区发行版,类似于 RedHat Enterprise Linux 基于 Fedora 的方式。
SUSE Linux Enterprise Server(通常称为 SLES)在 Linux 早期是美国 Red Hat 发行版的主要欧洲竞争对手。然而,那些日子已经过去,现代数据中心中德 SUSE Linux(几乎)和在意大利一样常见。
与 RedHat 和 CentOS 之间的关系类似,SUSE 维护着桌面和服务器版本。此外,他们还维护着一个“高性能”版本的操作系统,该版本具有针对并行计算进行了优化并预先安装了工具。OpenSUSE 占据了 SLES 的“上游”位置,可以在这个发行版中引入一些可能不总是第一次就成功的更改。OpenSUSE Tumbleweed 发行版具有最新的功能和版本,而 OpenSUSE Leap 在版本和稳定性上更接近操作系统的 SLE 版本。这种模式与 RedHat 系列发行版相似并非偶然。
Ubuntu
Ubuntu Linux 由 Canonical 维护,可以免费下载,没有单独的商业或“上游”选项。它基于 Debian,并且有独特的发布周期。服务器和桌面版本的新版本每 6 个月发布一次。每 2 年发布一个长期支持(LTS)版本,对服务器和桌面的 LTS 版本的支持从发布日期开始为期 5 年。与其他大型参与者一样,支持是基于订阅的,尽管来自社区的免费支持也是一个可行的选择。
正如你所期望的,Ubuntu 的服务器版本更专注于核心操作系统、网络和数据中心服务。在安装服务器版本时,通常会取消选择 GUI。然而,桌面版本安装了一些用于办公生产力、媒体创作和转换以及一些简单游戏的软件包。
BSD/FreeBSD/OpenBSD
正如我们之前提到的,BSD 家族的“树”是从 Unix 而不是 Linux 内核派生的,但有很多共享的代码,特别是当你看那些不是内核的包时。
FreeBSD 和 OpenBSD 在历史上被视为比早期版本的 Linux“更安全”。因此,许多防火墙和网络设备都是基于 BSD 操作系统家族构建的,并且至今仍在使用这个操作系统。更“显眼”的 BSD 变体之一是苹果的商业操作系统OS X(现在是macOS)。这是基于 Darwin,而 Darwin 又是 BSD 的一个分支。
然而,随着时间的推移,Linux 已经发展到具有与 BSD 大部分相同的安全功能,直到 BSD 可能比大多数 Linux 替代品具有更安全的默认设置。
现在 Linux 有安全模块可用,可以显著提高其安全性。SELinux和AppArmor是两个主要的可用选项。SELinux 起源于 Red Hat 发行版,并且在 SUSE、Debian 和 Ubuntu 上完全实现。AppArmor 通常被视为一个更简单的实现选项,具有许多(但不是全部)相同的功能。AppArmor 在 Ubuntu、SUSE 和大多数其他发行版上都可用(但不包括 RHEL)。这两个选项都采用基于策略的方法,显著提高了安装它们的操作系统的整体安全性。
随着 Linux 向更注重安全性的发展,特别是现代 Linux 发行版可用(并建议)的 SELinux 或 AppArmor,BSD 与 Linux 之间的“更安全”论点现在主要是历史上的看法,而不是事实。
专业 Linux 发行版
除了主流的 Linux 发行版外,还有几个发行版是专门为特定需求而构建的。它们都是基于更主流的发行版构建的,但是专门定制以满足特定的需求。我们将在这里描述一些你最有可能看到或用作网络专业人士的发行版。
大多数商业网络附加存储(NAS)和 SAN 提供商都基于 Linux 或 BSD。在撰写本文时,开源 NAS/SAN 服务的领先者似乎是TrueNAS(以前是FreeNAS)和XigmaNAS(以前是NAS4Free)。两者都有免费和商业版本。
开源防火墙
网络和安全公司提供各种防火墙设备,其中大多数基于 Linux 或 BSD。许多公司提供免费防火墙,一些较受欢迎的包括 pfSense(提供免费版本和预构建硬件解决方案)、OPNsense(免费提供,可捐赠)和 Untangle(也有商业版本)。Smoothwall 是另一种选择,提供免费和商业版本。
在本书中,我们将探讨在 Linux 中使用板载防火墙来保护单个服务器,或者保护网络边界。
Kali Linux
从apt
工具集演变而来)。
SIFT
SIFT 是由 SANS 研究所的取证团队编写的一个发行版,专注于数字取证和事件响应工具和调查。与 Kali 类似,SIFT 的目标是成为一个在一个领域中的“一站式”免费/开源工具 - 数字取证和事件响应(DFIR)。在历史上,这是一个基于 Ubuntu 的发行版,但近年来情况已经改变 - SIFT 现在也作为一个脚本分发,可以在 Ubuntu 桌面或基于 Ubuntu 的 Windows 服务上安装这些工具。
Security Onion
Security Onion 与 Kali Linux 类似,它包含了几种信息安全工具,但其重点更多地是从防御者的角度来看。这个发行版侧重于威胁猎杀、网络安全监控和日志管理。这个发行版中的一些工具包括 Suricata、Zeek 和 Wazuh 等。
虚拟化
虚拟化在 Linux 的采用和能够同时使用多个发行版的能力中发挥了重要作用。通过本地虚拟化程序,网络专业人员可以在他们的笔记本电脑或台式电脑上运行数十个不同的“机器”。虽然 VMware 是这个领域的先驱(桌面和专用虚拟化),但它们已经被 Xen、KVM、VirtualBox 和 QEMU 等虚拟化程序所取代,仅举几例。在撰写本文时,VMware 的产品都是商业产品(除了 VMware Player),而其他列出的解决方案在当时仍然是免费的。VMware 的旗舰虚拟化程序 ESXi 也可以作为独立产品免费获得。
Linux 和云计算
Linux 的不断稳定以及虚拟化现在已经成为主流,从许多方面来看,这使得我们现代云生态系统成为可能。再加上部署和维护后端基础设施的自动化能力的不断增强,以及开发 Web 应用程序和应用程序编程接口(API)开发人员可用的复杂性,我们得到的就是今天的云基础设施。其中一些关键特性如下:
-
多租户基础设施,每个客户在云中维护自己的实例(虚拟服务器和虚拟数据中心)。
-
通过月份或更常见的资源使用时间的细粒度成本。
-
可靠性与许多现代数据中心一样好甚至更好(尽管最近的故障表明当我们把太多的鸡蛋放在同一个篮子里时会发生什么)。
-
使得自动化基础设施相对容易的 API,以至于对于许多公司来说,配置和维护他们的基础设施已经成为一种编码活动(通常称为基础设施即代码)。
-
这些 API 使得根据需要扩展(或缩减)容量成为可能,无论是存储、计算、内存、会话计数还是所有这四种。
云服务是为了盈利,尽管 - 任何决定将他们的数据中心原样转移到云服务的公司很可能会发现,所有这些小费用随着时间的推移会累积起来,最终达到或超过他们本地数据中心的成本。从美元的角度来看,这仍然往往是有吸引力的,因为这些美元是花在可以更容易地直接归因于操作性支出的地方,而不是本地资本支出模型(通常称为 Cap-Ex 与 Op-Ex 模型)。
正如你所看到的,将数据中心迁移到云服务确实为一个组织带来了许多好处,这在本地模型中可能不会有这个选项。随着更多的仅云功能被利用,这一点变得更加明显。
为你的组织选择 Linux 发行版
在许多方面,你选择数据中心的发行版并不重要 - 主要的发行版都有类似的功能,通常具有相同的组件,并且通常具有类似的供应商或社区支持选项。然而,由于这些发行版之间的差异,重要的是选择一个发行版(或一组类似的发行版)。
期望的结果是你的组织标准化一个发行版,你的团队可以在其中发展他们的专业知识。这也意味着你可以与更高级的支持和故障排除团队合作,无论是咨询组织、付费供应商支持团队,还是各种互联网论坛上的一群志同道合的人。许多组织与“三大巨头”之一(红帽、SUSE 或 Canonical,取决于他们的发行版)购买支持合同。
你不想出现的情况是我见过一些客户陷入的境地。他们雇佣了一个渴望学习的人,一年后,他们发现他们在那一年建造的每台服务器都运行在不同的 Linux 发行版上,每台服务器都略有不同。这是你的基础设施成为永无止境的“科学实验”的捷径!
与另一位客户形成鲜明对比 - 他们的第一台服务器是SUSE Linux for SAP,正如其名称所示,这是一台打包了客户购买的 SAP 应用程序(SAP HANA)的 SUSE Linux 服务器。随着更多服务的增加,他们坚持使用 SUSE 平台,但选择了“真正的”SLES 发行版。这使他们保持了单一的操作系统,同样对他们来说,与 SUSE 保持了单一的支持许可证。他们能够将培训和专业知识集中在 SUSE 上。对他们来说,另一个关键的好处是,随着他们添加更多的服务器,他们能够应用单一的更新和补丁“流”,并采用分阶段的方法。在每个补丁周期中,不太关键的服务器首先被打补丁,然后在他们的测试完成后几天后,核心业务应用服务器才被打补丁。
选择发行版的主要建议是坚持选择较大的发行版之一。如果你团队中的人对其中一个发行版有强烈的感觉,那么一定要考虑这一点。你可能希望选择离主流发行版较近,这样你就可以在你的组织内使用它,这是一个经常维护并且有付费订阅模式支持的发行版 - 即使你今天觉得你不需要付费支持,也许将来情况就不同了。
总结
现在我们已经讨论了 Linux 的历史,以及几个主要的发行版,我希望你现在能更好地理解操作系统在我们社会中的历史和核心重要性。特别是,我希望你有一些好的标准来帮助你为你的基础设施选择一个发行版。
在本书中,我们将选择 Ubuntu 作为我们的发行版。它是一个免费的发行版,在其 LTS 版本中,我们可以依赖的操作系统,当你在讨论的各种场景、构建和示例中工作时,它会得到支持。它也是 Windows 的本地发行版(在 Windows 服务中用于 Linux)。这使得它成为一个容易熟悉的发行版,即使你没有服务器或工作站硬件可以使用,甚至没有虚拟化平台可以测试。
在下一章中,我们将讨论如何将您的 Linux 服务器或工作站连接到网络。我们将演示如何使用本地接口,并添加 IP 地址、子网掩码以及任何必要的路由,以使您的 Linux 主机在新的或现有网络中正常工作。
进一步阅读
-
Red Hat Linux:
www.redhat.com/en
-
Fedora:
getfedora.org/
-
CentOS:
www.centos.org/
-
SUSE Linux:
www.suse.com/
-
OpenSUSE:
www.opensuse.org/
-
Ubuntu Linux:
ubuntu.com/
-
Windows Subsystem for Linux:
docs.microsoft.com/en-us/
docs.microsoft.com/en-us/windows/wsl/about
-
FreeBSD Unix:
www.freebsd.org/
-
OpenBSD Unix:
www.openbsd.org/
-
Linux/BSD differences:
www.howtogeek.com/190773/htg-explains-whats-the-difference-between-linux-and-bsd/
-
TrueNAS:
www.truenas.com/
-
XigmaNAS:
www.xigmanas.com/
-
pfSense:
www.pfsense.org/
-
OPNsense:
opnsense.org/
-
Untangle:
www.untangle.com/untangle
-
Kali Linux:
www.kali.org/
-
SIFT:
digital-forensics.sans.org/community/downloads
;www.sans.org/webcasts/started-sift-workstation-106375
-
Security Onion:
securityonionsolutions.com/software
-
Kali Linux:
www.kali.org/
第二章:基本 Linux 网络配置和操作-处理本地接口
在本章中,我们将探讨如何在 Linux 主机上显示和配置本地接口和路由。尽可能地,我们将讨论执行这些操作的新旧命令。这将包括显示和修改 IP 地址、本地路由和其他接口参数。在此过程中,我们将讨论如何使用二进制方法构建 IP 地址和子网地址。
本章应该为我们在后续章节中涵盖的主题,如故障排除网络问题、加固我们的主机和安装安全服务,奠定坚实的基础。
本章涵盖的主题如下:
-
处理网络设置-两组命令
-
显示接口 IP 信息
-
IPv4 地址和子网掩码
-
为接口分配 IP 地址
技术要求
在本章和其他每一章中,当我们讨论各种命令时,鼓励您在自己的计算机上尝试。本书中的命令都是在 Ubuntu Linux 20 版(长期支持版)上演示的,但在几乎任何 Linux 发行版上,这些命令应该基本相同或非常相似。
处理网络设置-两组命令
在大多数人熟悉的 Linux 寿命中,ifconfig(接口配置)和相关命令一直是 Linux 操作系统的主要组成部分,以至于现在在大多数发行版中已经被弃用,但仍然是许多系统和网络管理员的常用命令。
为什么要替换这些旧的网络命令?有几个原因。一些新硬件(特别是 InfiniBand 网络适配器)不受旧命令的良好支持。此外,随着 Linux 内核多年来的变化,旧命令的操作随着时间的推移变得越来越不一致,但是在向后兼容性方面的压力使得解决这个问题变得困难。
旧命令在net-tools
软件包中,新命令在iproute2
软件包中。新管理员应该专注于新命令,但熟悉旧命令仍然是一件好事。仍然很常见的是发现运行 Linux 的旧计算机,这些机器可能永远不会更新,仍然使用旧命令。因此,我们将涵盖两种工具集。
这个教训是,在 Linux 世界中,变化是不断的。旧命令仍然可用,但不是默认安装的。
要安装旧命令,请使用此命令:
robv@ubuntu:~$ sudo apt install net-tools
[sudo] password for robv:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following package was automatically installed and is no longer required:
libfprint-2-tod1
Use 'sudo apt autoremove' to remove it.
The following NEW packages will be installed:
net-tools
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 0 B/196 kB of archives.
After this operation, 864 kB of additional disk space will be used.
Selecting previously unselected package net-tools.
(Reading database ... 183312 files and directories currently installed.)
Preparing to unpack .../net-tools_1.60+git20180626.aebd88e-1ubuntu1_amd64.deb .. .
Unpacking net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...
Setting up net-tools (1.60+git20180626.aebd88e-1ubuntu1) ...
Processing triggers for man-db (2.9.1-1) ...
您可能会注意到install
命令及其输出中的一些内容:
sudo
:使用了sudo
命令-/etc/sudoers
。在大多数发行版中,默认情况下,在安装操作系统时定义的userid
会自动包含在该文件中。可以使用visudo
命令添加其他用户或组。
为什么使用sudo
?安装软件或更改网络参数以及许多其他系统操作都需要提升的权限-在多用户企业系统上,您不希望非管理员的人进行这些更改。
因此,如果sudo
如此强大,为什么我们不以 root 身份运行所有操作呢?主要是因为这是一个安全问题。当然,如果您拥有 root 权限,一切都会正常工作。但是,任何错误和打字错误都可能导致灾难性的结果。此外,如果您以正确的权限运行并且碰巧执行了一些恶意软件,那么恶意软件将具有相同的权限,这显然不理想!如果有人问,是的,Linux 恶意软件确实存在,并且从一开始就一直存在于操作系统中。
apt
:使用apt
命令 -apt
是 Ubuntu、Debian 和相关发行版上的默认安装程序,但不同发行版之间的软件包管理应用程序会有所不同。除了apt
及其等效命令外,仍然支持从下载文件进行安装。Debian、Ubuntu 和相关发行版使用deb
文件,而许多其他发行版使用rpm
文件。总结如下:
所以,现在我们有了一大堆新命令要看,我们如何获取更多关于它们的信息呢?man
(手册)命令在 Linux 中有大多数命令和操作的文档。例如,apt
的man
命令可以使用man apt
命令打印;输出如下:
图 2.1 - apt man 页面
在本书中介绍新命令时,花点时间使用man
命令进行复习 - 本书更多是为了指导你的旅程,而不是替代实际操作系统文档。
现在我们已经讨论了现代和传统工具,然后安装了传统的net-tools
命令,那么这些命令是什么,它们是做什么的呢?
显示接口 IP 信息
在 Linux 工作站上显示接口信息是一个常见的任务。特别是如果你的主机适配器被设置为自动配置,例如使用动态主机配置协议(DHCP)或 IPv6 自动配置。
正如我们讨论过的,有两组命令可以做到这一点。ip
命令允许我们在新操作系统上显示或配置主机的网络参数。在旧版本中,你会发现使用ifconfig
命令。
ip
命令将允许我们显示或更新 IP 地址、路由信息和其他网络信息。例如,要显示当前 IP 地址信息,请使用以下命令:
ip address
ip
命令支持ip addr
或甚至ip a
都会给你相同的结果:
robv@ubuntu:~$ ip ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:33:2d:05 brd ff:ff:ff:ff:ff:ff
inet 192.168.122.182/24 brd 192.168.122.255 scope global dynamic noprefixroute ens33
valid_lft 6594sec preferred_lft 6594sec
inet6 fe80::1ed6:5b7f:5106:1509/64 scope link noprefixroute
valid_lft forever preferred_lft forever
你会发现,即使是最简单的命令有时也会返回比你想要的更多的信息。例如,你会看到命令行选项中的-4
或-6
:
robv@ubuntu:~$ ip -4 ad
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.122.182/24 brd 192.168.122.255 scope global dynamic noprefixroute ens33
valid_lft 6386sec preferred_lft 6386sec
在这个输出中,你会看到loopback
接口(一个逻辑的内部接口)的 IP 地址是127.0.0.1
,以及以太网接口ens33
的 IP 地址是192.168.122.182
。
现在是一个绝佳的时机输入man ip
并复习我们可以使用这个命令做的各种操作:
图 2.2 - ip man 页面
ifconfig
命令与ip
命令有非常相似的功能,但正如我们所指出的,它主要出现在旧版本的 Linux 上。传统命令都是有机地发展起来的,功能都是按需添加的。这导致我们处于一个状态,随着显示或配置更复杂的事物,语法变得越来越不一致。而更现代的命令是从头开始设计的,以保持一致性。
让我们使用传统命令来重复我们的努力;要显示接口 IP,只需输入ifconfig
:
robv@ubuntu:~$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400
inet 192.168.122.22 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::1ed6:5b7f:5106:1509 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:33:2d:05 txqueuelen 1000 (Ethernet)
RX packets 161665 bytes 30697457 (30.6 MB)
RX errors 0 dropped 910 overruns 0 frame 0
TX packets 5807 bytes 596427 (596.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 1030 bytes 91657 (91.6 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1030 bytes 91657 (91.6 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
正如你所看到的,基本上是以稍微不同的格式显示相同的信息。如果你查看这两个命令的man
页面,你会发现ip
命令的选项更一致,并且没有太多的 IPv6 支持 - 例如,原生情况下你无法选择只显示 IPv4 或 IPv6。
显示路由信息
在现代网络命令中,我们将使用完全相同的ip
命令来显示我们的路由信息。而且,正如你所期望的,命令是ip route
,可以缩写为ip r
:
robv@ubuntu:~$ ip route
default via 192.168.122.1 dev ens33 proto dhcp metric 100
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.156 metric 100
robv@ubuntu:~$ ip r
default via 192.168.122.1 dev ens33 proto dhcp metric 100
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.156 metric 100
从这个输出中,我们看到我们有一个指向192.168.122.1
的默认路由。默认路由就是这样 - 如果一个数据包被发送到不在路由表中的目的地,主机将把该数据包发送到其默认网关。路由表总是会优先选择“最具体”的路由 - 最接近目的地 IP 的路由。如果没有匹配,那么最具体的路由就会走向默认网关,它的路由是0.0.0.0 0.0.0.0
(换句话说,如果它不匹配其他任何东西的路由)。主机假设默认网关 IP 属于路由器,然后(希望)知道下一步该把该数据包发送到哪里。
我们还看到了到169.254.0.0/16
的路由。这被称为链路本地地址,在 RFC 3927 中定义。RFC代表请求评论,它作为互联网标准在开发过程中使用的非正式同行评审的一部分。已发布的 RFC 列表由IETF(互联网工程任务组)维护,网址为 https://www.ietf.org/standards/rfcs/。
链路本地地址只在当前子网中运行 - 如果主机没有静态配置的 IP 地址,并且 DHCP 没有分配地址,它将使用 RFC 中定义的前两个八位字节(169.254
),然后计算最后两个八位字节,将它们随机分配。经过 Ping/ARP 测试(我们将在第三章中讨论 ARP,使用 Linux 和 Linux 工具进行网络诊断),以确保这个计算出的地址实际上是可用的,主机就准备好进行通信了。这个地址只能与同一网络段上的其他 LLA 地址通信,通常使用广播和多播协议,如 ARP,Alljoyn 等来“找到”彼此。为了澄清,这些地址几乎从不在真实网络中使用,它们是在绝对没有其他选择的情况下使用的地址。为了混淆,微软将这些地址称为不同的东西 - 自动私有互联网协议地址(APIPA)。
最后,我们看到了到本地子网的路由,这种情况下是192.168.122.0/24
。这被称为连接路由(因为它连接到该接口)。这告诉主机在自己的子网中与其他主机通信时不需要进行路由。
这组路由在简单网络中非常常见 - 默认网关,本地段,就是这样。在许多操作系统中,除非主机实际上使用链路本地地址,否则你不会看到169.254.0.0
子网。
在传统方面,有多种方法可以显示当前的路由集。典型的命令是netstat -rn
用于网络状态,显示路由和数字显示。然而,route
是一个独立的命令(我们稍后会看到为什么):
robv@ubuntu:~$ netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
0.0.0.0 192.168.122.1 0.0.0.0 UG 0 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 ens33
robv@ubuntu:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.122.1 0.0.0.0 UG 100 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
这些显示了相同的信息,但现在我们有了两个额外的命令 - netstat
和route
。传统的网络工具集往往为每个目的都有一个单独的命令,并且在这种情况下,我们看到了其中两个命令有相当大的重叠。对于新手来说,了解所有这些命令并保持它们不同的语法是一项挑战。ip
命令集使这变得简单得多!
无论您最终使用哪种工具集,现在您都具备了建立和检查 IP 寻址和路由的基础知识,这将为您的主机提供基本的连接性。
IPv4 地址和子网掩码
在前一节中,我们简要讨论了 IP 地址,但让我们更详细地讨论一下。IPv4 允许您通过为每个设备分配一个地址和子网掩码来唯一地寻址子网中的每个设备。例如,在我们的示例中,IPv4 地址是192.168.122.182
。IPv4 地址中的每个八位组的范围可以是0-255
,子网掩码是/24
,通常表示为255.255.255.0
。直到我们将事情分解为二进制表示,这似乎很复杂。255
的二进制是11111111
(8 位),其中有 3 个这样的分组组成 24 位。因此,我们的地址和掩码表示的含义是,当进行掩码处理时,地址的网络部分是192.168.122.0
,地址的主机部分是182
,范围是1-254
。
分解如下:
如果我们需要一个更大的子网怎么办?我们只需将掩码向左移动几位。例如,对于 20 位子网掩码,我们有以下内容:
这使得掩码的第三个八位组为0b11110000
(注意简写的0b
表示“二进制”),在十进制中转换为240
。这将第三个八位组的网络掩码为0b01110000
或112
。这将我们的主机地址范围增加到第三个八位组的0-15
(0 – 0b1111
),第四个八位组的0-255
(0 – 0b11111111
),或者总共3824
(15 x 255 – 1)(我们将在下一节讨论-1
)。
您可以看到,保留一个可以进行二进制到十进制转换的计算器应用对于网络专业人员来说是一个方便的事情!确保它也可以进行十六进制(16 进制
)转换;我们将在几分钟内深入探讨这一点。
现在我们已经掌握了十进制和特别是二进制中的地址和子网掩码的处理技巧,让我们扩展一下,并探讨如何用它来说明其他寻址概念。
特定用途地址
有一些需要涵盖的特殊用途地址,以进一步探讨 IP 地址在本地子网中的工作方式。首先,如果地址中的所有主机位都设置为1
,那就是广播地址。如果您向广播地址发送信息,它将发送到子网中的所有网络接口并被所有网络接口读取。
因此,在我们的两个例子中,/24
网络的广播如下:
换句话说,我们有一个广播地址为192.168.122.255
。
/20
网络的广播如下:
或者,我们可以转换回十进制,得到广播地址为192.168.127.255
。
将 IPv4 地址的网络和主机部分之间的边界移动会让人想起地址类的概念。当转换为二进制时,前几个字节定义了该地址的所谓类别子网掩码。在大多数操作系统中,如果您在 GUI 中设置 IP 地址,通常会默认填入这个类别子网掩码。这些二进制到子网掩码的分配如下:
这定义了网络的默认类别子网掩码。我们将在接下来的两节中深入探讨这一点。
从所有这些内容中,您可以看到为什么大多数管理员使用255.255.255.0
或255.255.0.0
。任何其他选择都会在每次添加新成员时变得混乱,并可能导致服务器或工作站配置错误。此外,每次需要设置或解释网络地址时都要“做数学”并不吸引大多数人。
我们刚刚触及的第二种特殊地址是多播地址。多播地址用于将多个设备包括在一个对话中。例如,您可以使用多播地址将相同的视频流发送到多个网络连接的显示器,或者如果您正在设置语音/视频应用中的电话会议或会议。本地网络的多播地址采用以下形式:
最后的 11 位(3+8)通常形成各种多播协议的“众所周知的地址”。一些常见的多播地址如下:
已知的完整注册的多播地址列表由IANA(互联网编号分配机构)维护,网址为 https://www.iana.org/assignments/multicast-addresses/multicast-addresses.xhtml。虽然这可能看起来很全面,但供应商通常会在这个地址空间中创建自己的多播地址。
这是多播地址的基本介绍——它比这复杂得多,甚至有整本书专门讨论它的设计、实施和理论。我们所讨论的足以让你有一个大致的概念,足以开始。
在广播和多播地址已经涵盖的情况下,让我们讨论在你的环境中最有可能使用的 IP 地址“家族”。
私有地址——RFC 1918
另一组特殊地址是 RFC 1918 地址空间。RFC 1918 描述了一系列为组织内部使用而分配的 IP 子网。这些地址不能在公共互联网上使用,因此必须在将流量路由到它们或从它们路由到公共互联网之前使用网络地址转换(NAT)进行转换。
RFC1918 地址如下:
-
10.0.0.0/8
(A 类) -
172.16.0.0
到172.31.0.0 / 16
(B 类)(这可以总结为172.16.0.0/12
) -
192.168.0.0/16
(C 类)
这些地址为组织提供了一个大的 IP 空间供内部使用,所有这些地址都保证不会与公共互联网上的任何内容发生冲突。
作为一个有趣的练习,你可以使用这些 RFC 1918 子网来验证默认地址类,方法是将每个子网的第一个八位转换为二进制,然后将它们与最后一节中的表进行比较。
RFC 1918 规范在这里完全记录:https://tools.ietf.org/html/rfc1918。
现在我们已经讨论了 IP 地址和子网掩码的二进制方面,以及各种特殊的 IP 地址组,我相信你已经厌倦了理论和数学,想要回到与 Linux 主机的命令行玩耍!好消息是,我们仍然需要讨论 IPv6(IP 版本 6)的寻址位和字节。更好的消息是,它将在附录中,这样我们就可以让你尽快到键盘上!
现在我们已经牢固掌握了显示 IP 参数并对 IP 地址有了很好的理解,让我们配置一个 IP 接口以供使用。
为接口分配 IP 地址
分配永久的 IPv4 地址是你可能需要在构建的每台服务器上做的事情。幸运的是,这很简单。在新的命令集中,我们将使用nmcli
命令(manual
)。我们将以nmcli
格式显示网络连接:
robv@ubuntu:~$ sudo nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 02ea4abd-49c9-3291-b028-7dae78b9c968 ethernet ens33
我们的连接名称是有线连接 1
。不过,我们不需要每次都输入这个,我们可以通过输入Wi
然后按Tab来完成名称的选项。另外,请记住nmcli
将允许缩短命令子句,所以我们可以使用mod
代替modify
,con
代替connection
等等。让我们继续我们的命令序列(注意最后一个命令中参数是如何缩短的):
$ sudo nmcli connection modify "Wired connection 1" ipv4.addresses 192.168.122.22/24
$
$ sudo nmcli connection modify "Wired connection 1" ipv4.gateway 192.168.122.1
$
$ sudo nmcli connection modify "Wired connection 1" ipv4.dns "8.8.8.8"
$
$ sudo nmcli con mod "Wired connection 1" ipv4.method manual
$
Now, let's save the changes and make them "live":
$ sudo nmcli connection up "Wired connection 1"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
$
使用传统方法,我们所有的更改都是通过编辑文件完成的。而且仅仅是为了好玩,文件名和位置会因发行版而异。这里显示了最常见的编辑和文件。
要更改 DNS 服务器,请编辑/etc/resolv.conf
并更改nameserver
行以反映所需的服务器 IP:
nameserver 8.8.8.8
要更改 IP 地址、子网掩码等,编辑/etc/sysconfig/network-scripts/ifcfg-eth0
文件,并按以下方式更新值:
DEVICE=eth0
BOOTPROTO=none
ONBOOT=yes
NETMASK=255.255.255.0
IPADDR=10.0.1.27
如果你的默认网关在这个接口上,你可以添加这个:
GATEWAY=192.168.122.1
再次注意,在不同的发行版上,要编辑的文件可能会有所不同,特别要注意这种方法不向后兼容。在现代 Linux 系统上,编辑基本文件进行网络更改的方法基本上不再适用。
现在我们知道如何为接口分配 IP 地址,让我们学习如何在主机上调整路由。
添加路由
要添加临时静态路由,ip
命令再次是我们的首选。在这个例子中,我们告诉我们的主机路由到192.168.122.10
以到达10.10.10.0/24
网络:
robv@ubuntu:~$ sudo ip route add 10.10.10.0/24 via 192.168.122.10
[sudo] password for robv:
robv@ubuntu:~$ ip route
default via 192.168.122.1 dev ens33 proto dhcp metric 100
10.10.10.0/24 via 192.168.122.10 dev ens33
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.156 metric 100
您还可以添加egress
网络接口以在ip route add
命令的末尾添加dev <devicename>
。
然而,这只是添加了一个临时路由,如果主机重新启动或网络进程重新启动,它将无法保存。您可以使用nmcli
命令添加永久静态路由。
首先,我们将以nmcli
格式显示网络连接:
robv@ubuntu:~$ sudo nmcli connection show
NAME UUID TYPE DEVICE
Wired connection 1 02ea4abd-49c9-3291-b028-7dae78b9c968 ethernet ens33
接下来,我们将使用nmcli
为Wired connection 1
连接添加路由到10.10.11.0/24
通过192.168.122.11
:
robv@ubuntu:~$ sudo nmcli connection modify "Wired connection 1" +ipv4.routes "10.10.11.0/24 192.168.122.11"
同样,让我们保存我们的nmcli
更改:
$ sudo nmcli connection up "Wired connection 1"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
$
现在,查看我们的路由表,我们看到了我们的两个静态路由:
robv@ubuntu:~$ ip route
default via 192.168.122.1 dev ens33 proto dhcp metric 100
10.10.10.0/24 via 192.168.122.10 dev ens33
10.10.11.0/24 via 192.168.122.11 dev ens33 proto static metric 100
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.156 metric 100
然而,如果我们重新加载,我们会发现我们的临时路由现在已经消失,永久路由已经生效:
robv@ubuntu:~$ ip route
default via 192.168.122.1 dev ens33 proto dhcp metric 100
10.10.11.0/24 via 192.168.122.11 dev ens33 proto static metric 100
169.254.0.0/16 dev ens33 scope link metric 1000
192.168.122.0/24 dev ens33 proto kernel scope link src 192.168.122.156 metric 100
完成了添加路由的基础知识后,让我们看看如何在旧的 Linux 主机上,使用传统的route
命令完成同样的任务。
使用传统方法添加路由
首先,要添加路由,请使用以下命令:
$ sudo route add –net 10.10.12.0 netmask 255.255.255.0 gw 192.168.122.12
要使这个路由永久生效,事情变得复杂-永久路由存储在文件中,文件名和位置会因发行版而异,这就是为什么iproute2/nmcli
命令的一致性在现代系统上如此方便。
在旧的 Debian/Ubuntu 发行版上,一个常见的方法是编辑/etc/network/interfaces
文件并添加以下行:
up route add –net 10.10.12.0 netmask 255.255.255.0 gw 192.168.122.12
或者,在旧的 Redhat 系列发行版上,编辑/etc/sysconfig/network-scripts/route-<device name>
文件并添加以下行:
10.10.12.0/24 via 192.168.122.12
或者,只需将路由作为命令添加,编辑/etc/rc.local
文件-这种方法在几乎任何 Linux 系统上都可以工作,但通常被认为不够优雅,主要是因为它是下一个管理员会查找设置的最后一个地方(因为它不是一个正确的网络设置文件)。rc.local
文件只会在系统启动时执行,并运行其中的任何命令。在这种情况下,我们将添加我们的route add
命令:
/sbin/route add –net 10.10.12.0 netmask 255.255.255.0 gw 192.168.122.12
在这一点上,我们已经在我们的 Linux 主机上设置了网络。我们已经设置了 IP 地址、子网掩码和路由。尤其是在故障排除或初始设置时,常常需要禁用或启用接口;我们接下来会涵盖这个内容。
禁用和启用接口
在新的命令“世界”中,我们使用-你猜对了-ip
命令。在这里,我们将“弹跳”接口,先将其关闭,然后再次打开:
robv@ubuntu:~$ sudo ip link set ens33 down
robv@ubuntu:~$ sudo ip link set ens33 up
在旧的命令集中,使用ifconfig
来禁用或启用接口:
robv@ubuntu:~$ sudo ifconfig ens33 down
robv@ubuntu:~$ sudo ifconfig ens33 up
在执行接口命令时,始终要记住,你不想砍掉你坐在的树枝。如果你是远程连接的(例如使用ssh
),如果你改变了ip
地址或路由,或者禁用了一个接口,你很容易在那一点上失去与主机的连接。
在这一点上,我们已经涵盖了大部分你需要在现代网络中配置你的 Linux 主机的任务。然而,网络管理的一个重要部分是诊断和设置配置以适应特殊情况,例如-调整设置以优化流量,可能需要较小或较大的数据包大小。
在接口上设置 MTU
在现代系统中越来越常见的一项操作是设置消息传输单元(MTU)。这是接口将发送或接收的最大协议数据报单元(PDU,在大多数网络中也称为帧)的大小。在以太网上,默认的 MTU 为 1,500 字节,这相当于最大数据包大小为 1,500 字节。媒体的最大数据包大小通常称为最大段大小(MSS)。对于以太网,这三个值如下:
表 2.1 - 以太网的帧大小、MTU、数据包大小和 MSS 的关系
为什么我们需要改变这个? 1,500 是数据包大小的一个不错的折衷方案,因为它足够小,以至于在出现错误时,错误会被快速检测到,并且需要重新传输的数据量相对较小。然而,特别是在数据中心,有一些例外情况。
在处理存储流量,特别是 iSCSI 时,希望使用较大的帧大小,以便数据包大小可以容纳更多数据。在这些情况下,MTU 通常设置在 9,000 左右(通常称为巨型数据包)。这些网络通常部署在 1 Gbps、10 Gbps 或更快的网络上。您还会看到更大的数据包用于适应备份或虚拟机迁移(例如:VMware 中的 VMotion 或 Hyper-V 中的 Live Migration)。
在另一端,您也经常会看到需要较小数据包的情况。这是特别重要的,因为并非所有主机都会很好地检测到这一点,许多应用程序会在其流量中设置DF(不分段)位。在这种情况下,您可能会看到在可能只支持 1,380 字节数据包的介质上设置了一个 1,500 字节的数据包 - 在这种情况下,应用程序将简单地失败,并且错误消息通常不会对故障排除有所帮助。您可能会在哪里看到这种情况?涉及封装数据包的任何链路通常都会涉及到这一点 - 例如隧道或 VPN 解决方案。这些将通过封装引起的开销减少帧大小(和结果数据包大小),这通常很容易计算。卫星链路是另一种常见情况。它们通常默认为 512 字节的帧 - 在这些情况下,大小将由服务提供商发布。
设置 MTU 就像你想的那样简单 - 我们将再次使用nmcli
。请注意,在此示例中,我们缩短了nmcli
的命令行参数,并且我们在最后保存了配置更改 - MTU 在最后一个命令之后立即更改。让我们将 MTU 设置为9000
以优化 iSCSI 流量:
$ sudo nmcli con mod "Wired connection 1" 802-3-ethernet.mtu 9000
$ sudo nmcli connection up "Wired connection 1"
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
$
设置了我们的 MTU,nmcli
命令还能做什么?
有关 nmcli 命令的更多信息
nmcli
命令也可以以交互方式调用,并且可以在实时解释器或 shell 中进行更改。要进入以太网接口的 shell,请使用nmcli connection edit type ethernet
命令。在 shell 中,print
命令列出了可以为该接口类型更改的所有nmcli
参数。请注意,此输出被分成了逻辑组 - 我们已编辑此(非常冗长)输出,以显示您可能需要在各种情况下调整、编辑或故障排除的许多设置:
nmcli> print
===============================================================================
Connection profile details (ethernet)
===============================================================================
connection.id: ethernet
connection.uuid: e0b59700-8dcb-4801-9557-9dee5ab7164f
connection.stable-id: --
connection.type: 802-3-ethernet
connection.interface-name: --
….
connection.lldp: default
connection.mdns: -1 (default)
connection.llmnr: -1 (default)
-------------------------------------------------------------------------------
这些是常见的以太网选项:
802-3-ethernet.port: --
802-3-ethernet.speed: 0
802-3-ethernet.duplex: --
802-3-ethernet.auto-negotiate: no
802-3-ethernet.mac-address: --
802-3-ethernet.mtu: auto
….
802-3-ethernet.wake-on-lan: default
802-3-ethernet.wake-on-lan-password: --
-------------------------------------------------------------------------------
这些是常见的 IPv4 选项:
ipv4.method: auto
ipv4.dns: --
ipv4.dns-search: --
ipv4.dns-options: --
ipv4.dns-priority: 0
ipv4.addresses: --
ipv4.gateway: --
ipv4.routes: --
ipv4.route-metric: -1
ipv4.route-table: 0 (unspec)
ipv4.routing-rules: --
ipv4.ignore-auto-routes: no
ipv4.ignore-auto-dns: no
ipv4.dhcp-client-id: --
ipv4.dhcp-iaid: --
ipv4.dhcp-timeout: 0 (default)
ipv4.dhcp-send-hostname: yes
ipv4.dhcp-hostname: --
ipv4.dhcp-fqdn: --
ipv4.dhcp-hostname-flags: 0x0 (none)
ipv4.never-default: no
ipv4.may-fail: yes
ipv4.dad-timeout: -1 (default)
-------------------------------------------------------------------------------
(IPv6 选项将在此处列出,但已删除以保持此列表的可读性。)
这些是代理设置:
-------------------------------------------------------------------------------
proxy.method: none
proxy.browser-only: no
proxy.pac-url: --
proxy.pac-script: --
-------------------------------------------------------------------------------
nmcli>
如前所述,列表有些简略。我们展示了您可能需要在各种设置或故障排除情况下检查或调整的设置。在您自己的站点上运行该命令以查看完整的列表。
正如我们所示,nmcli
命令允许我们交互式地或从命令行调整多个接口参数。特别是命令行界面允许我们在脚本中调整网络设置,从而可以一次性调整数十、数百甚至数千个站点的设置。
总结
通过本章的学习,您应该对 IP 地址有一个坚实的理解,从二进制的角度来看。通过这个,您应该理解子网寻址和掩码,以及广播和组播寻址。您还对各种 IP 地址类有了很好的掌握。有了这些,您应该能够使用各种不同的命令在 Linux 主机上显示或设置 IP 地址和路由。其他接口操作也应该很容易实现,比如在接口上设置 MTU。
有了这些技能,您就准备好开始我们下一个话题了:使用 Linux 和 Linux 工具进行网络诊断。
问题
最后,这里有一些问题供您测试对本章材料的了解。您将在附录的评估部分找到答案。
-
默认网关有什么作用?
-
对于
192.168.25.0/24
网络,子网掩码和广播地址是什么? -
对于同一网络,广播地址是如何使用的?
-
对于同一网络,可能的主机地址是什么?
-
如果您需要静态设置以太网接口的速度和双工模式,您会使用什么命令?
进一步阅读
-
RFC 1918 – 专用互联网地址分配:
tools.ietf.org/html/rfc1918
-
RFC 791 – 互联网协议:
tools.ietf.org/html/rfc791
第二部分:Linux 作为网络节点和故障排除平台
在本节中,我们将继续构建我们的 Linux 主机,添加网络诊断和故障排除工具。我们将添加 Linux 防火墙,开始保护我们的主机。最后,我们将讨论如何将 Linux 安全标准推广到整个组织,讨论各种方法、监管框架、加固指南和框架。
本书的这一部分包括以下章节:
-
第三章,使用 Linux 和 Linux 工具进行网络诊断
-
第四章,Linux 防火墙
-
第五章,具有实际案例的 Linux 安全标准
第三章:使用 Linux 和 Linux 工具进行网络诊断
在本章中,我们将介绍一些“工作原理”网络基础知识,以及如何在我们的 Linux 工作站中进行网络故障排除。完成本章后,您应该具备故障排除本地和远程网络服务以及“清点”网络及其服务的工具。
特别是,我们将涵盖以下主题:
-
网络基础知识-OSI 模型。
-
第 2 层-使用 ARP 关联 IP 和 MAC 地址,并对 MAC 地址进行更详细的介绍。
-
第 4 层- TCP 和 UDP 端口的工作原理,包括 TCP 的“三次握手”,以及这在 Linux 命令中的表现。
-
本地 TCP 和 UDP 端口枚举,以及这些与运行服务的关系。
-
使用本机工具进行远程端口枚举。
-
使用已安装的扫描程序(尤其是 netcat 和 nmap)进行远程端口枚举。
-
最后,我们将介绍一些无线操作和故障排除的基础知识。
技术要求
为了跟随本节中的示例,我们将使用我们现有的 Ubuntu 主机或虚拟机(VM)。在本章中,我们将涉及一些无线主题,因此如果您的主机或 VM 中没有无线网卡,您将需要一个 Wi-Fi 适配器来完成这些示例。
在我们通过各种故障排除方法时,我们将使用各种工具,首先是一些本地 Linux 命令:
我们还将使用一些已安装的应用程序:
对于 Ubuntu 中未包含的软件包,请确保您有可用的互联网连接,以便您可以使用apt
命令进行安装。
网络基础知识-OSI 模型
以层的术语讨论网络和应用概念很方便,每一层大致负责更高级别和更抽象功能的功能,并且随着您向下移动,在更低层有更多的基本原语。以下图表以广义的方式描述了 OSI 模型:
图 3.1-网络通信的 OSI 模型,带有一些描述和示例
在常规用法中,层通常按数字引用,从底部开始计数。因此,第 2 层问题通常涉及 MAC 地址和交换机,并且将局限于站点所在的 VLAN(通常意味着本地子网)。第 3 层问题将涉及 IP 地址分配,路由或数据包(因此将涉及路由器和更远网络的相邻子网)。
与任何模型一样,总会有混淆的余地。例如,在第 6 层和第 7 层之间存在一些长期以来的模糊性。在第 5 层和第 6 层之间,虽然 IPSEC 绝对是加密,因此属于第 6 层,但它也可以被视为一种隧道协议(取决于您的观点和实现)。即使在第 4 层,TCP 也有会话的概念,因此似乎可能在第 5 层一侧有所涉及-尽管端口的概念将其牢牢地放在第 4 层。
当然,总会有幽默的余地-常见的智慧/笑话是在这个模型中,人形成第 8 层。因此,第 8 层问题可能涉及求助台电话,预算讨论,或与您组织的管理层开会解决!
在下一个图表中,我们看到的是要牢记的这个模型中最重要的概念。随着数据的接收,它沿着堆栈向上移动,从最原始的构造到更抽象/高级的构造(例如从位到帧到数据包到 API 到应用程序)。发送数据将其从应用层移动到线上的二进制表示(从上层到下层)。
第 1-3 层通常被称为媒体或网络层,而第 4-7 层通常被称为主机或应用程序层:
图 3.2-上下移动 OSI 堆栈,封装和解封装
这个概念使得供应商能够制造一个开关,它可以与另一个供应商的网络卡进行交互,或者让交换机与路由器一起工作。这也是我们应用生态系统的动力-在大多数情况下,应用程序开发人员不必担心 IP 地址、路由或无线和有线网络之间的差异,所有这些都已经被处理好了-网络可以被视为一个黑盒子,你在一端发送数据,你可以确信它会在另一端以正确的位置和格式出现。
现在我们已经建立了 OSI 模型的基础,让我们通过探索arp
命令和本地 ARP 表来详细了解数据链路层。
第 2 层-使用 ARP 关联 IP 和 MAC 地址
有了 OSI 模型的坚实基础,我们可以看到到目前为止我们围绕 IP 地址的讨论都集中在第 3 层。这是普通人,甚至许多 IT 和网络人员在他们的理解中通常认为网络路径停止的地方-他们可以一直跟踪到那里,然后认为剩下的部分是一个黑盒子。但作为一个网络专业人员,第 1 层和第 2 层非常重要-让我们从第 2 层开始。
理论上,MAC 地址是烧入到每个网络接口的地址。虽然这通常是正确的,但这也是一个容易改变的事情。MAC 地址是什么呢?它是一个 12 位(6 字节/48 位)地址,通常以十六进制显示。在显示时,每个字节或双字节通常用.
或-
分隔。因此,典型的 MAC 地址可能是00-0c-29-3b-73-cb
或9a93.5d84.5a69
(显示两种常见表示)。
实际上,这些地址用于在同一 VLAN 或子网中的主机之间进行通信。如果你查看数据包捕获(我们将在本书的后面部分进行,第十一章,Linux 中的数据包捕获和分析),在 TCP 会话开始时,你会看到发送站发送一个广播(发送到子网中的所有站点的请求)谁有 IP 地址 x.x.x.x
。那是我,我的 MAC 地址是 aaaa.bbbb.cccc
。如果目标 IP 地址在不同的子网上,发送方将为该子网的网关进行“ARP 请求”(通常是默认网关,除非定义了本地路由)。
前进时,发送方和接收方使用 MAC 地址进行通信。这两个主机连接的交换机基础设施仅在每个 VLAN 中使用 MAC 地址,这也是交换机比路由器快得多的原因之一。当我们查看实际的数据包(在数据包捕获章节中),你会看到每个数据包中的发送和接收 MAC 地址以及 IP 地址。
ARP 请求在每个主机上都被缓存到一个arp
命令中:
$ arp -a
? (192.168.122.138) at f0:ef:86:0f:5d:70 [ether] on ens33
? (192.168.122.174) at 00:c3:f4:88:8b:43 [ether] on ens33
? (192.168.122.5) at 00:5f:86:d7:e6:36 [ether] on ens33
? (192.168.122.132) at 64:f6:9d:e5:ef:60 [ether] on ens33
? (192.168.122.7) at c4:44:a0:2f:d4:c3 [ether] on ens33
_gateway (192.168.122.1) at 00:0c:29:3b:73:cb [ether] on ens33
你可以看到这很简单。它只是将第 3 层 IP 地址与第 2 层 MAC 地址关联到第 1 层/proc
目录:
$ cat /proc/sys/net/ipv4/neigh/default/gc_stale_time
60
$ cat /proc/sys/net/ipv4/neigh/ens33/gc_stale_time
60
请注意,每个网络适配器都有一个默认值(以秒为单位),这些值通常是匹配的。这对您来说可能看起来很短-交换机上的匹配 MAC 地址表(通常称为 CAM 表)通常为 5 分钟,路由器上的 ARP 表通常为 14,400 秒(4 小时)。这些值都与资源有关。总的来说,工作站有资源频繁发送 ARP 数据包。交换机从流量中(包括 ARP 请求和响应)学习 MAC 地址,因此使得该计时器略长于工作站计时器是有意义的。同样,路由器上的长时间 ARP 缓存计时器可以节省其 CPU 和 NIC 资源。路由器上的计时器之所以如此之长,是因为在过去的几年里,与网络上的其他所有设备相比,路由器受到带宽和 CPU 的限制。尽管在现代时代已经发生了变化,但路由器上 ARP 缓存超时的长默认值仍然存在。在路由器或防火墙迁移期间很容易忘记这一点-我参与了许多此类维护窗口,在迁移后,对正确路由器的clear arp
命令神奇地“修复了一切”。
我们还没有讨论 Linux 中的/proc
目录-这是一个包含 Linux 主机上各种设置和状态的当前文件的“虚拟”目录。这些不是“真实”的文件,但它们被表示为文件,因此我们可以使用与文件相同的命令:cat
、grep
、cut
、sort
、awk
等。例如,您可以查看网络接口错误和值,例如在/proc/net/dev
中(请注意此列表中的事物并不完全正确对齐)。
$ cat /proc/net/dev
Inter-| Receive | Transmit
face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
lo: 208116 2234 0 0 0 0 0 0 208116 2234 0 0 0 0 0 0
ens33: 255945718 383290 0 662 0 0 0 0 12013178 118882 0 0 0 0 0 0
您甚至可以查看内存统计信息(请注意meminfo
包含更多信息):
$ cat /proc/meminfo | grep Mem
MemTotal: 8026592 kB
MemFree: 3973124 kB
MemAvailable: 6171664 kB
回到 ARP 和 MAC 地址。您可以添加静态 MAC 地址-一个不会过期且可能与您要连接的主机的真实 MAC 不同的地址。这通常是为了故障排除目的。或者您可以清除 ARP 条目,如果路由器已被替换(例如,如果您的默认网关路由器具有相同的 IP 但现在具有不同的 MAC),则您可能经常需要执行此操作。请注意,您无需特殊权限即可查看 ARP 表,但您确实需要修改它!
要添加静态条目,请执行以下操作(请注意在显示时的PERM
状态)。
$ sudo arp -s 192.168.122.200 00:11:22:22:33:33
$ arp -a | grep 192.168.122.200
? (192.168.122.200) at 00:11:22:22:33:33 [ether] PERM on ens33
要删除 ARP 条目,请执行以下操作(请注意,对于此命令,通常会跳过-i interfacename
参数)。
$ sudo arp –i ens33 -d 192.168.122.200
要伪装成给定的 IP 地址-例如,回答 IP10.0.0.1
的 ARP 请求-请执行以下操作:
$ sudo arp -i eth0 -Ds 10.0.0.2 eth1 pub
最后,您还可以轻松更改接口的 MAC 地址。您可能会认为这是为了处理重复的地址,但这种情况非常罕见。
更改 MAC 地址的合法原因可能包括以下内容:
-
您已迁移防火墙,而 ISP 已经将您的 MAC 硬编码。
-
您已迁移主机或主机 NIC,并且上游路由器对您不可访问,但您不能等待该路由器上的 ARP 缓存过期 4 小时。
-
您已迁移主机,并且旧 MAC 地址有 DHCP 保留,但您无法访问“修复”该 DHCP 条目。
-
出于隐私原因,苹果设备会更改其无线 MAC 地址。鉴于追踪个人身份的许多其他(更容易的)方法,这种保护通常并不那么有效。
更改 MAC 地址的恶意原因包括以下内容:
-
您正在攻击无线网络,并且已经发现一旦经过身份验证,接入点所做的唯一检查就是对客户端 MAC 地址。
-
与前一点相同,但针对使用
802.1x
认证的以太网网络,但配置不安全或不完整(我们将在后面的章节中详细介绍)。 -
您正在攻击具有 MAC 地址权限的无线网络。
希望这说明了出于安全目的使用 MAC 地址通常不是明智的决定。
要查找您的 MAC 地址,我们有四种不同的方法:
$ ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 00:0c:29:33:2d:05 brd ff:ff:ff:ff:ff:ff
$ ip link show ens33 | grep link
link/ether 00:0c:29:33:2d:05 brd ff:ff:ff:ff:ff:ff
$ ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1400
inet 192.168.122.22 netmask 255.255.255.0 broadcast 192.168.122.255
inet6 fe80::1ed6:5b7f:5106:1509 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:33:2d:05 txqueuelen 1000 (Ethernet)
RX packets 384968 bytes 256118213 (256.1 MB)
RX errors 0 dropped 671 overruns 0 frame 0
TX packets 118956 bytes 12022334 (12.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 2241 bytes 208705 (208.7 KB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2241 bytes 208705 (208.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
$ ifconfig ens33 | grep ether
ether 00:0c:29:33:2d:05 txqueuelen 1000 (Ethernet)
要更改 Linux 主机的 MAC 地址,我们有几个选项:
在 Linux GUI 中,您可以通过单击顶部面板上的网络图标,然后选择设置来开始。例如,对于具有一个以太网卡的主机,选择“有线连接”,然后选择有线设置:
图 3.3 - 从 GUI 更改 MAC 地址,第 1 步
从弹出的界面中,通过单击**+图标打开新配置文件对话框,然后在克隆地址**字段中简单地添加 MAC:
图 3.4 - 从 GUI 更改 MAC 地址,第 2 步
或者,您可以通过命令行或使用脚本执行以下操作(当然,使用您自己的接口名称和目标 MAC 地址):
$ sudo ip link set dev ens33 down
$ sudo ip link set dev ens33 address 00:88:77:66:55:44
$ sudo ip link set dev ens33 device here> up
还有macchanger
软件包,您可以使用它将接口的 MAC 地址更改为目标值或伪随机值。
要进行永久的 MAC 地址更改,您可以使用netplan
及其相关的配置文件。首先,备份配置文件/etc/netplan./01-network-manager-all.yaml
,然后进行编辑。请注意,要更改 MAC 地址,您需要一个硬件烧入地址(BIA)MAC 地址值的match
语句,然后在设置新 MAC 的下一行:
network:
version: 2
ethernets:
ens33:
dhcp4: true
match:
macaddress: b6:22:eb:7b:92:44
macaddress: xx:xx:xx:xx:xx:xx
您可以使用sudo netplan try
测试新配置,并使用sudo netplan apply
应用它。
或者,您可以创建或编辑/etc/udev/rules.d/75-mac-spoof.rules
文件,该文件将在每次启动时执行。添加以下内容:
ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="XX:XX:XX:XX:XX:XX", RUN+="/usr/bin/ip link set dev ens33 address YY:YY:YY:YY:YY:YY"
掌握了 ARP 中 MAC 地址使用的基础知识后,让我们深入了解 MAC 地址及其与各种网络适配器制造商的关系。
MAC 地址 OUI 值
所以现在我们已经讨论了超时和 ARP,我们是否已经了解了关于第 2 层和 MAC 地址的所有内容?还不完全 - 让我们谈谈组织唯一标识符(OUI)值。如果您还记得我们关于如何使用子网掩码将 IP 地址分成网络和主机部分的讨论,您会惊讶地知道 MAC 地址中也有类似的分界线!
每个 MAC 地址的前导位应该标识制造商 - 这个值称为 OUI。OUI 已在 IEEE 维护的正式注册表中注册,并发布在standards-oui.ieee.org/oui.txt
上。
但是,Wireshark 项目维护了一个更完整的列表,位于gitlab.com/wireshark/wireshark/-/raw/master/manuf
。
Wireshark 还提供了一个查找 Web 应用程序,用于此列表,网址为www.wireshark.org/tools/oui-lookup.html
。
通常,MAC 地址被平均分割,前 3 个字节(6 个字符)分配给 OUI,后 3 个字节分配给唯一标识设备。但是,组织可以购买更长的 OUI(费用更低),这使它们可以分配更少的设备地址。
OUI 在网络故障排除中是有价值的工具 - 当问题出现或未知站点出现在网络上时,OUI 值可以帮助识别这些罪犯。我们将在本章后面讨论网络扫描仪(特别是 Nmap)时,看到 OUI 稍后会出现。
如果您需要 Linux 或 Windows 的命令行 OUI 解析器,我在github.com/robvandenbrink/ouilookup
上发布了一个。
这结束了我们在 OSI 模型的第 2 层中的第一次冒险,以及我们对其与第 3 层的关系的考察,所以让我们进入更高的层次,进入第 4 层,看看 TCP 和 UDP 协议及其相关服务。
第 4 层 - TCP 和 UDP 端口的工作原理
传输控制协议(TCP)和用户数据报协议(UDP)通常是我们讨论第 4 层通信时所指的内容,特别是它们如何使用端口的概念。
当一个站点想要使用其 IP 地址与同一子网中的另一个站点进行通信(IP 通常在应用程序或表示层中确定),它将检查其 ARP 缓存,以查看是否有与该 IP 匹配的 MAC 地址。如果没有该 IP 地址的条目,它将向本地广播地址发送 ARP 请求(正如我们在上一节中讨论的那样)。
接下来的步骤是协议(TCP 或 UDP)建立端口到端口的通信。站点选择一个可用的端口,高于1024
且低于65535
(最大端口值),称为临时端口。然后使用该端口连接到服务器上的固定服务器端口。这些端口的组合,加上每端的 IP 地址和使用的协议(TCP 或 UDP),将始终是唯一的(因为源端口的选择方式),称为元组。这个元组概念是可扩展的,特别是在 NetFlow 配置中,其他值可以被“附加”,例如服务质量(QOS)、区分服务代码点(DSCP)或服务类型(TOS)值、应用程序名称、接口名称和路由信息,如自治系统号(ASNs)、MPLS 或 VLAN 信息以及发送和接收的流量字节。由于这种灵活性,所有其他值都是基于的基本 5 值元组通常被称为5 元组。
前 1024 个端口(编号为0-1023
)几乎从不用作源端口 - 这些专门被指定为服务器端口,并且需要 root 权限才能使用。1024
-49151
范围内的端口被指定为“用户端口”,49152
-65535
被称为动态或私有端口。但是,服务器并不被强制使用低于1024
的端口号(例如,几乎每个数据库服务器都使用高于1024
的端口号),这只是一个历史惯例,可以追溯到 TCP 和 UDP 正在开发时,所有服务器端口都在1024
以下。如果你看看那些追溯到那个时期的服务器,你会看到以下模式,例如:
IANA 维护了正式分配的端口的完整列表,并发布在www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml
上。
关于这一点的文档在 RFC6335 中。
实际上,“分配”对于这个列表来说是一个强有力的词。虽然将 Web 服务器放在 TCP 端口53
上或将 DNS 服务器放在 UDP 端口80
上是愚蠢的,但许多应用程序根本不在这个列表上,因此只需选择一个通常空闲的端口并使用即可。看到供应商选择实际上已分配给其他人的端口,但分配给了一个更隐蔽或不太常用的服务,这并不罕见。因此,在很大程度上,这个列表是一系列强烈的建议,暗示着我们将考虑任何选择一个知名端口用于自己用途的供应商是……可以说是“愚蠢”的。
第 4 层 - TCP 和三次握手
UDP 只需从解析 5 元组开始发送数据。接收应用程序负责接收数据,或者检查应用程序的数据包以验证数据是否按顺序到达并进行任何错误检查。事实上,正是因为 UDP 没有这种额外开销,所以它经常用于诸如 VoIP(IP 电话)和视频流等对时间要求严格的应用程序。在这些类型的应用程序中,如果丢失了一个数据包,通常回溯重试会中断数据流并被最终用户注意到,因此错误在某种程度上被简单地忽略。
然而,TCP 协商了一个序列号,并在对话进行中保持一个序列计数。这使得基于 TCP 的应用程序能够跟踪丢失或损坏的数据包,并在应用程序发送和接收更多数据的同时重试这些数据包。这个初始的协商通常被称为“三次握手”,在图形上看起来像这样:
图 3.5 – TCP 三次握手,建立 TCP 会话
工作原理如下:
-
第一个数据包来自客户端的临时端口,发送到服务器的(通常是)固定端口。它设置了 SYN(同步)位,并具有随机分配的 SEQ(初始序列)号,本例中为 5432。
-
服务器的回复数据包设置了 ACK(确认)位,编号为 5433,并且还设置了 SYN 位,具有自己的随机 SYN 值,本例中为 6543。此数据包可能已经包含了握手信息以外的数据(所有后续数据包可能都包含数据)。
-
第三个数据包是对服务器的第一个 SYN 的 ACK,编号为 6544。
-
接下来,所有的数据包都是发送给对方的 ACK 数据包,以便每个数据包都有一个唯一的序列号和一个方向。
技术上,数据包 2 可以是两个单独的数据包,但通常它们被合并成一个数据包。
对话的优雅结束方式与此完全相同。结束对话的一方发送一个 FIN,另一方回复一个 FIN-ACK,得到第一方的 ACK,然后结束。
对话的不优雅结束通常是由一个 RST(重置)数据包发起的——一旦发送了 RST,一切就结束了,另一方不应该对此发送回复。
我们将在本章后面以及整本书中都会使用这些主题。所以如果你对此还有疑惑,再读一遍,特别是前面的图表,直到你觉得没问题为止。
现在我们对 TCP 和 UDP 端口如何连接以及为什么应用程序可能使用其中之一有了一些了解,让我们来看看您主机上的应用程序如何在各种端口上“监听”。
本地端口枚举——我连接到什么?我在监听什么?
在网络中,许多基本的故障排除步骤都在通信链的一端或另一端——即在客户端或服务器主机上。例如,如果无法访问网页服务器,当然有必要查看网页服务器进程是否正在运行,并且是否在适当的端口上“监听”客户端请求。
netstat
命令是评估本地主机上网络对话和服务状态的传统方法。要列出所有监听端口和连接,请使用以下选项:
所有五个参数如下所示:
$ netstat –tuan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN
tcp 0 0 192.168.122.22:34586 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:60862 13.33.160.97:443 TIME_WAIT
tcp 0 0 192.168.122.22:48468 35.162.157.58:443 ESTABLISHED
tcp 0 0 192.168.122.22:60854 13.33.160.97:443 TIME_WAIT
tcp 0 0 192.168.122.22:50826 72.21.91.29:80 ESTABLISHED
tcp 0 0 192.168.122.22:22 192.168.122.201:3310 ESTABLISHED
tcp 0 0 192.168.122.22:60860 13.33.160.97:443 TIME_WAIT
tcp 0 0 192.168.122.22:34594 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:42502 44.227.121.122:443 ESTABLISHED
tcp 0 0 192.168.122.22:34596 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:34588 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:46292 35.244.181.201:443 ESTABLISHED
tcp 0 0 192.168.122.22:47902 192.168.122.1:22 ESTABLISHED
tcp 0 0 192.168.122.22:34592 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:34590 13.33.160.88:443 TIME_WAIT
tcp 0 0 192.168.122.22:60858 13.33.160.97:443 TIME_WAIT
tcp 0 0 192.168.122.22:60852 13.33.160.97:443 TIME_WAIT
tcp 0 0 192.168.122.22:60856 13.33.160.97:443 TIME_WAIT
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 ::1:631 :::* LISTEN
udp 0 0 127.0.0.53:53 0.0.0.0:*
udp 0 0 0.0.0.0:49345 0.0.0.0:*
udp 0 0 0.0.0.0:631 0.0.0.0:*
udp 0 0 0.0.0.0:5353 0.0.0.0:*
udp6 0 0 :::5353 :::*
udp6 0 0 :::34878 :::*
$
注意不同的状态(您可以在netstat
的man
页面中查看所有这些状态,使用man netstat
命令)。您将看到的最常见的状态列在下表中。如果对任何一种状态的描述感到困惑,您可以跳到接下来的几页,使用图表(图 3.6 和 3.7)来解决这个问题:
以下表格显示了较少见的状态(主要是因为这些状态通常只持续很短的时间)。如果您一直看到这些状态中的任何一个,您可能需要解决问题:
这些状态与我们刚讨论的握手有什么关系?让我们把它们放在一个图表中 - 再次注意,大多数情况下,中间步骤应该只存在很短的时间。如果您看到SYN_SENT
或SYN_RECVD
状态持续时间超过几毫秒,您可能需要进行一些故障排除:
图 3.6 - TCP 会话在建立过程中的各个状态
当拆除 TCP 会话时,您会看到类似的状态。再次注意,许多中间状态应该只持续很短的时间。编写不良的应用程序通常无法正确拆除会话,因此在这种情况下,您可能会看到CLOSE WAIT
等状态。另一种拆除会话不良的情况是当路径中的防火墙定义了最大 TCP 会话长度。通常情况下,此设置用于处理无法正确关闭或甚至根本不关闭的编写不良的应用程序。然而,最大会话计时器也可能干扰长时间运行的会话,例如旧式备份作业。如果您遇到这种情况,长时间运行的会话无法恢复良好(例如备份作业出错而不是恢复会话),则可能需要与防火墙管理员合作,以增加此计时器,或者与备份管理员合作,考虑使用更现代的备份软件(例如具有多个并行 TCP 会话和更好的错误恢复):
图 3.7 - TCP 会话在各个点被"拆除"时的状态
请注意,在会话初始化时,我们没有两个状态来区分从服务器返回的SYN
和ACK
- 关闭会话涉及的状态比建立会话时涉及的状态要多得多。还要注意的是,数据包在几分之一秒内就会传输,所以如果您在netstat
显示中看到任何 TCP 会话不是ESTABLISHED
、LISTENING
、TIME-WAIT
或(较少见的)CLOSED
,那么就有些异常。
为了将监听端口与其背后的服务联系起来,我们将使用l
(用于监听)而不是a
,并添加p
选项以获取程序:
$ sudo netstat -tulpn
[sudo] password for robv:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 666/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 811/sshd: /usr/sbin
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 4147/cupsd
tcp6 0 0 :::22 :::* LISTEN 811/sshd: /usr/sbin
tcp6 0 0 ::1:631 :::* LISTEN 4147/cupsd
udp 0 0 127.0.0.53:53 0.0.0.0:* 666/systemd-resolve
udp 0 0 0.0.0.0:49345 0.0.0.0:* 715/avahi-daemon: r
udp 0 0 0.0.0.0:631 0.0.0.0:* 4149/cups-browsed
udp 0 0 0.0.0.0:5353 0.0.0.0:* 715/avahi-daemon: r
udp6 0 0 :::5353 :::* 715/avahi-daemon: r
udp6 0 0 :::34878 :::* 715/avahi-daemon: r
有没有netstat
的替代方案?当然,有很多。
例如,ss
几乎具有相同的功能。在下表中,您可以看到我们要求的内容:
让我们通过添加p
选项来添加进程信息:
$ sudo ss -tuap
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
udp UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:* users:(("systemd-resolve",pid=666,fd=12))
udp UNCONN 0 0 0.0.0.0:49345 0.0.0.0:* users:(("avahi-daemon",pid=715,fd=14))
udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* users:(("cups-browsed",pid=4149,fd=7))
udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* users:(("avahi-daemon",pid=715,fd=12))
udp UNCONN 0 0 [::]:mdns [::]:* users:(("avahi-daemon",pid=715,fd=13))
udp UNCONN 0 0 [::]:34878 [::]:* users:(("avahi-daemon",pid=715,fd=15))
tcp LISTEN 0 4096 127.0.0.53%lo:domain 0.0.0.0:* users:(("systemd-resolve",pid=666,fd=13))
tcp LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:* users:(("sshd",pid=811,fd=3))
tcp LISTEN 0 5 127.0.0.1:ipp 0.0.0.0:* users:(("cupsd",pid=4147,fd=7))
tcp ESTAB 0 64 192.168.122.22:ssh 192.168.122.201:3310 users:(("sshd",pid=5575,fd=4),("sshd",pid=5483,fd=4))
tcp ESTAB 0 0 192.168.122.22:42502 44.227.121.122:https users:(("firefox",pid=4627,fd=162))
tcp TIME-WAIT 0 0 192.168.122.22:46292 35.244.181.201:https
tcp ESTAB 0 0 192.168.122.22:47902 192.168.122.1:ssh users:(("ssh",pid=5832,fd=3))
tcp LISTEN 0 128 [::]:ssh [::]:* users:(("sshd",pid=811,fd=4))
tcp LISTEN 0 5 [::1]:ipp [::]:* users:(("cupsd",pid=4147,fd=6))
注意最后一列是如何换行到下一行的?让我们使用cut
命令仅选择文本显示中的一些字段。让我们要求列 1、2、4、5 和 6(我们将删除Recv-Q
和Send-Q
字段)。我们将使用管道的概念将一个命令的输出传递给下一个命令。
cut
命令只有几个选项,通常您会使用d
(分隔符)或f
(字段编号)。
在我们的情况下,我们的分隔符是空格字符,我们想要字段 1、2、5 和 6。不幸的是,我们的字段之间有多个空格。我们该如何解决?让我们使用tr
(translate)命令。通常情况下,tr
会将一个单个字符转换为一个不同的字符,例如tr 'a' 'b'
将用b
替换所有出现的a
。但在我们的情况下,我们将使用tr
的s
选项,它将把目标字符的多个出现减少到一个。
我们的最终命令集会是什么样子?看看以下内容:
sudo ss -tuap | tr -s ' ' | cut -d ' ' -f 1,2,4,5,6 --output-delimiter=$'\t'
第一个命令与上次使用的ss
命令相同。我们将其发送到tr
,它将所有重复的空格字符替换为单个空格。cut
获取此输出并执行以下操作:“使用空格字符分隔符,只给我字段 1、2、5 和 6,使用制表符字符在我的结果列之间。”
我们的最终结果呢?让我们看看:
sudo ss -tuap | tr -s ' ' | cut -d ' ' -f 1,2,5,6 --output-delimiter=$'\t'
Netid State Local Address:Port
udp UNCONN 127.0.0.53%lo:domain 0.0.0.0:*
udp UNCONN 0.0.0.0:49345 0.0.0.0:*
udp UNCONN 0.0.0.0:631 0.0.0.0:*
udp UNCONN 0.0.0.0:mdns 0.0.0.0:*
udp UNCONN [::]:mdns [::]:*
udp UNCONN [::]:34878 [::]:*
tcp LISTEN 127.0.0.53%lo:domain 0.0.0.0:*
tcp LISTEN 0.0.0.0:ssh 0.0.0.0:*
tcp LISTEN 127.0.0.1:ipp 0.0.0.0:*
tcp ESTAB 192.168.122.22:ssh 192.168.122.201:3310
tcp ESTAB 192.168.122.22:42502 44.227.121.122:https
tcp ESTAB 192.168.122.22:47902 192.168.122.1:ssh
tcp LISTEN [::]:ssh [::]:*
tcp LISTEN [::1]:ipp [::]:*
使用制表符作为分隔符给我们更好的机会让结果列对齐。如果这是一个更大的列表,我们可能会将整个输出发送到一个.tsv
(缩写为制表符分隔变量)文件中,这可以直接被大多数电子表格应用程序读取。这将使用一种称为重定向的管道变体来完成。
在这个例子中,我们将使用>
运算符将整个输出发送到一个名为ports.csv
的文件中,然后使用cat
(连接)命令来查看文件内容:
$ sudo ss -tuap | tr -s ' ' | cut -d ' ' -f 1,2,5,6 --output-delimiter=$'\t' > ports.tsv
$ cat ports.out
Netid State Local Address:Port
udp UNCONN 127.0.0.53%lo:domain 0.0.0.0:*
udp UNCONN 0.0.0.0:49345 0.0.0.0:*
udp UNCONN 0.0.0.0:631 0.0.0.0:*
udp UNCONN 0.0.0.0:mdns 0.0.0.0:*
udp UNCONN [::]:mdns [::]:*
udp UNCONN [::]:34878 [::]:*
tcp LISTEN 127.0.0.53%lo:domain 0.0.0.0:*
tcp LISTEN 0.0.0.0:ssh 0.0.0.0:*
tcp LISTEN 127.0.0.1:ipp 0.0.0.0:*
tcp ESTAB 192.168.122.22:ssh 192.168.122.201:3310
tcp ESTAB 192.168.122.22:42502 44.227.121.122:https
tcp ESTAB 192.168.122.22:47902 192.168.122.1:ssh
tcp LISTEN [::]:ssh [::]:*
tcp LISTEN [::1]:ipp [::]:*
最后,有一个特殊的命令叫做tee
,它可以将输出发送到两个不同的位置。在这种情况下,我们将其发送到ports.out
文件和特殊的STDOUT
(标准输出)文件,这基本上意味着“将其输入回我的终端会话中”。为了好玩,让我们使用grep
命令只选择已建立的会话:
$ sudo ss -tuap | tr -s ' ' | cut -d ' ' -f 1,2,5,6 --output-delimiter=$'\t' | grep "EST" | tee ports.out
tcp ESTAB 192.168.122.22:ssh 192.168.122.201:3310
tcp ESTAB 192.168.122.22:42502 44.227.121.122:https
tcp ESTAB 192.168.122.22:47902 192.168.122.1:ssh
想要查看一些关于 TCP 对话的更详细的统计信息吗?使用t
代表 TCP,o
代表选项:
$ sudo ss –to
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 64 192.168.122.22:ssh 192.168.122.201:3310 timer:(on,240ms,0)
ESTAB 0 0 192.168.122.22:42502 44.227.121.122:https timer:(keepalive,6min47sec,0)
ESTAB 0 0 192.168.122.22:47902 192.168.122.1:ssh timer:(keepalive,104min,0)
这种 TCP 选项显示对于排除可能通过防火墙运行的长期 TCP 会话非常有用。由于内存限制,防火墙会定期清除未正确终止的 TCP 会话。由于它们没有终止,在大多数情况下,防火墙将寻找运行时间超过x分钟的会话(其中x是一个具有默认值并且可以配置的数字)。这种情况经典的错误可能出现在客户端通过防火墙运行备份或传输大文件,可能是备份到云服务或在网络内外传输大文件。如果这些会话超过了超时值,它们当然会在防火墙上被关闭。
在这种情况下,重要的是要看到长时间的 TCP 会话可能持续多久。备份或文件传输可能由几个较短的会话组成,同时并按顺序运行以最大化性能。或者它们可能是一个持续时间与进程一样长的单个传输。这组ss
选项可以帮助您了解您的进程在幕后的行为,而无需求助于数据包捕获(不要担心,我们将在本书的后面部分介绍数据包捕获)。
让我们再试一次,查看监听端口并将显示与主机上的监听服务相关联:
$ sudo netstat -tulpn
[sudo] password for robv:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 666/systemd-resolve
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 811/sshd: /usr/sbin
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 4147/cupsd
tcp6 0 0 :::22 :::* LISTEN 811/sshd: /usr/sbin
tcp6 0 0 ::1:631 :::* LISTEN 4147/cupsd
udp 0 0 127.0.0.53:53 0.0.0.0:* 666/systemd-resolve
udp 0 0 0.0.0.0:49345 0.0.0.0:* 715/avahi-daemon: r
udp 0 0 0.0.0.0:631 0.0.0.0:* 4149/cups-browsed
udp 0 0 0.0.0.0:5353 0.0.0.0:* 715/avahi-daemon: r
udp6 0 0 :::5353 :::* 715/avahi-daemon: r
udp6 0 0 :::34878 :::* 715/avahi-daemon: r
收集这些信息的另一个经典方法是使用lsof
(打开文件列表)命令。等一下,我们想要获取网络信息,而不是谁打开了什么文件的列表!这个问题背后缺少的信息是,在 Linux 中,lsof
用于枚举 TCP 端口80
和22
上的连接:
$ lsof -i :443
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
firefox 4627 robv 162u IPv4 93018 0t0 TCP ubuntu:42502->ec2-44-227-121-122.us-west-2.compute.amazonaws.com:https (ESTABLISHED)
$ lsof -i :22
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 5832 robv 3u IPv4 103832 0t0 TCP ubuntu:47902->_gateway:ssh (ESTABLISHED)
您可以看到相同的信息,以稍微不同的方式表示。这也很方便,因为lsof
命令明确显示了每个对话的方向,它是从对话中的初始SYN
数据包中获取的(发送第一个SYN
数据包的人在任何 TCP 对话中都是客户端)。
为什么我们如此专注于监听端口和进程?一个答案实际上在本章的早些时候已经提到 - 你只能在特定端口上有一个服务监听。这个经典的例子是尝试在 TCP 端口80
上启动一个新网站,却不知道已经有一个服务在该端口上监听。在这种情况下,第二个服务或进程将简单地无法启动。
现在我们已经探索了本地监听端口以及它们关联的进程,让我们把注意力转向远程监听端口 - 在其他主机上监听的服务。
使用本机工具进行远程端口枚举
那么现在我们知道如何处理本地服务和一些流量诊断,我们如何枚举远程主机上的监听端口和服务呢?
简单的方法是使用本机工具-例如scp
用于 SFTP 服务器,或ftp
用于 FTP 服务器。但如果是一些我们没有安装客户端的不同服务怎么办。很简单,telnet
命令可以在这种情况下使用-例如,我们可以 telnet 到打印机的管理端口,运行http
(tcp/80
),并对第一页的标题发出GET
请求。注意列表底部的垃圾字符-这是该页面上图形的表示方式:
$ telnet 192.168.122.241 80
Trying 192.168.122.241...
Connected to 192.168.122.241.
Escape character is '^]'.
GET / HTTP/1.1
HTTP/1.1 200 OK
Server: HP HTTP Server; HP PageWide 377dw MFP - J9V80A; Serial Number: CN74TGJ0H7; Built: Thu Oct 15, 2020 01:32:45PM {MAVEDWPP1N001.2042B.00}
Content-Encoding: gzip
Content-Type: text/html
Last-Modified: Thu, 15 Oct 2020 13:32:45 GMT
Cache-Control: max-age=0
Set-Cookie: sid=se2b8d8b3-e51eab77388ba2a8f2612c2106b7764a;path=/;HttpOnly;
Content-Security-Policy: default-src 'self' 'unsafe-eval' 'unsafe-inline'; style-src * 'unsafe-inline'; frame-ancestors 'self'
X-Frame-Options: SAMEORIGIN
X-UA-Compatible: IE=edge
X-XXS-Protection: 1
X-Content-Type-Options: nosniff
Content-Language: en
Content-Length: 667
▒▒▒O▒0▒▒▒W▒
Hs<M▒´M
▒▒▒q.▒[▒▒l▒▒▒▒▒N▒J+▒"▒}s▒szr}?▒▒▒▒▒▒▒[▒<|▒▒:B{▒3v=▒▒▒ɇs▒n▒▒▒▒i ▒▒"1vƦ?X▒▒9o▒▒I▒
2▒▒?ȋ▒ ]▒▒▒)▒^▒uF▒F{ԞN75▒)#▒|
即使你不知道要输入什么,通常如果你能用 telnet 连接,那就意味着你尝试的端口是打开的。
然而,这种方法也存在一些问题-如果你不知道要输入什么,这并不是一种确定端口是否打开的万无一失的方法。而且,经常退出会成为一个问题-通常BYE
,QUIT
或EXIT
会起作用,有时按下*^c*(Ctrl + C)或*^z*会起作用,但这两种方法都不是 100%保证。最后,你可能正在查看多个主机或多个端口,或者这可能只是你故障排除的第一步。所有这些因素综合起来,使得这种方法既笨拙又耗时。
作为对此的回答,我们有专门为此目的而构建的端口扫描器工具-nmap
(我们将在下一节中介绍)是其中最受欢迎的。但是,如果你没有安装其中一个,nc
(netcat)命令就是你的朋友!
让我们用 netcat 扫描我们的示例 HP 打印机:
$ nc -zv 192.168.122.241 80
Connection to 192.168.122.241 80 port [tcp/http] succeeded!
$ nc -zv 192.168.122.241 443
Connection to 192.168.122.241 443 port [tcp/https] succeeded!
或者我们测试前1024
个端口怎么样?假设我们使用以下命令:
$ nc -zv 192.168.122.241 1-1024
我们得到了许多错误页面,比如以下内容:
nc: connect to 192.168.122.241 port 1013 (tcp) failed: Connection refused
好的,让我们尝试用我们的朋友grep
来过滤这些:
$ nc -zv 192.168.122.241 1-1024 | grep –v refused
这仍然不起作用-为什么呢?关键在于“错误”这个词,Netcat 将错误发送到特殊的STDERR
(标准错误)文件,这在 Linux 中是正常的(我们稍后将看到为什么对于这个工具来说,成功的连接算作错误)。该文件会回显到控制台,但它不是STDOUT
,所以我们的grep
过滤器完全错过了。我们该如何解决这个问题呢?
关于这三个STD
文件或流的一些背景知识-它们各自都有一个与之关联的文件编号:
通过对这些文件编号进行一些游戏,我们可以将STDERR
重定向到STDOUT
(这样grep
现在将为我们工作):
$ nc -zv 192.168.122.241 1-1024 2>&1 | grep -v refused
Connection to 192.168.122.241 80 port [tcp/http] succeeded!
Connection to 192.168.122.241 443 port [tcp/https] succeeded!
Connection to 192.168.122.241 515 port [tcp/printer] succeeded!
Connection to 192.168.122.241 631 port [tcp/ipp] succeeded!
这是0
(在真实网络中可见),但 netcat 在这方面失败了:
$ nc -zv 192.168.122.241 0-65535 2>&1 | grep -v refused
nc: port number too small: 0
$ nc -zv 192.168.122.241 1-65535 2>&1 | grep -v refused
Connection to 192.168.122.241 80 port [tcp/http] succeeded!
Connection to 192.168.122.241 443 port [tcp/https] succeeded!
Connection to 192.168.122.241 515 port [tcp/printer] succeeded!
Connection to 192.168.122.241 631 port [tcp/ipp] succeeded!
Connection to 192.168.122.241 3910 port [tcp/*] succeeded!
Connection to 192.168.122.241 3911 port [tcp/*] succeeded!
Connection to 192.168.122.241 8080 port [tcp/http-alt] succeeded!
Connection to 192.168.122.241 9100 port [tcp/*] succeeded!
我们也可以为 UDP 复制这个过程:
$ nc -u -zv 192.168.122.1 53
Connection to 192.168.122.1 53 port [udp/domain] succeeded!
然而,如果我们扫描 UDP 范围,这可能会出现端口不可达
错误,如果路径中有任何防火墙,这并不总是受支持。让我们看看当针对 UDP 端口时,“前1024
”扫描需要多长时间(注意我们如何使用分号串联命令):
$ date ; nc -u -zv 192.168.122.241 1-1024 2>&1 | grep succeed ; date
Thu 07 Jan 2021 09:28:17 AM PST
Connection to 192.168.122.241 68 port [udp/bootpc] succeeded!
Connection to 192.168.122.241 137 port [udp/netbios-ns] succeeded!
Connection to 192.168.122.241 138 port [udp/netbios-dgm] succeeded!
Connection to 192.168.122.241 161 port [udp/snmp] succeeded!
Connection to 192.168.122.241 427 port [udp/svrloc] succeeded!
Thu 07 Jan 2021 09:45:32 AM PST
是的,整整 18 分钟-这种方法并不是一个速度恶魔!
使用 netcat,你也可以直接与服务交互,就像我们的 telnet 示例一样,但没有 telnet 带来的“终端/光标控制”类型的开销。例如,连接到 web 服务器的语法如下:
# nc 192.168.122.241 80
但更有趣的是,我们可以建立一个虚假的服务,告诉 netcat 监听指定的端口。如果你需要测试连接,特别是如果你想测试防火墙规则,但还没有构建目标主机或服务,这将非常方便。
这个语法告诉主机监听端口80
。使用l
参数告诉 netcat 监听,但当你的远程测试程序或扫描程序连接并断开连接时,netcat 监听器会退出。使用l
参数是“更努力地监听”的选项,它可以正确处理 TCP 连接和断开连接,使监听器保持在原地。不幸的是,Ubuntu 实现的 netcat 中缺少l
参数和-e
(执行)参数。不过我们可以通过其他方法实现这一点-继续阅读!
在此基础上,让我们使用 netcat 搭建一个简单的网站!首先,创建一个简单的文本文件。我们将把我们的index.html
做成以下的样子:
现在,为了搭建网站,让我们在 netcat 语句中添加一个 1 秒的超时,并将整个内容放入一个循环中,这样当我们退出连接时,netcat 会重新启动:
$ while true; do cat index.html | nc -l -p 80 –q 1; done
nc: Permission denied
nc: Permission denied
nc: Permission denied
…. (and so on) ….
注意监听端口80
失败了 - 我们不得不按下Ctrl + C来退出循环。为什么会这样?(提示:回到本章前面关于 Linux 中端口定义的部分。)让我们再试一次,使用端口1500
:
$ while true; do cat index.html | nc -l -p 1500 -q 1 ; done
浏览到我们的新网站(注意它是 HTTP,并注意使用:1500
来设置目标端口),我们现在看到以下内容:
图 3.8 - 一个 Netcat 简单网站
回到 Linux 控制台,您会看到 netcat 回显客户端的GET
请求和浏览器的User-Agent
字符串。您将看到整个 HTTP 交换(从服务器的角度):
GET / HTTP/1.1
Host: 192.168.122.22:1500
Connection: keep-alive
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36 Edg/87.0.664.66
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.9
让我们更加积极一点,让这个网站告诉我们日期和时间:
while true; do echo -e "HTTP/1.1 200 OK\n\n $(date)" | nc -l -p 1500 -q 1; done
现在浏览该网站,我们可以看到当前的日期和时间:
图 3.9 - 一个更复杂的 Netcat 网站 - 添加时间和日期
或者,使用apt-get
安装fortune
软件包,我们现在可以添加一句谚语来给我们一些及时的智慧:
图 3.10 - 向 Netcat 网站添加一句谚语
我们还可以使用 netcat 传输文件。在接收端,我们将监听端口1234
,并将输出发送到out.file
,同样使用重定向:
nc -l -p 1234 > received.txt
在发送端,我们将连接到该服务 3 秒钟,并发送sent-file.txt
。我们将通过在相反方向使用重定向来获取我们的输入,使用<
运算符:
nc -w 3 [destination ip address] 1234 < sent-file.txt
现在,回到接收端,我们可以使用cat
命令查看生成的文件:
$ cat received.txt
Mr. Watson, come here, I want to see you.
这说明 netcat 可以是一个有价值的故障排除工具,但根据您要完成的任务,使用起来可能会比较复杂。我们可以使用 netcat 作为一个简单的代理,作为一个简单的聊天应用程序,或者呈现一个完整的 Linux shell - 所有这些对于网络管理员(或者渗透测试者)来说都是很方便的东西。
这就是 netcat 的基础知识。我们已经使用 netcat 来枚举本地端口,连接和与远程端口交互,搭建了一些相当复杂的本地服务,甚至传输文件。现在让我们来看看 Nmap,这是一种更快速、更优雅的枚举远程端口和服务的方法。
远程端口和服务枚举 - nmap
用于扫描网络资源的最广泛使用的工具是 NMAP(简称网络映射器)。NMAP 起初是一个简单的端口扫描工具,但现在已经远远超出了简单的功能范围,具有长长的功能列表。
首先,nmap 在基本的 Ubuntu 工作站上默认情况下是没有安装的(尽管它在许多其他发行版中默认情况下是包含的)。要安装它,请运行sudo apt-get install nmap
。
在我们继续使用 nmap 进行工作时,请尝试我们在示例中使用的各种命令。您可能会看到类似的结果,并且会在学习的过程中了解这个有价值的工具。在这个过程中,您可能也会对您的网络有很多了解!
重要提示
关于“自己尝试一下”建议的一个非常重要的警告。NMAP 是一个相当无害的工具,它几乎不会引起网络问题。但是,如果您在生产网络上运行它,您将首先要了解该网络的情况。有几类设备的网络堆栈特别“不稳定” - 例如较旧的医疗设备,以及较旧的工业控制系统(ICS)或监控和数据采集(SCADA)设备。
换句话说,如果您在医院、工厂或公用事业部门,要小心!对生产网络运行任何网络映射都可能引起问题。
你可能确实还想这样做,但首先要针对已知的"空闲"设备进行测试,这样当你扫描"真实"网络时,你可以确保不会造成问题。而且,请(请),如果你在医疗保健网络上,请永远不要扫描任何与人相关的东西!
第二个(合法的)警告-不要未经许可扫描东西。如果你在家里或实验室网络上,那是一个很好的地方来使用 nmap 或更具侵略性的安全评估工具。但是,如果你在工作中,即使你确信不会造成问题,你也需要先书面获得许可。
扫描你不拥有或没有书面许可扫描的互联网主机是非常非法的。许多人认为这是相当无害的,在大多数情况下,扫描只是大多数公司认为的"互联网白噪音"(大多数组织每小时被扫描几十次甚至几百次)。请记住,谚语"罪犯和信息安全专业人员之间的区别在于签署的合同"之所以经常被重复,是因为它是 100%正确的。
有了这一切,让我们更加熟悉这个伟大的工具!尝试运行man nmap
(还记得manual
命令吗?)- nmap 的 man 页面中有很多有用的信息,包括完整的文档。不过一旦我们更熟悉这个工具,你可能会发现帮助文本更快。通常你知道(多多少少)你在寻找什么,所以你可以使用grep
命令搜索,例如:nmap - -help | grep <my_search_string>
。在 nmap 的情况下,你可以放弃标准的- - help
选项,因为 nmap 没有参数的默认输出是帮助页面。
因此,要找出如何进行 ping 扫描-也就是说,对范围内的所有内容进行 ping(我总是忘记语法),你可以搜索如下:
$ nmap | grep -i ping
-sn: Ping Scan - disable port scan
-PO[protocol list]: IP Protocol Ping
我们该怎么做?NMAP 想知道你想要映射什么-在这种情况下,我将映射192.168.122.0/24
子网:
$ nmap -sn 192.168.122.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-05 13:53 PST
Nmap scan report for _gateway (192.168.122.1)
Host is up (0.0021s latency).
Nmap scan report for ubuntu (192.168.122.21)
Host is up (0.00014s latency).
Nmap scan report for 192.168.122.51
Host is up (0.0022s latency).
Nmap scan report for 192.168.122.128
Host is up (0.0027s latency).
Nmap scan report for 192.168.122.241
Host is up (0.0066s latency).
Nmap done: 256 IP addresses (5 hosts up) scanned in 2.49 seconds
这是一个快速扫描,告诉我们子网上当前活动的每个 IP。
现在让我们寻找服务。让我们首先寻找任何运行tcp/443
(你可能会认识为 HTTPS)的东西。我们将使用nmap –p 443 –open 192.168.122.0/24
命令。在这个命令中有两件事要注意。首先,我们用-p
选项指定了端口。
默认情况下,NMAP 使用SYN
扫描来扫描 TCP 端口。nmap 发送一个SYN
数据包,并等待收到一个SYN-ACK
数据包。如果它看到了,端口就是打开的。如果它收到一个端口不可达
的响应,那么端口被认为是关闭的。
如果我们想要进行完整的connect
扫描(整个三次握手完成),我们可以指定-sT
。
接下来,我们看到了一个--open
选项。这表示"只显示给我打开的端口"。如果没有这个选项,我们将看到关闭的端口以及"过滤"的端口(通常意味着初始数据包没有返回任何东西)。
如果我们想要更详细地了解为什么端口可能被认为是打开、关闭或被过滤,我们会移除--open
选项,然后添加--reason
。
$ nmap -p 443 --open 192.168.122.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-05 13:55 PST
Nmap scan report for _gateway (192.168.122.1)
Host is up (0.0013s latency).
PORT STATE SERVICE
443/tcp open https
Nmap scan report for 192.168.122.51
Host is up (0.0016s latency).
PORT STATE SERVICE
443/tcp open https
Nmap scan report for 192.168.122.241
Host is up (0.00099s latency).
PORT STATE SERVICE
443/tcp open https
Nmap done: 256 IP addresses (5 hosts up) scanned in 2.33 seconds
要扫描 UDP 端口,我们会使用相同的语法,但添加sU
选项。注意到这一点,我们开始看到活动主机的 MAC 地址。这是因为扫描的主机与扫描器在同一个子网中,所以这些信息是可用的。NMAP 使用 MAC 地址的 OUI 部分来识别每个网络卡的供应商:
$ nmap -sU -p 53 --open 192.168.122.0/24
You requested a scan type which requires root privileges.
QUITTING!
糟糕-因为我们正在扫描 UDP 端口,Nmap 需要以 root 权限运行(使用sudo
)。这是因为它需要将发送接口置于混杂模式,以便捕获可能返回的任何数据包。这是因为 UDP 中没有类似 TCP 中的会话的第 5 层概念,因此发送和接收的数据包之间没有第 5 层连接。根据使用的命令行参数(不仅仅是用于 UDP 扫描),Nmap 可能需要提升的权限。在大多数情况下,如果您使用 Nmap 或类似工具,您会发现自己经常使用sudo
:
$ sudo nmap -sU -p 53 --open 192.168.122.0/24
[sudo] password for robv:
Sorry, try again.
[sudo] password for robv:
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-05 14:04 PST
Nmap scan report for _gateway (192.168.122.1)
Host is up (0.00100s latency).
PORT STATE SERVICE
53/udp open domain
MAC Address: 00:0C:29:3B:73:CB (VMware)
Nmap scan report for 192.168.122.21
Host is up (0.0011s latency).
PORT STATE SERVICE
53/udp open|filtered domain
MAC Address: 00:0C:29:E4:0C:31 (VMware)
Nmap scan report for 192.168.122.51
Host is up (0.00090s latency).
PORT STATE SERVICE
53/udp open|filtered domain
MAC Address: 00:25:90:CB:00:18 (Super Micro Computer)
Nmap scan report for 192.168.122.128
Host is up (0.00078s latency).
PORT STATE SERVICE
53/udp open|filtered domain
MAC Address: 98:AF:65:74:DF:6F (Unknown)
Nmap done: 256 IP addresses (23 hosts up) scanned in 1.79 seconds
关于此扫描还有一些需要注意的事项:
初始扫描尝试失败了-请注意,您需要 root 权限才能在 NMAP 中进行大多数扫描。为了获得它所做的结果,在许多情况下,该工具会自己制作数据包,而不是使用标准的操作系统服务来执行,它通常也需要权限来捕获目标主机返回的数据包-因此 nmap 需要提升的权限来执行这两个操作。
我们看到很多状态指示open|filtered
端口。UDP 特别容易出现这种情况-因为没有SYN
/SYN-ACK
类型的握手,你发送一个UDP
数据包,可能不会收到任何回应-这并不一定意味着端口关闭,可能意味着你的数据包被远程服务处理了,但没有发送确认(有些协议就是这样)。或者在很多情况下,这可能意味着端口没有开启,主机没有正确返回 ICMP Port Unreachable
错误消息(ICMP Type 1, Code 3)。
为了获得更多细节,让我们使用sV
选项,这将探测相关端口并获取有关服务本身的更多信息。在这种情况下,我们将看到192.168.122.1
被明确识别为开放的,运行domain
服务,并列出服务版本为generic dns response: NOTIMP
(这表示服务器不支持RFC 2136中描述的 DNS UPDATE
功能)。服务信息后面的服务指纹签名可以帮助进一步识别服务,如果 NMAP 的识别不是最终确定的。
还要注意,对于其他主机,原因被列为no-response
。如果您了解协议,通常可以在这些情况下做出良好的推断。在扫描 DNS 时,no-response
表示那里没有 DNS 服务器或端口关闭。(或者可能是打开了一些与 DNS 不同的古怪服务,这是非常不太可能的)。(这是在192
的一个 DNS 服务器上。)
还要注意,这次扫描花了整整 100 秒,大约是我们最初扫描的 50 倍:
$ sudo nmap -sU -p 53 --open -sV --reason 192.168.122.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-05 14:17 PST
Nmap scan report for _gateway (192.168.122.1)
Host is up, received arp-response (0.0011s latency).
PORT STATE SERVICE REASON VERSION
53/udp open domain udp-response ttl 64 (generic dns response: NOTIMP)
1 service unrecognized despite returning data. If you know the service/version, please submit the following fingerprint at https://nmap.org/cgi-bin/submit.cgi?new-service :
SF-Port53-UDP:V=7.80%I=7%D=1/5%Time=5FF4E58A%P=x86_64-pc-linux-gnu%r(DNSVe
SF:rsionBindReq,1E,"\0\x06\x81\x85\0\x01\0\0\0\0\0\0\x07version\x04bind\0\
SF:0\x10\0\x03")%r(DNSStatusRequest,C,"\0\0\x90\x04\0\0\0\0\0\0\0\0")%r(NB
SF:TStat,32,"\x80\xf0\x80\x95\0\x01\0\0\0\0\0\0\x20CKAAAAAAAAAAAAAAAAAAAAA
SF:AAAAAAAAA\0\0!\0\x01");
MAC Address: 00:0C:29:3B:73:CB (VMware)
Nmap scan report for 192.168.122.51
Host is up, received arp-response (0.00095s latency).
PORT STATE SERVICE REASON VERSION
53/udp open|filtered domain no-response
MAC Address: 00:25:90:CB:00:18 (Super Micro Computer)
Nmap scan report for 192.168.122.128
Host is up, received arp-response (0.00072s latency).
PORT STATE SERVICE REASON VERSION
53/udp open|filtered domain no-response
MAC Address: 98:AF:65:74:DF:6F (Unknown)
Nmap scan report for 192.168.122.171
Host is up, received arp-response (0.0013s latency).
PORT STATE SERVICE REASON VERSION
53/udp open|filtered domain no-response
MAC Address: E4:E1:30:16:76:C5 (TCT mobile)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 256 IP addresses (24 hosts up) scanned in 100.78 seconds
让我们尝试对192.168.122.1
的tcp/443
端口进行sV
详细服务扫描-我们将看到 NMAP 对运行在该主机上的 Web 服务器进行了相当不错的识别:
root@ubuntu:~# nmap -p 443 -sV 192.168.122.1
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-06 09:02 PST
Nmap scan report for _gateway (192.168.122.1)
Host is up (0.0013s latency).
PORT STATE SERVICE VERSION
443/tcp open ssl/http nginx
MAC Address: 00:0C:29:3B:73:CB (VMware)
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.60 seconds
尝试对192.168.122.51
进行相同的操作,我们发现该服务被正确识别为 VMware ESXi 7.0 管理界面:
root@ubuntu:~# nmap -p 443 -sV 192.168.122.51
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-06 09:09 PST
Nmap scan report for 192.168.122.51
Host is up (0.0013s latency).
PORT STATE SERVICE VERSION
443/tcp open ssl/https VMware ESXi SOAP API 7.0.0
MAC Address: 00:25:90:CB:00:18 (Super Micro Computer)
Service Info: CPE: cpe:/o:vmware:ESXi:7.0.0
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 140.48 seconds
现在我们已经成为使用各种选项扫描端口的专家,让我们来扩展一下。NMAP 允许我们对它发现的任何开放端口运行脚本-这可以节省大量时间!
NMAP 脚本
到目前为止,我们只是看了端口扫描-NMAP 不仅仅是这样。它提供了一个完整的脚本引擎,可以处理 NMAP 的数据包或输出,基于 Lua(一种基于文本的解释语言)。我们不会在本书中深入研究 LUA,但 NMAP 附带了几个预先编写的脚本,其中一些对网络管理员非常有价值。
例如,考虑 SMB 版本信息。微软多年来一直强烈建议退役 SMBv1,尤其是在 2017 年 WannaCry/Petya/NotPetya 恶意软件系列中使用 EternalBlue 和 EternalRomance 漏洞之前。尽管通过在较新的 Windows 版本中甚至难以启用 SMBv1 来有效地退役了 SMBv1,但我们仍然在企业网络中看到 SMBv1-无论是在较旧的服务器平台上还是在实现 Samba 服务中的较旧的基于 Linux 的设备上。使用smb-protocols
脚本扫描这一点非常容易。在使用任何脚本之前,打开脚本查看它的确切功能以及 NMAP 如何调用它(可能需要哪些端口或参数)。在这种情况下,smb-protocols
文本给出了我们的用法,以及输出中可以期望的内容。
-- @usage nmap -p445 --script smb-protocols <target>
-- @usage nmap -p139 --script smb-protocols <target>
--
-- @output
-- | smb-protocols:
-- | dialects:
-- | NT LM 0.12 (SMBv1) [dangerous, but default]
-- | 2.02
-- | 2.10
-- | 3.00
-- | 3.02
-- |_ 3.11
--
-- @xmloutput
-- <table key="dialects">
-- <elem>NT LM 0.12 (SMBv1) [dangerous, but default]</elem>
-- <elem>2.02</elem>
-- <elem>2.10</elem>
-- <elem>3.00</elem>
-- <elem>3.02</elem>
-- <elem>3.11</elem>
-- </table>
让我们扫描目标网络中的一些特定主机,以获取更多信息。我们只展示一个运行 SMBv1 协议的示例主机的输出。从主机名来看,它似乎是一个网络附加存储(NAS)设备,因此很可能在内部是基于 Linux 或 BSD 的。从 OUI 中我们可以看到主机的品牌名称,这给了我们更具体的信息:
nmap -p139,445 --open --script=smb-protocols 192.168.123.0/24
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-06 12:27 Eastern Standard Time
Nmap scan report for test-nas.defaultroute.ca (192.168.123.1)
Host is up (0.00s latency).
PORT STATE SERVICE
139/tcp open netbios-ssn
445/tcp open microsoft-ds
MAC Address: 00:D0:B8:21:89:F8 (Iomega)
Host script results:
| smb-protocols:
| dialects:
| NT LM 0.12 (SMBv1) [dangerous, but default]
| 2.02
| 2.10
| 3.00
| 3.02
|_ 3.11
或者您可以直接使用smb-vuln-ms17-010.nse
脚本扫描Eternal*
漏洞(仅显示一个主机作为示例)。扫描同一主机时,我们发现即使启用了 SMBv1,该特定漏洞也没有发挥作用。但仍强烈建议禁用 SMBv1,因为 SMBv1 容易受到一系列漏洞的影响,而不仅仅是ms17-010
。
在列表中再往下滚动一点,我们的第二个示例主机确实存在该漏洞。从主机名来看,我们可以看到这很可能是一个业务关键的主机(运行 BAAN),因此我们更希望修复这台服务器而不是勒索软件。查看该主机上的生产应用程序,实际上没有理由让大多数用户暴露 SMB-实际上只有系统或应用程序管理员应该映射到该主机,用户应该通过其应用程序端口连接到它。对此的建议显然是修补漏洞(这可能已经有好几年没有做了),但也要将该服务防火墙隔离开大多数用户(或者如果管理员不使用该服务,则禁用该服务)。
Starting Nmap 7.80 ( https://nmap.org ) at 2021-01-06 12:32 Eastern Standard Time
Nmap scan report for nas.defaultroute.ca (192.168.123.11)
Host is up (0.00s latency).
PORT STATE SERVICE
139/tcp open netbios-ssn
445/tcp open microsoft-ds
MAC Address: 00:D0:B8:21:89:F8 (Iomega)
Nmap scan report for baan02.defaultroute.ca (192.168.123.77)
Host is up (0.00s latency).
PORT STATE SERVICE
139/tcp open netbios-ssn
445/tcp open microsoft-ds
MAC Address: 18:A9:05:3B:ED:EC (Hewlett Packard)
Host script results:
| smb-vuln-ms17-010:
| VULNERABLE:
| Remote Code Execution vulnerability in Microsoft SMBv1 servers (ms17-010)
| State: VULNERABLE
| IDs: CVE:CVE-2017-0143
| Risk factor: HIGH
| A critical remote code execution vulnerability exists in Microsoft SMBv1
| servers (ms17-010).
|
| Disclosure date: 2017-03-14
| References:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-0143
| https://technet.microsoft.com/en-us/library/security/ms17-010.aspx
|_ https://blogs.technet.microsoft.com/msrc/2017/05/12/customer-guidance-for-wannacrypt-attacks/
Nmap 安装了数百个脚本。如果您正在寻找特定内容,特别是如果仅通过端口扫描无法确定,那么使用一个或多个 nmap 脚本通常是最简单的方法。只需记住,如果您正在寻找"流氓"主机,比如 DHCP 服务器,您将找到您的生产主机以及任何不需要的实例。
请注意,许多脚本依赖您在扫描中包含正确的端口号。"广播"风格的脚本通常只会扫描您的扫描器所在的子网,因此扫描远程子网可能意味着"借用"或放置主机在该子网上。本列表中讨论的许多核心网络服务在本书的后续章节中都有涉及,包括 DNS、DHCP 等。
请记住(再次强调),未经授权的扫描从来不符合您的最佳利益-首先获得书面许可!
nmap 附带了数百个脚本,还有数百个可以通过快速的互联网搜索获得。我在生产网络上发现的一些预打包的 nmap 脚本包括以下内容:
意外的、恶意的或配置错误的网络基础设施:
服务器问题和恶意服务:
盗版、“影子 IT”、恶意或其他意外服务器:
工作站问题:
网络外围问题:
其他服务器或工作站问题:
这总结了 Nmap 的各种用途。Nmap 在较大的网络中表现不佳 - 例如,在/8
或/16
网络中,或一些非常大的 IPv6 网络中。对于这些网络,需要更快的工具。让我们探索 MASSCAN 工具的这些用途。
Nmap 有限制吗?
Nmap 的主要限制是性能。随着网络规模的增长,Nmap(当然)完成任何扫描所需的时间会越来越长。这通常不是问题,但在生产网络中,如果您的扫描从早上 8 点开始,直到第二天结束,那么很可能有相当长的时间设备大多处于关闭状态或断开连接状态,因此扫描的实用性会受到影响。当您在非常大的网络上时,这一点尤为明显 - 例如,当您的子网掩码缩小或网络数量增加时,Nmap 的扫描时间可能会增加到几个小时、几天或几周。同样,在 IPv6 网络中,通常会看到成千上万甚至数百万的地址,这可能会导致 Nmap 扫描时间长达数年甚至数十年。
有两种方法可以帮助解决这个问题。
首先,如果您阅读 NMAP 的man
页面,有一些参数可以加快速度 - 您可以调整并行性(可以同时运行多少个操作)、主机超时、往返超时和操作之间的延迟等。这些在man
页面上有详细说明,并且在这里有更深入的讨论:nmap.org/book/man-performance.html
。
或者,您可以查看不同的工具。Rob Graham 维护了 MASSCAN 工具,该工具专门用于高性能扫描。有足够的带宽和马力,它可以在不到 10 分钟的时间内扫描整个 IPv4 互联网。该工具的 1.3 版本增加了 IPv6 支持。MASSCAN 的语法类似于 Nmap,但在使用这个更快的工具时有一些需要注意的地方。该工具以及其文档和“陷阱”发布在这里:github.com/robertdavidgraham/masscan
。
对于非常大的网络,一个常见的方法是使用 MASSCAN(或调整为更快扫描的 Nmap)进行初始扫描。然后可以使用来自初步扫描的输出来“馈送”下一个工具,无论是 Nmap 还是可能是其他工具,也许是诸如 Nessus 或 OpenVAS 之类的安全扫描工具。像这样将工具“链接”在一起,最大程度地发挥各自的优势,以在最短的时间内实现最佳结果。
所有工具都有其局限性,IPv6 网络对于扫描工具仍然是一个挑战。除非您可以以某种方式限制范围,否则 IPv6 将很快达到扫描主机的网络带宽、时间和内存的极限。DNS 收集等工具可以在这方面提供帮助 - 如果您可以在扫描服务之前确定哪些主机实际上是活动的,那么可以将目标地址数量显着减少到可管理的范围内。
端口扫描已经完成,让我们离开有线世界,探索在无线网络上使用 Linux 进行故障排除。
无线诊断操作
无线网络中的诊断工具通常关注于发现信号强度低和干扰的区域 - 这些问题会给使用您的无线网络的人造成问题。
有一些基于 Linux 的优秀无线工具,但我们将讨论 Kismet、Wavemon 和 LinSSID。这三个工具都是免费的,并且都可以使用标准的apt-get install <package name>
命令进行安装。如果将工具搜索范围扩大到包括攻击类型工具或商业产品,那么列表显然会变得更大。
Kismet 是 Linux 上可用的较旧的无线工具之一。我第一次接触它是作为信息安全工具,强调“隐藏”的无线 SSID 实际上根本不是隐藏的!
要运行该工具,请使用以下命令:
$ sudo kismet –c <wireless interface name>
或者,如果您有一个完全工作的配置,不需要实际的服务器窗口,运行以下命令:
$ sudo kismet –c <wireless interface name> &
现在,在另一个窗口中(或者如果您在后台运行 Kismet,则在同一个位置),运行 Kismet 客户端:
$ kismet_client
在显示中,您将看到各种 SSID 以及传输它们的接入点的 BSSID。当您浏览此列表时,您将看到用于每个 SSID 的信道和加密类型,您的笔记本电脑理解它可以在该 SSID 上协商的速度,以及该 SSID 上的所有客户端站点。每个客户端都将显示其 MAC 地址、频率和数据包计数。这些信息都作为每个客户端的关联过程和持续连接的“握手”部分以明文发送。
由于您的无线适配器一次只能在一个 SSID/BSSID 组合上,所以所呈现的信息是通过在信道之间跳转收集的。
在下面的屏幕截图中,我们展示了一个隐藏的 SSID,显示了接入点的 BSSID,以及与该接入点上的该 SSID 关联的八个客户端:
图 3.11 - 主屏幕上的典型 Kismet 输出
在网络上按Enter键会给您更多关于从该接入点广播的 SSID 的信息。请注意,我们在这个显示中看到了一个隐藏的 SSID:
图 3.12 - Kismet 输出,接入点/SSID 详细信息
进一步深入,您可以获取有关客户端活动的详细信息:
图 3.13 - Kismet 输出,客户端详细信息
Kismet 是一款用于侦察和演示的好工具,但菜单相当容易迷失在其中,当排除信号强度故障时,很难专注于追踪我们真正关心的事物。
Wavemon 是一个非常不同的工具。它只监视您的连接,因此您必须将其与一个 SSID 关联起来。它会给出您当前的接入点、速度、信道等信息,如下面的屏幕截图所示。这可能是有用的,但它只是对通常用于故障排除所需的信息的狭窄视图 - 请注意在下面的屏幕截图中,报告的值主要是关于数据吞吐量和信号,从适配器关联到的网络中看到的。因此,Wavemon 工具主要用于故障排除上行问题,并且在故障排除、评估或查看整体无线基础设施方面并不经常使用:
图 3.14 - Wavemon 显示
更有用的是LinSSID,这是对 MetaGeek 的 Windows 应用 inSSIDer 的一个相当接近的移植。运行应用程序后,屏幕相当空白。选择要用于“嗅探”本地无线网络的无线适配器,然后按Run按钮。
显示了两个频谱上可用的信道(2.4 和 5 GHz),每个 SSID 在顶部窗口中表示。在列表中选中的每个 SSID/BSSID 组合都显示在底部窗口中。这样很容易看到列表中每个 AP 的信号强度,以及图形显示中的相对强度。在它们重叠的图形显示中,相互干扰的 SSID 是显而易见的。下面的屏幕截图显示了 5 GHz 频谱情况 - 请注意 AP 似乎都聚集在两个信道周围。其中任何一个都可以通过更改信道来提高性能,在我们的显示中有很多信道可以使用 - 实际上,这正是推动迁移到 5 GHz 的原因。是的,这个频段更快,但更重要的是,它更容易解决来自邻近接入点的任何干扰问题。还要注意,图表上显示的每个信道大约占用 20 GHz(稍后会详细介绍):
图 3.15 - LinSSID 输出 - 主屏显示信道分配和强度,文本和图形两种方式
2.4 GHz 信道也不好。由于在北美只有 11 个信道可用,通常会看到人们选择信道 1、6 或 11 - 这 3 个信道不会相互干扰。在几乎任何不是农村的环境中,您会看到几个邻居使用您认为是空闲的那 3 个信道!在下面的屏幕截图中,我们看到每个人都选择了信道 11,原因不明:
图 3.16 - 来自无线邻居的干扰 - 多个无线 BSSID 使用相同的信道
在第二个例子中(也来自 2.4 GHz 频谱),我们看到人们选择了更宽的信号“足迹”的结果。在 802.11 无线中,您可以将默认的 20 GHz 信道扩展到 40 或 80 GHz。这样做的好处是 - 在没有任何邻居的情况下 - 这肯定会提高吞吐量,特别是对于轻度使用的信道(例如一个或两个客户端)。然而,在相邻接入点有重叠信号的环境中,您会发现增加信道宽度(在 2.4 GHz 频段上)会给每个人带来更多的干扰 - 相邻接入点可能发现自己没有好的信道选择。这种情况通常会影响每个人的信号质量(和吞吐量),包括选择增加信道宽度的那个“坏邻居”。
在 5 GHz 频段,有更多的信道,因此通常可以更安全地增加信道宽度。不过,在选择或扩大接入点上的信道之前,最好先看看您的频谱发生了什么:
图 3.17 - 在 2.4 GHz 频谱中使用更宽的信道宽度,导致干扰
在我们讨论过的工具中,LinSSID 特别适用于进行无线站点调查,您需要查看可用的信道,更重要的是,跟踪信号强度并找到“死角”,以最大限度地覆盖建筑物或区域的无线覆盖范围。 LinSSID 也是我们讨论过的工具中最有帮助的,可以找到信道干扰的情况,或者解决信道宽度选择不当的情况。
通过我们讨论和探讨过的工具,您现在应该能够很好地解决 2.4 GHz 和 5 GHz 频段的无线信号强度和干扰问题。您应该能够使用诸如 Kismet 之类的工具来查找隐藏的 SSID,使用诸如 Wavemon 之类的工具来解决您所关联的网络的问题,并使用诸如 LinSSID 之类的工具来全面查看无线频谱,寻找干扰和信号强度问题,以及信道宽度和信道重叠问题。
总结
通过本章的学习,您应该对 OSI 模型中各种网络和应用协议的分层组织有很好的理解。您应该对 TCP 和 UDP 有扎实的了解,特别是这两种协议如何使用端口,以及 TCP 会话如何建立和终止。使用netstat
或ss
查看您的主机如何连接到各种远程服务,或者您的主机正在监听哪些服务,这是您可以继续使用的技能。在此基础上,使用端口扫描程序查看您的组织中运行着哪些主机和网络服务应该是您会发现有用的技能。最后,我们讨论的 Linux 无线工具应该有助于故障排除、配置和无线站点调查。所有这些技能将是我们在本书中继续前进时建立的东西,但更重要的是,它们将有助于您在组织中解决应用程序和网络问题。
这结束了我们对使用 Linux 进行网络故障排除的讨论。尽管在大多数章节中我们会重新讨论故障排除-随着我们前进并构建基础设施的每个部分,我们会发现新的潜在问题和故障排除方法。在本节中,我们详细讨论了通信从网络和主机的角度发生的情况。在下一章中,我们将讨论 Linux 防火墙,这是限制和控制通信的好方法。
问题
随着我们的结束,这里有一系列问题供您测试对本章材料的了解。您将在附录的评估部分找到答案:
-
当您使用
netstat
、ss
或其他命令评估本地端口时,您是否会看到处于ESTABLISHED
状态的 UDP 会话? -
确定哪些进程监听哪些端口是重要的吗?
-
确定从任何特定应用程序连接到哪些远程端口是重要的吗?
-
为什么要扫描除
tcp/443
以外的端口上即将过期或即将过期的证书? -
为什么 netcat 需要
sudo
权限才能在端口80
上启动监听器? -
在 2.4 GHz 频段中,哪三个信道是最佳选择以减少干扰?
-
除了 20 GHz 之外,您何时会使用其他 Wi-Fi 信道宽度?
进一步阅读
-
OSI 模型(ISO/IED 7498-1):
standards.iso.org/ittf/PubliclyAvailableStandards/s020269_ISO_IEC_7498-1_1994(E).zip
-
Nmap:
nmap.org/
-
Nmap 参考指南:
nmap.org/book/man.html
www.amazon.com/Nmap-Network-Scanning-Official-Discovery/dp/0979958717