小型网络的网络安全指南-全-
小型网络的网络安全指南(全)
原文:
zh.annas-archive.org/md5/dd9e750da6297e0a4260065981d78386译者:飞龙
前言

本书是一本网络安全入门书,旨在帮助系统和网络管理员及所有者理解保护网络安全的基本原理。你的个人网络安全对于防范欺诈和其他敌对行为至关重要。你可能很容易告诉自己,你不可能成为目标,你没有任何对手想要利用或攻击的东西。然而,你的个人身份信息(PII)、受保护的健康信息(PHI)、知识产权以及政府信息和身份认证都具有价值。如果未能保护这些信息,可能会导致身份盗窃等后果,进而对你的生活产生严重影响。
就我们而言,小型网络由 100 个或更少的端点组成。端点,或主机,是任何连接到网络或构成网络一部分的系统或设备,如台式机、笔记本电脑或移动设备(如手机或平板)。较大的网络,接近企业网络规模,使用本书中介绍的类似工具和技术来为其用户和系统提供安全保障,只是其规模更大且通常需要更高的成本。
安全保护小型网络的一个缺点是,你必须自己维护和管理一切,支持有限且预算可能紧张。保护网络需要不断的维护,我们会介绍一些在有需要时以低成本完成这一工作的方式。最终,本书的目标是为你提供工具和知识,使你能够根据可用的资源(无论是时间还是金钱)保护你的网络。
如何使用本书:期望内容
本书的编写方式是,若你从章节到章节逻辑性地阅读,你将逐步提升安全成熟度,最终达到拥有深度防御架构的网络。深度防御是网络安全的一种方法,其中通过多层防御解决方案来保护宝贵的数据和信息。第 1 到第四章讲解了如何设计和架构网络,以更好地增强防御和网络监控能力。接着,第 5 到第八章讨论了低成本、高影响的被动防御策略,旨在防止对手访问你的网络或端点。最后,第 9 到第十一章聚焦于定期备份和主动防御的重要性,帮助你接收并响应网络中可疑或恶意活动的警报,从而实现网络安全事件响应。
大多数章节包含独立的项目。你可以选择按顺序完成每个项目,或者可以挑选你想完成的项目。然而,早期章节中关于网络架构的概念提供了最佳的投资回报,无论是从时间还是金钱上来看,而且需要的后续支持和维护较少。后期章节涉及主动防御的内容则需要持续监控,并且完成早期项目后会更高效。在某些情况下,完成早期章节的项目还会为后续项目提供基本知识,比如对命令行的熟悉。总的来说,你应该根据自己的环境和需求,选择最适合自己的顺序来完成每章;例如,如果你已经有了主机和网络防火墙,你大概可以跳过第三章。
我建议在开始自己的冒险之前先阅读第一章。它涵盖了两个基本主题:设置你将在全书中使用的服务器,以及创建网络图和资产清单。在你能够保护你的网络之前,你需要了解其拓扑结构:哪些主机连接到网络,以及它们是如何相互连接的。绘制拓扑结构将帮助你跟踪设备并识别网络上的异常活动。预计大多数读者将以虚拟机(VM)实现书中的项目。虚拟机(它们也是端点!)让你通过一台物理计算机运行多台计算机。使用虚拟机是一种更便宜、更简便的方式,通过较少的硬件要求实现相同的结果。(我将在推荐硬件一节中描述剩余的硬件建议。)
推荐(但非必需)知识
在本书中,你将学习与保护小型网络相关的网络安全基础知识。全书将引导你完成完成每章和项目所需的所有步骤,且步骤非常基础。如果你有使用虚拟机、命令行以及管理或维护任何规模的网络的经验,将会有帮助。尽管如此,你应该能够跟上,即使没有经验,因为你将在进展过程中学习到所需的技能。
推荐硬件
本书中的一些项目可能需要你当前没有的硬件、设备或系统。在可能的情况下,将提供购买新硬件的替代方案,但在某些情况下,你可能会发现最好的或唯一的解决办法是购买一些新设备。以下是每章中使用的硬件清单。
虚拟机主机系统
-
你可以使用现有的计算机来运行虚拟机,只要该物理计算机具有足够的内存(RAM)和处理器(CPU)资源。作为一般规则,每个你计划运行的虚拟机需要 2GB 的内存和一个 CPU 核心,主机操作系统则需要至少 4GB 的内存和一个 CPU 核心。因此,为了完成本书的每一章,你应计划使用一台至少拥有 16GB 内存和八个 CPU 核心的物理系统。
-
大多数现代系统都具备这一等级的规格,你也可以使用网络附加存储(NAS)或其他能够运行虚拟机的系统,或者像 Intel NUC 这样的微型计算单元,按同样的方式使用。NAS 是一种连接到网络的设备,可以从中央位置存储和检索数据,且大多数情况下还会提供额外的网络服务和功能,例如托管虚拟机的能力。如果你在计算机上有闲置资源,可以从这里开始。如果虚拟机超过了原始主机的硬件资源,你总是可以将虚拟机迁移到新的系统上。
防火墙
- 在 第三章中,你将学习如何安装和配置 pfSense 防火墙。这个防火墙可以低价购买,并且它能够快速且轻松地大幅提高网络安全性。推荐的设备是 Netgate SG-3100,因为它具有成本效益且易于设置和维护。你也可以自行搭建防火墙,但 Netgate 可能更安全,且性价比更高。
无线路由器
- 如果你计划在小型网络中使用无线网络(预计大部分设备将通过无线连接),你将需要一个无线路由器或接入点。本书中大部分相关示例将使用 ASUS RT-AC5300。这款路由器在价格和功能上属于中档设备,提供企业级功能而不会有过高的价格。
受管交换机
- 受管交换机 是一种可以配置来监控和控制网络流量的设备。这是另一种相对低成本的设备,它将为你提供非常有用的功能,比如将易受攻击的设备与重要设备分开。我们将主要讨论并使用 Netgear GS308E。
网络 TAP
- 网络 TAP 是一种监控设备,用于镜像两个网络点之间的流量,允许你在流量经过设备和网络之间时收集网络流量。你可以分析捕获的流量,以识别可疑或恶意行为,然后根据这些行为调整防御,提供最佳的机会来防止网络安全事件。Dualcomm 提供了几款具有不同能力、容量和价格区间的 TAP。对于大多数小型网络,ETAP-2003 就足够了;我们将重点介绍这一设备。
替代方案
- 尽管逐步的操作说明会根据推荐的设备进行调整,但这些过程已经足够通用,你应该能够使用任何其他类似设备来跟随这些步骤。所有在本介绍中推荐的设备的替代品,都可以从 Ubiquiti 公司获取。虽然 Ubiquiti 设备价格较高,但它们提供了更强大的功能、便捷的管理体验,并且提供商业支持。
概述
如果你想以最具成本效益的方式开始你的安全之旅,可以先完成第 1 至第四章,这些章节讲解了如何创建一个具有防御能力的网络架构。如果你更关注网络监控、检测和事件防范领域,可以深入学习第 5 至第八章,了解高影响力的防御策略,以减轻网络漏洞并防止敌人访问你的终端。如果你的网络和防御能力已经相对成熟,可以研究第 9 至第十一章,掌握更多积极的策略,保护你的网络、终端和用户免受可能针对个人信息或商业数据的对手攻击。
第一章:# 开始使用基础 Linux 系统和网络地图

本章介绍了两个基本项目:设置一个基础的 Ubuntu 系统,这是你在本书中将一直使用的系统,并创建一个网络地图。你将使用这个系统作为基础,在其上安装和运行各种安全工具,而网络地图将提供一个所有设备在网络中如何相互联系和通信的视觉概览。
我们将首先定义并概述常见的 Linux 操作系统,然后介绍如何在虚拟机(VM)、物理计算机和云环境中安装 Linux 版本(特别是 Ubuntu)。无论安装在哪里,我都会教你如何提升 Ubuntu 的安全性,并将其添加到网络地图中。每次向网络中添加新终端时,都必须更新网络地图,以确保其始终是最新的。过时的网络地图对任何人都没有用。
Linux 操作系统
Linux 是首选的操作系统,因为 Linux 系统是开源的,因此具有很高的扩展性,特别是与 Windows 或 macOS 相比。你对操作系统及其上运行的应用程序的控制非常细致,这使得你能更好地掌控终端和网络的安全性。
有多种 Linux 操作系统(或发行版)可供选择。每个发行版使用不同的基本工具和图形用户界面(GUI),每个发行版的外观和功能都有些不同。例如,Kali Linux 是一个面向攻击性操作的发行版,常被渗透测试人员用于执行网络评估。Red Hat Linux 可能是最常用的企业级发行版,Fedora 和 CentOS 等其他发行版也基于 Red Hat。如果你对 Linux 感兴趣,可以尝试不同的发行版,找到最适合自己的那个。
本书主要使用 Ubuntu,它是最具用户友好性的 Linux 发行版之一,也是初学者或对 Linux 不熟悉的人最容易上手的操作系统。Ubuntu 有三个版本:桌面版、服务器版和核心版。对于我们的目的,桌面版就足够了。如果你打算将 Ubuntu 服务器用于额外的网络服务,如文件服务器或动态主机配置协议(DHCP)服务器,那么服务器版会更合适。Ubuntu 核心版专为资源受限的应用而设计,例如物联网(IoT)实现。
最新版本的 Ubuntu 操作系统可以从ubuntu.com/download/下载。这些下载文件将是 ISO 文件格式,意味着文件扩展名为.iso。ISO 文件是逻辑镜像或容器,可以用来模拟物理媒体,如 CD 或 DVD。
以下部分讲解了如何在 macOS 或 Windows 上安装 Ubuntu,无论是作为物理设备还是虚拟机,以及如何在云中安装。使用物理设备可以充分利用系统的所有资源,如 CPU 和 RAM,但需要你有一个可以安装 Ubuntu 的物理系统。使用虚拟机提供了几个有用的功能,比如可以创建快照(稍后会在本章讨论)。在云中创建虚拟机提供了额外的能力,如可以从任何地点轻松访问你的系统,但通常也带来了额外的安全性考虑。一旦你完成了针对你的平台特定的安装步骤,跳到 “完成 Linux 安装” 第 8 页。
1:创建一个 Ubuntu 虚拟机
在本书中,你将为不同的目的创建 Ubuntu 系统。每个系统都将基于我们现在要创建的系统,这个系统将作为标准基础操作系统,你可以在其基础上添加用于保护网络的工具和应用程序。
虚拟机监控器选项
虚拟机监控器 是一种软件,允许你创建并运行虚拟机,通过使用来宾操作系统。在这个初始项目中,你可以使用 VMware 的一款廉价商业虚拟机监控器来创建 Ubuntu 虚拟机。VMware Workstation 有多个版本,可以从 www.vmware.com/ 获取。VMware Player(适用于 Windows)和 VMware Fusion Player(适用于 Mac)对于个人使用是免费的,但它们没有一些我们将在后续章节中使用的高级功能。我推荐使用 VMware Workstation Pro 和 VMware Fusion Pro。这两款的商业许可证相对较便宜。另一种解决方案是先使用免费的 Workstation Player,如果需要,可以升级到商业许可证。Workstation 和 Player 版本的大多数安装步骤是相同的,只有 Workstation 和 Fusion 之间有些许差异。
另一个选择是使用 VirtualBox,这是 Oracle 维护的一个免费的虚拟机创建和管理解决方案。VirtualBox 适用于所有主要操作系统,你可以从 www.virtualbox.org/wiki/Downloads/ 下载它。
适用于 Windows 的 VMware Workstation 和 VMware Player
在 VMware Workstation 或 VMware Player 中创建虚拟机,请按以下步骤操作:
-
- 在 VMware 中点击 文件▸新建虚拟机。
-
- 在打开的新虚拟机界面上,选择 典型(推荐) 并点击 下一步。
-
- 选择 安装光盘映像文件 (iso)。
-
- 使用 浏览 按钮,导航到并选择你之前下载的 Ubuntu ISO 文件,然后点击 下一步。
-
5. 易安装向导会要求提供虚拟机的用户详情;填写全名、用户名和密码字段,然后点击下一步。
-
6. 在提示时为虚拟机提供一个有意义的名称,表示其在网络中的角色。
-
7. 将虚拟机保存到默认位置(或你想要的位置),然后点击下一步。
-
8. 如果主机有足够的磁盘空间,将虚拟磁盘大小设置为 40GB;否则,接受默认的 20GB。
-
9. 将虚拟磁盘存储为单个文件,而不是分成多个文件,然后点击下一步。
-
10. 点击自定义硬件。
-
11. 如果主机有足够的内存,将虚拟机的内存从 2GB 增加到 4GB。
-
12. 将处理器设置为 1。
-
13. 在网络适配器下,选择桥接模式,为你的虚拟机分配独立的 IP 地址和网络连接。
-
14. 点击声卡▸移除。
-
15. 点击打印机▸移除。
-
16. 点击完成。
虚拟机将被创建,操作系统将开始安装。
VMware Fusion 和 VMware Fusion Player for macOS
安装完 VMware Fusion 或 VMware Fusion Player 后,按照以下步骤创建你的第一个虚拟机:
-
1. 在 VMware 中点击文件▸新建▸继续。
-
2. 将你的 ISO 文件拖放到 VMware Fusion 窗口,或点击使用另一个磁盘或磁盘映像按钮在文件系统中定位文件;然后点击继续。
-
3. 易安装向导会要求提供虚拟机的用户详情;填写显示名称、账户名称和密码字段。
-
4. 确保“使你的主文件夹对虚拟机可访问”复选框未勾选,然后点击继续。
-
5. 点击自定义设置。
-
6. 将虚拟机保存到默认位置(或你想要的位置)。
-
7. 如果主机有足够的磁盘空间,将虚拟磁盘大小设置为 40GB;否则,接受默认的 20GB。
-
8. 在处理器和内存菜单中,如果主机有足够的内存,将虚拟机的内存从 2GB 增加到 4GB,并将处理器设置为 1。
-
9. 取消勾选连接复选框,以在其上下文菜单中添加或断开以下外设:声卡、软盘、打印机和相机。(从虚拟机中断开未使用或多余的外设可以减少潜在的攻击面。)
点击播放按钮启动虚拟机,操作系统安装将开始。
VirtualBox
在 VirtualBox 中创建虚拟机的步骤与使用 Windows PC 或 Mac 作为主机系统无关。下载并安装 VirtualBox 后,按照以下步骤创建虚拟机:
-
1. 点击 VirtualBox 窗口顶部的新建按钮。
-
2. 为你的虚拟机提供一个相关的名称,指定保存文件的位置(默认文件夹通常可以),并从下拉菜单中选择正确的操作系统:Linux▸Ubuntu(64 位);然后点击继续。
-
如果你的主机有足够的内存,将虚拟机的内存从 2GB 增加到 4GB,并点击继续。
-
选择现在创建一个新的虚拟硬盘,然后点击创建。
-
选择VMDK作为硬盘格式并点击继续。
-
选择动态分配并点击继续或下一步(取决于你的操作系统)。
-
如果主机有足够的磁盘空间,请将虚拟磁盘大小设置为 40GB;否则,接受默认的 32GB 并点击创建。
-
选择虚拟机并点击设置。
-
前往设置▸系统▸主板。
-
在启动顺序中,取消勾选软盘复选框。
-
前往设置▸系统▸存储。
-
选择 CD 驱动器(它将显示为控制器:IDE,并且旁边会有一个 CD 图标)。
-
在属性面板中,点击CD 图标以选择一个磁盘文件,并指向你的 Ubuntu ISO 文件。
-
在设置▸音频下,取消勾选启用音频复选框。
-
在设置▸网络▸适配器 1下,将附加到下拉菜单切换为桥接适配器,这样虚拟机会被分配自己的 IP 地址,并且在逻辑上与主机系统的网络设置分开。
-
点击确定。
注意:硬盘格式选项有 VDI、VHD 或 VMDK。VDI 是 VirtualBox 的专有格式。VHD 由微软开发,兼容 Windows,并且可以在 Windows 操作系统下轻松挂载为虚拟磁盘。VMDK 最初由 VMware 开发,但现在是一个开放的文件格式。VMDK 兼容 VirtualBox 和 VMware,因此,如果你选择从一个平台切换到另一个平台,你的虚拟硬盘不会遇到问题。
2:创建物理 Linux 系统
如果你不想创建虚拟机,也可以选择使用物理计算机,像安装 Windows 或 macOS 一样直接在硬件上安装 Ubuntu。使用物理系统有诸如提升性能或减少内存和处理能力要求等优势。主要的缺点是物理系统通常不像虚拟机那样灵活。在你本书的后续章节中,会要求你创建多个 Linux 系统,因此我们假设你主要使用虚拟机。然而,如果你决定为每个项目使用物理系统,依然可以跟随教程进行操作。
要创建一个物理 Ubuntu 系统,你需要一个可启动 USB 驱动器,这意味着你会将 Ubuntu 安装到一个 USB 驱动器上,可以插入任何计算机并从那里进行安装。
Windows 上的可启动 USB
在 Windows 计算机上,创建可启动 Ubuntu USB 的最简单方法是使用 Rufus,这是一款专门用于创建可启动媒体的小型工具。请从rufus.ie/下载最新版本。Rufus 是一个便携式可执行文件,这意味着你无需安装它,只需下载并运行即可。下载后,按照以下步骤操作:
-
1. 插入一个至少 16GB 的 USB 闪存驱动器。Rufus 将格式化此 USB 驱动器,请确保其中没有任何你想保留的内容。
-
2. 运行 Rufus 可执行文件。
-
3. 一旦 Rufus 打开,确保设备下拉菜单显示已选择正确的 USB 驱动器。通常最简单的方法是只插入目标 USB 设备,并拔掉其他设备。
-
4. 在启动选择中,选择 磁盘或 ISO 镜像。
-
5. 点击 选择。
-
6. 找到并选择你的 Ubuntu ISO 文件。
-
7. 选择后,Rufus 会加载一组启动 USB 的默认设置;接受它们并点击 开始。
-
8. Rufus 可能会显示一个弹窗,询问你是否希望以 ISO 或 DD 镜像模式写入媒体;选择 ISO 模式 并点击 确定。在稍后的 Ubuntu 安装过程中,如果无法继续安装或似乎卡住,重复此过程并选择 DD 模式。
-
9. Rufus 会显示一个弹窗,通知你它将格式化 USB 驱动器;点击 确定 以继续。
在 macOS 上创建启动 USB
Etcher 是一个开源工具,用于在 macOS 上将操作系统镜像写入可移动媒体,例如 USB 驱动器和 SD 卡。从 www.balena.io/etcher/ 下载最新版本。下载并安装后,请按照以下步骤操作:
-
1. 插入一个至少 16GB 的 USB 闪存驱动器。Etcher 将格式化你的 USB 驱动器,请确保其中没有任何你想保留的内容。
-
2. 运行 Etcher。
-
3. 一旦 Etcher 打开,点击 从文件闪存,并选择你的 Ubuntu ISO 文件。
-
4. 点击 选择目标 并选择你的 USB 驱动器。
-
5. 点击 闪存 创建你的启动 Ubuntu USB(你可能会被要求输入计算机密码,以允许 Etcher 对 USB 进行更改)。
-
6. 闪存过程将开始,并会出现进度条。过程完成后,系统可能会提示“你插入的磁盘无法被此计算机读取。”如果是这样,只需弹出 USB 驱动器;不要选择初始化。
使用启动 USB
过程完成后,你将拥有一个可启动的 Ubuntu Linux USB 驱动器。将其插入你希望安装 Ubuntu 的计算机,并启动或重启计算机。你可能需要更改系统的启动顺序,以便它从 USB 启动,而不是从内置硬盘启动。为此,你需要中断启动顺序,通常通过按 ESC、F8、F10 或 F12 来完成。请在网上搜索查找适合你计算机的中断键,或者重新启动系统并按下这些键,直到成功进入计算机的基本输入输出系统(BIOS)。
注意:从技术上讲,大多数现代计算机使用统一可扩展固件接口(UEFI),它相比过时的 BIOS 拥有更强大的功能。我们将在文中交替使用 BIOS 和 UEFI 两个术语。
在 BIOS 中,负责操作系统外的硬件管理,改变启动顺序,使计算机首先从 USB 启动。然后重启计算机,它将进入 Ubuntu 安装环境。在 Mac 上,只需在系统启动时按住 OPTION 键,然后选择从 USB 启动。
3:创建基于云的 Linux 系统
将网络基础设施迁移到云端是很常见的,这意味着我们的服务运行在别人的计算机上。网站和运行它们的网络服务器在云端通常比在我们的私有网络和 VPN 服务器上更容易访问(从全球任何地方)和管理。(我们将在第五章详细讨论 VPN。)在本节中,我们将解释如何使用云服务提供商创建 Linux 计算机。我们将使用 Vultr 进行此项目,因为它相对便宜,可靠,并且如果您之前没有使用过云服务提供商,它提供了一个简单的学习曲线。无论使用哪个服务提供商,步骤应该是相似的,无论是使用 Amazon Web Services、Microsoft Azure 还是其他服务。
-
1. 在
www.vultr.com/创建一个帐户。 -
2. 在帐户仪表板上,点击+▸部署新服务器。
-
3. 选择云计算。其他选项(高频、裸金属等)适用于专业应用,与你的目的不符。
-
4. 选择服务器的位置。选择离您地理位置较近的服务器位置可以提高虚拟机的访问速度;但是,如果您想隐藏自己的位置,可以选择其他国家的服务器位置。
-
5. 对于服务器类型,选择最新版本的 Ubuntu。
-
6. 选择服务器大小。最便宜的选项是一个不错的起点;如果需要,您可以稍后升级您的虚拟机。
-
7. 为您的服务器提供一个主机名。
-
8. 点击部署。
服务提供商现在将启动您的 Ubuntu 虚拟机,这与在 VMware 或 VirtualBox 中创建虚拟机相同。这个过程可能需要一些时间。一旦确认虚拟机已启动并运行,您的服务提供商将提供 IP 地址、用户名和密码以访问虚拟机。然后,您可以按照以下各节中的步骤来设置和保护虚拟机。
完成 Linux 安装
如果您在云端或使用 VMware 和 Easy Install 创建了 Linux 系统,启动虚拟机会自动安装 Ubuntu,创建您的用户帐户,并展示 Ubuntu 桌面环境,类似于 Windows 或 Mac 桌面。如果您使用了 VirtualBox 或正在创建物理 Linux 系统,您需要完成一些额外的步骤才能达到该阶段。
在 VirtualBox 中,按照以下步骤操作:
-
1. 点击开始按钮以启动虚拟机。
-
2. 使用 Ubuntu 安装向导,选择您希望的语言并点击安装 Ubuntu。
-
3. 选择你的键盘布局并点击继续。
-
4. 在“更新和软件”屏幕上,选择最小安装,因为你不需要与操作系统一起安装的大部分附加软件。
-
5. 勾选两个复选框,以允许从各种来源安装软件更新。
-
6. 点击继续。
-
7. 在下一屏幕上,向导会询问你是否要擦除磁盘并安装 Ubuntu,并显示警告,如图 1-1 所示。点击高级功能按钮并选择使用 LVM 进行新 Ubuntu 安装。使用 LVM 可以提供更大的灵活性和对磁盘及其分区的控制。LVM 允许进行诸如命名逻辑卷以及在需要时动态调整分区和虚拟硬盘大小等高级功能。

图 1-1:Ubuntu 安装类型提示
请记住,这个安装向导仅仅是针对虚拟机及其附加的虚拟硬盘(我们之前创建的)。它不会影响主机系统的物理硬盘。继续在虚拟机中进行安装不会导致文件或数据丢失。
-
8. 点击确定▸立即安装。
-
9. 系统会提示你将更改写入磁盘(即虚拟机的虚拟硬盘)。点击继续以接受你刚刚为这个虚拟机设置的配置。
在 Ubuntu 安装过程中,系统会要求你设置操作系统的某些设置,如你的位置(时区设置)、你的姓名、计算机名称或主机名,以及你的用户名和密码等用户信息。根据需要设置这些内容,然后继续安装。最终,操作系统安装将完成,系统会展示 Ubuntu 桌面环境。
警告:不要设置或允许用户自动登录,因为这种配置对任何计算机来说都不安全。始终使用登录时需要我的密码的设置。
首次登录时,Ubuntu 会要求你配置在线帐户,并询问你是否愿意与开发人员共享匿名统计数据。该系统需要保持安全,因此不应连接到 Google 或 Microsoft 等云服务。跳过所有这些配置选项,并尽可能禁止共享数据。这些建议不仅适用于 Ubuntu 虚拟机的配置,也适用于生活中的隐私保护。
完成物理系统上的 Ubuntu 安装时,你将按照相同的步骤进行,唯一的区别是磁盘分区会影响计算机内部的物理硬盘,而不是虚拟硬盘。安装 Ubuntu 后,像之前一样在 BIOS 中重置启动顺序,使计算机从内部硬盘启动,而不是 USB,同时也将可启动的 USB 移除。
加强你的 Ubuntu 系统
现在你已经创建了一个基础的虚拟或物理机器,接下来你将进行一些初步的配置更改,以确保你的系统是安全的。这个过程称为硬化,通常是指保持系统与最新操作系统和软件补丁同步,安装一些额外的管理软件,并修改配置文件以增强系统安全性。
4: 安装系统软件包
在 Ubuntu 中,你将使用高级包管理工具(APT)来确保系统与最新的补丁保持同步。在 Linux 中,人们使用软件包一词来指代软件,而 APT 是一个包管理工具,用于安装、卸载、更新或以其他方式管理系统上的工具和软件。
APT 是一个命令行界面(CLI)工具,这意味着你将使用 Linux 终端与它交互,而不是像 Windows 更新那样的图形界面工具。
注意,大多数操作系统都有 CLI;Windows 有命令提示符和 PowerShell,macOS 有自己的终端。基本上,CLI 是通过文本命令与操作系统进行交互的更直接方式。CLI 看起来像一个简单的文本编辑器,里面有一个等待你输入的提示符。命令提示符、Linux 终端和 macOS 终端默认都是黑色背景白色文字,而 PowerShell 是蓝色的。
在云部署中,默认情况下你可能只能访问 Linux 终端,而无法访问图形界面。如果是这种情况,你在登录后会直接看到终端窗口。否则,要在 Ubuntu 中访问终端,请点击屏幕左上角的活动菜单,输入终端,然后点击出现的终端图标,就像在 Windows 开始菜单中搜索并打开应用程序一样。
默认情况下,即使是管理员,你也不能在 Linux 系统上运行某些命令或执行某些操作,因为你没有必要的权限(在 Linux 中称为特权)。许多命令和操作是为超级用户保留的,或称为 Linux 中的root 用户账户。作为一个非 root 用户(即非超级用户)在 Linux 中,你需要使用 sudo 命令,sudo 代表超级用户执行。例如,要使用 APT 更新 Ubuntu 系统中所有已安装的软件包,可以使用以下命令,在每个命令后按 ENTER 执行:
$ `sudo apt update`
$ `sudo apt upgrade`
第一个命令sudo apt update会获取当前安装的每个应用程序的可用更新列表。第二个命令sudo apt upgrade会下载并安装这些更新。系统提示时,输入密码;要求你验证身份以运行特权命令是sudo的安全特性。每次使用sudo运行命令时,该操作会被记录在/var/log/auth.log文件中,因此所有管理操作都可以在事后进行审计。当提示继续安装软件包时,输入Y(是)并按回车键。
警告 在 Linux 和 macOS 的命令行中,当提示符显示美元符号($)时,这意味着你当前处于(即以)普通非管理员用户身份。如果提示符显示井号(#),则表示你处于 root 用户上下文中,具有完全的系统访问权限,可以进行更改、移动文件和删除文件。如果你以 root 身份操作,请小心,因为很容易犯错并导致操作系统出现问题。最好主要以普通用户身份工作,使用命令行时再使用sudo。
当你安装新软件包时,APT 通常也会安装这些软件包所需的任何依赖项(否则,软件会找不到依赖项,导致无法正常运行)。但是,当你卸载软件时,这些依赖项可能会被遗留下来。系统中残留不必要的应用程序是不安全的,因为攻击者可能会利用这些残留的软件包中的漏洞来访问你的网络或执行其他恶意活动。运行sudo apt autoremove和sudo apt clean,如下面所示,分别用来移除不再需要的依赖项和删除以前下载的软件包:
$ `sudo apt autoremove`
$ `sudo apt clean`
要安装新的软件包,请使用sudo apt install。一个有用的软件包是 SSH(安全外壳),它允许你通过命令行远程访问和管理系统。运行sudo apt install openssh-server来安装 SSH(如果安装其他软件包,只需将openssh-server替换为相应的软件包名称)。
你可以像这样使用apt同时安装多个软件包:
$ `sudo apt install openssh-server` `package_name1 package_name2`
再次输入密码,如果提示,输入Y确认。安装完 SSH 后,你将能够配置远程访问系统。
5: 管理 Linux 用户
网络安全管理的一部分是管理网络中的用户帐户和主机。你可能需要在 Ubuntu 机器上添加新用户,例如为新服务或应用程序创建新的用户帐户,或者允许他人管理你的系统。添加新用户是一个管理操作,需要使用sudo命令。使用adduser命令来添加新用户:
$ `sudo adduser` `username`
系统会要求你为该用户指定一个密码,但使用密码短语更好,因为密码短语更容易记住,通常较长,且更难破解。(我们将在第十一章中更详细地讨论密码短语和创建强密码的内容。)
如果你愿意,你还可以为用户设置姓名、电话号码和其他信息;否则,按 ENTER 键跳过这些字段。
删除用户同样简单:
$ `sudo deluser` `username`
此外,你可能希望授予新用户sudo权限,以便他们能够管理系统,这可以通过usermod命令实现:
$ `sudo usermod -aG sudo` `username`
-aG(添加组)参数会将用户添加到sudo组中。Linux 中的用户组是用户账户的集合,用于为特定的用户账户分配权限和权限,例如读取和写入某些文件的权限。然而,请记住,拥有 sudo 权限的用户越少越好。始终遵循最小权限原则,只给予用户日常操作所需的控制权限。将管理员凭据和权限授予多余的人会导致网络配置的安全性大大降低。
最后,你可以使用passwd命令重置给定用户的密码:
$ `sudo passwd` `username`
管理网络中的用户是保持网络安全的重要部分。拥有多余的用户账户,尤其是那些权限超出需求的账户,会为攻击者提供轻松的入侵方式,从而在你的网络内获得立足点。这是完全可以避免的,因此,始终要注意额外或不必要用户账户的风险。
除了管理你环境中的用户外,每个终端设备都有一个主机名,这是一个用于识别主机的友好名称或可读名称。通常,在操作系统安装时,系统会将其配置为某个默认值(例如,Ubuntu 系统的ubuntu)。为主机选择一个命名方案并确保每个主机具有不同的名称是有益的。例如,在 Windows 网络中,多个主机不能具有相同的主机名,因为这会导致冲突,从而在网络中造成管理问题。
你可以使用hostname命令检查你的 Linux 系统的主机名:
$ `hostname`
ubuntu
要更改主机名,再次使用hostname命令,但这次需要使用sudo并指定所需的主机名:
$ `sudo hostname` `your_hostname`
再次运行hostname命令确认更改已生效。重启服务器使更改永久生效。
6: 保护远程访问
现在你已经使得可以通过 SSH 远程访问系统,你需要锁定该功能,只允许授权用户登录到此主机。这个过程涉及几个设置。你将禁用密码登录,改为使用 SSH 密钥,并禁止 root 账户通过 SSH 直接登录。允许超级用户(如 root)使用像 SSH 这样的工具交互式登录是一个不好的做法,因为这会让攻击者进行暴力破解(不断猜测潜在密码直到找到正确的密码),然后可以完全访问你的系统。同样,对于其他用户账户,使用 SSH 密钥而不是密码登录,可以消除一类潜在攻击(用户名和密码猜测)对你的系统的威胁。
生成 SSH 密钥
SSH 密钥对 通常被认为比密码或密码短语更安全。SSH 密钥是加密安全的密钥,可以用来验证客户端计算机(你的本地主机)与 SSH 服务器(你的 Ubuntu 系统)之间的身份。密钥对的第一部分是你的私钥,它由你持有并识别你的客户端,必须绝对保密,就像密码一样。另一部分是公钥,可以自由分享。公钥提供给你的 SSH 服务器,并能解密你的私钥,从而允许两端之间的身份验证。每个你希望用来登录到 Ubuntu 系统的本地用户账户都需要一对公钥和私钥。
要创建一个 SSH 密钥对,在你计划作为 SSH 客户端使用的计算机上打开终端窗口(即将通过 SSH 连接到你的 Ubuntu 系统的计算机)。输入 ssh-keygen 并按回车键。再次按回车键以接受保存密钥的默认文件。该文件的默认位置是:
-
• Windows: C:\Users<user>.ssh\id_rsa
-
• macOS: /Users/
/.ssh/id_rsa -
• Linux: /home/
/.ssh/id_rsa
接下来,你将被要求输入私钥的密码短语,这是可选的,但推荐使用。通过在 SSH 密钥的基础上使用密码短语,你的私钥就不会暴露在网络上,这意味着要获取你的私钥,攻击者需要访问你的计算机(如果他们能做到这一点,游戏可能已经结束)。一旦输入密码短语(或者不输入),按 ENTER 键,你的密钥对将被创建。
要将公钥文件提供给你的 Ubuntu 系统(或任何其他你希望使用密钥对连接的服务器),请输入以下命令:
$ `ssh-copy-id` `user@your_ubuntu_ip`
The authenticity of host '192.168.1.10' can't be established.
ECDSA key fingerprint is aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa:aa.
Are you sure you want to continue connecting (yes/no)? `yes`
可能会显示有关 ECDSA 密钥指纹的提示,这意味着远程计算机无法识别你的本地计算机(因为它以前没有以这种方式连接过)。如果你收到这个提示,输入yes并按下 ENTER。你的 Ubuntu 系统将会要求你输入你试图使用的用户账户的密码(也就是远程用户账户的密码)。输入密码后,过程完成。此时,你可以使用ssh user@your_ubuntu_ip登录到你的 Ubuntu 系统,如果你设置了 SSH 密钥密码,还会提示你输入 SSH 密钥的密码短语(不是 Ubuntu 系统上用户的密码)。
禁用密码认证
接下来,更改你 Ubuntu 系统上的 SSH 配置,禁止使用密码认证,强制使用 SSH 密钥登录。以标准的非 root 用户身份登录你的 Ubuntu 系统,并使用以下命令在终端中打开 SSH 配置文件,Nano 是许多 Linux 发行版默认安装的文本编辑器:
$ `sudo nano /etc/ssh/sshd_config`
查找设置行:# PasswordAuthentication yes。在 Nano 中搜索文本时,按下 CTRL-W 然后输入你的搜索词并按 ENTER。该设置当前被注释掉(行首的 # 告诉 SSH 忽略该行),因为 yes 是默认配置,不需要显式设置。去掉行首的 #,并将 yes 改为 no。每当你创建一个新系统并启用 SSH 时,都必须更改此设置。
禁用 Root 登录
还应谨慎禁用 root 用户远程登录的功能。如前所述,在 Linux 系统中,root 用户拥有系统中最高级别的权限。通过禁用其登录能力,你可以防止任何潜在的攻击者获得系统的特权访问权限。从技术上讲,在最新版本的 Ubuntu 上,root 账户默认是被锁定的,无法登录,但确保它无法登录总是明智的。找到以下行:
PermitRootLogin prohibit-password
并将prohibit-password改为no。完成后,保存你对文件所做的更改。按下 ctrl-O 然后按 enter 键覆盖你正在编辑的文件。按下 ctrl-X 退出文件并返回终端。
使用以下命令重新启动 SSH 服务,使其重新加载新的配置:
$ `sudo systemctl restart ssh`
还有一件事需要测试。之前,你通过修改配置文件 /etc/ssh/sshd_config 禁用了通过 SSH 使用密码认证登录的功能。从你网络中的任何一台计算机,尝试使用该计算机上的账户和你配置的密码(不是你通过 SSH 密钥提供的用户账户)SSH 登录到你的 Ubuntu 系统:
$ `ssh` `user@your_ubuntu_ip`
user@your_ubuntu_ip: Permission denied (publickey).
这里,user 是你用来登录系统的用户名,your_ubuntu_ip 是你的 Linux 系统的 IP 地址。如果你能够成功登录,请返回 “禁止密码认证” 部分,确保你的配置正确,或重新启动 Ubuntu。保持开放的访问权限会在你的网络中创建一个漏洞,虽然这个问题很容易解决,但如果放任不管,可能会带来很大的安全风险。
使用 SSH 远程登录
macOS 和 Windows 都内置了 SSH。使用为你的 Ubuntu 系统生成并复制的 SSH 密钥的计算机,输入以下命令以连接到新的 Linux 系统:
$ `ssh` `user@your_ubuntu_ip`
Enter passphrase for key '/Users/user/.ssh/id_rsa':
❶ Welcome to Ubuntu (GNU/Linux 5.8.0-44-generic x86_6)
❷ * Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
❸ 6 updates can be installed immediately.
5 of these updates are security updates.
To see these additional updates run: apt list --upgradable
Your Hardware Enablement Stack (HWE) is supported until ❹ April 2025.
❺ Last login: Mon Mar 8 17:02:46 from 192.168.1.12
当你通过 SSH 登录到 Ubuntu 时,操作系统会输出大量有用的信息。第一行显示当前安装的操作系统版本❶。接下来是文档链接以及如何获得帮助❷,然后列出了系统或已安装软件包的可用更新❸。这个有用的列表显示了你何时需要运行前面在“安装系统软件包”中描述的更新命令。接下来,Ubuntu 显示操作系统支持的到期时间❹,届时你需要通过 sudo apt dist-upgrade 命令升级你的发行版,或者使用最新的操作系统重新构建一个新系统。最后,显示系统最后一次成功登录的信息❺,这对于识别可疑活动非常有用。如果上次登录是在凌晨 3 点或来自一个不熟悉的 IP 地址,你可能需要调查该活动(除非你习惯在凌晨管理网络和系统)。
7: 捕获虚拟机配置
此时,如果你使用的是虚拟机,那么你的虚拟机已经处于一个已知的良好状态;你已经完成了配置和加固工作,它已准备好在你的网络中使用。最好保存这个状态,以便如果发生问题时,你可以恢复到这个状态,而无需重新构建整个系统。使用虚拟机的一个好处是可以创建 快照。快照保存虚拟机的当前状态,包括其电源状态(开、关、暂停等),这样你就可以在必要时迅速恢复到保存的状态。传统的物理系统无法做到这一点,虽然我们都曾有过希望能这样做的时刻。例如,你可以选择在安装新程序之前,或在更改虚拟机的网络设置或添加/删除新用户之前创建一个快照。
在 VMware 中创建快照
无论您使用的 VMware 版本如何,只需右键点击要创建快照的虚拟机,点击快照▸快照,为快照命名,等待过程完成。就是这么简单。如果虚拟机出现问题,右键点击虚拟机,然后点击快照▸恢复快照,恢复到已知的良好状态。就这么简单。
在 VirtualBox 中创建快照
在 VirtualBox 中,点击虚拟机面板左侧虚拟机上的菜单按钮(三个点和三条线),然后点击快照。要创建快照,点击创建。为您的快照命名,点击确定,并等待过程完成。要恢复到某个快照,点击该快照,然后点击恢复。
注意 每次创建快照时,都会有效地创建虚拟机的副本。多个快照可能会占用大量主机计算机的空间。在创建快照时请记住这一点,且当不再需要旧快照时要删除它们。有些云服务商也会对快照存储收费,因此在云控制台中创建快照时请记住这一点。快照也不是一个好的长期备份方法。(我们将在第九章中详细讨论备份。)
网络拓扑
了解您的系统和设备如何连接并相互通信,在网络安全领域至关重要。考虑到这一点,我们来快速了解一下互联网协议(IP)及其 IP 地址分配。IP 是一种标准协议,定义了通过网络发送数据的格式,使计算机和其他网络连接的设备能够相互通信。
每台计算机和其他网络连接设备都需要一个IP 地址。IP 地址类似于街道地址或邮政信箱;计算机 A 通过将计算机 B 的 IP 地址嵌入发送的数据中,向计算机 B 发送网络流量。这就像在信封上写上地址一样。两台计算机之间的任何中介设备都可以从数据中解读出这个地址,并将其转发,直到数据到达目的地,就像邮政服务一样。
目前有两种常用的互联网协议版本,版本 4 和版本 6,这意味着我们有两种类型的 IP 地址,IPv4 和 IPv6。尽管 IPv6 自 1990 年代以来就存在,但它今天仍然不常使用。我们不会在后续章节中详细讨论它,因为它大多超出了本书的范围,但了解它是什么以及为什么它存在仍然很重要。IPv4 地址采用所谓的点分十进制表示法,这是一种复杂的说法,意思是它们由四个用句点分隔的数字组成,例如 192.168.1.1。每个数字的范围是 0 到 255,这意味着 IPv4 地址的范围是从 0.0.0.0 到 255.255.255.255,总共有 4,294,967,296 个可能的地址。
如今世界上存在着如此多的网络连接设备,以至于 IPv4 地址不够使用,这也是 IPv6 被创建的原因之一。IPv6 具有更大的地址空间,拥有超过 340 万亿万亿个地址。为了让你更好理解,这比地球表面上原子的数量多出 100 倍,这对于越来越多的互联网连接设备接入互联网来说是非常方便的。最终,IPv6 将会被广泛使用,每个设备都将拥有自己的公共 IPv6 地址,直到这些地址用完为止(可能在我这一生中不会发生)。
由于 IPv4 地址不足以满足所有人的需求,我们不得不想出巧妙的解决办法来连接所有设备到互联网。其中一个解决方案是网络地址转换(NAT)。通过 NAT,多个设备可以通过一个 IP 地址进行通信。
当你通过路由器将家庭或办公室连接到互联网时,互联网服务提供商会为你(以及你的网络)分配一个公共 IP 地址。你可以使用像www.whatismyip.com/这样的服务来查找你的 IP 地址。IP 地址通常是动态的,这意味着当你断开并重新连接互联网时,你通常会收到一个不同的 IP 地址。
你的互联网路由器负责将来自你私有内部网络的流量路由到公共互联网,再反向进行流量路由,这就是你能够访问服务和浏览互联网的方式。从高层次来看,NAT 会将分配给路由器的公共 IP 地址转换流量,使从互联网到达你内部计算机或设备的流量能够接收到针对该特定设备的流量。这类似于信件和包裹被送到街道地址上的办公楼,然后由职员或邮件部门确定包裹需要送到哪里,并将其转交给正确的收件人。它也能反向工作;从你的计算机到互联网的出站流量,必须从你计算机的内部 IP 地址转换为路由器的公共 IP 地址,然后转发到目标地址,以返回一个服务,比如网页。
不同的 IP 地址被保留并可用于公共互联网和你的私有网络。可以用于私有网络的私有地址范围包括:
-
10.0.0.0 到 10.255.255.255
-
172.16.0.0 到 172.31.255.255
-
192.168.0.0 到 192.168.255.255
所有其他 IP 地址属于公开可用的 IP 范围或尚未分配。
8: 检查你的 IP 地址
地址通常由路由器或服务器处理。如果你有一台无线路由器,你可以登录到该设备,查看客户端列表或 DHCP 设置,找到正在使用的地址范围。或者,你也可以直接检查你的计算机的地址。了解你网络中的地址分配,除了维护资产清单和网络图外,还意味着你可以跟踪分配给特定设备的地址、负责或分配给某个硬件的用户,以及特定设备的物理位置等元数据。(我们在第八章中进一步讨论资产管理。)
在 Windows 上
在 Windows 上,点击开始菜单,输入 cmd,按 ENTER 打开命令提示符。接着,输入 ipconfig 并按 ENTER:
C:\Users\user>`ipconfig`
Windows IP Configuration
Ethernet adapter Ethernet:
` IPv4 Address`. . . . . . . . . . . : 192.168.1.126
`Subnet Mask`. . . . . . . . . . . : 255.255.255.0
`Default Gateway`. . . . . . . . . : 192.168.1.1
C:\Users\user>
输出将显示你当前的 IP 地址、相关的 子网掩码 和你计算机正在使用的 默认网关。子网掩码表示你的计算机属于网络的哪个部分,而默认网关是你计算机用于访问其他网络(如互联网)设备的地址。网关很可能就是你的路由器。
在 Mac 上
查找 Mac 的 IP 地址类似。打开终端窗口,输入 ifconfig,然后按 ENTER:
$ `ifconfig`
`--snip--`
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400<CHANNEL_IO>
ether 78:8d:43:a4:ce:29
`inet` 192.168.1.120 `netmask` 0xffffff00 `broadcast` 192.168.1.255
media: autoselect
status: active
在 macOS 上,ifconfig 输出有些不同:inet 是互联网地址或 IP 地址,netmask 是子网掩码,broadcast 是网络的广播地址。这里的子网掩码以十六进制(hex)显示,而非十进制。十六进制是计算机使用的另一种表示法,与点分十进制表示法不同。广播地址是网络中的一个保留地址,用于将流量发送到该网络段中的所有设备(我们将在第十章中详细讨论,这一章讨论网络安全监控)。
在 Linux 上
在 Linux 系统中,打开终端窗口,输入以下内容:
$ ip addr
--snip--
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:db:ee:7c brd ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.1.30/24 brd 192.168.1.255 scope global dynamic noprefixroute ens32
valid_lft 4106sec preferred_lft 4106sec
inet6 fe80::66e:1ae7:861f:9224/64 scope link noprefixroute
valid_lft forever preferred_lft forever
IP 地址再次列在 inet 下;广播地址为 brd,子网掩码以 /24 形式显示,使用CIDR 表示法。CIDR 是另一种以更简短格式表示相同子网掩码信息的方法。
9: 创建网络地图
为了更好地了解你的网络并查看更详细的内容,如入口和出口点(即流量进出网络的地方),创建一个网络地图或网络图是非常有益的。网络图是你网络的图形化表示,它可以让你一眼看出整个架构,并且在保障网络安全时,帮助更容易地识别潜在问题。
draw.io (www.draw.io/) 是一款免费的、易于使用的云编辑器,允许用户创建各种类型的图表,其中之一是网络图。另一种选择是微软的 Visio,它是一个商业解决方案,能够实现相同的目标。如果你选择使用 draw.io,首先打开该网站,并从左侧菜单中打开 Citrix 下拉菜单。然后,你可以像 图 1-2 中所示的那样,将相关的表示形式从左侧菜单拖放到右侧画布上。

图 1-2: draw.io 绘图工具
从最基本的层面来说,一个小型网络通常包括一个调制解调器/路由器,通常由你的互联网服务提供商提供,它将你的网络和所有设备连接到互联网,还有一些设备:计算机、笔记本电脑、移动设备、外设如打印机等。追踪你网络中的所有设备有助于更好地保护网络,因为你知道哪些设备应该连接,并允许它们在网络内以及网络与互联网之间进行通信。
始终保持你的网络图是最新的。每当你添加新的计算机、笔记本电脑、移动设备、交换机、虚拟机或其他系统或设备到你的网络中(并且也要移除它们),你都应该更新网络图。如果是一个临时设备,其 IP 地址不是静态的,可能值得在你的路由器中为该设备分配一个静态 IP 地址(见第四章)。否则,你可以追踪可能分配给这些设备的 IP 范围。即使设备并非始终连接到你的网络,也要维护一个记录,列出那些预计将持续连接的设备(第四章会详细讨论这个问题),并在你的网络图中标注这些 IP 地址。
网络图还可以帮助你查看在哪里可以实施额外的安全控制来提升你的安全防护。例如,图 1-3 显示了一个小型的基本网络。

图 1-3:一个小型网络
这种网络布局是大多数家庭网络的典型示例,其中调制解调器/路由器将网络连接到互联网,所有终端设备都使用该设备作为通向公共网络的网关。这种网络架构的问题在于,它也允许对手利用相同的网络基础设施访问私有网络,而不会遇到太多障碍。在本书后面的章节,你将学习如何通过在无线路由器和互联网之间添加防火墙来改善这个网络的安全性,从而更好地管理进出流量,并阻止可疑流量进入或离开网络(有关防火墙的更多详细信息,请参见第三章)。
在绘制网络图时,收集尽可能多的信息关于网络中的所有设备,如它们的 IP 地址、MAC 地址、主机名、用途、主要用户或所有者、位置、序列号等。首先从计算机开始,然后是移动设备,如手机和平板电脑,接着是你可能拥有的任何物联网设备——如果你的电视或冰箱连接到互联网,确保也记录下这些设备。
10: 文件传输
你可能想从另一个系统将文件传输到你的 Linux 机器,或者从你的 Linux 机器传输文件到本地计算机。直观的 rsync 工具可以同步文件和文件夹,无论是在一个系统的两个位置之间,还是通过网络在两个系统之间。要将特定文件从一台计算机传输到另一台,可以使用以下命令:
$ `rsync -ruhP --remove-source-files --protect-args "``/path/to/source/``" \`
`"``user@computer_ip:/path/to/destination/``"`
紧接着rsync命令的是四个标志。r标志代表递归,意味着源文件夹中的所有内容都将被复制到目标位置。u标志代表更新,它告诉 rsync,如果它在目标位置发现的文件比源目录中的文件更新,则跳过该文件。接下来,h是典型的人类可读输出标志:任何数字(日期、文件大小等)将以更易于阅读的格式显示。P标志用于进度,它告诉 rsync 将复制进度输出到屏幕上,这样你就可以看到已经传输了多少数据,还剩多少,以及预计何时完成该过程。
在这一组标志之后,--remove-source-files参数告诉 rsync 在文件成功复制后删除源文件,而--protect-args告诉 rsync 将以下参数(源目录和目标目录)作为一个连续的字符串来解释,即使它们之间有空格字符,空格通常会告诉终端目录是分开的。如果没有这个参数,如果源路径中有空格,命令会将空格两侧的路径部分解释为单独的路径。目标路径也一样。如果你不想在复制文件后删除源文件,或者你的源目录和/或目标目录中没有空格字符,可以不使用这些参数。
实际操作中,以下是命令在两个 Linux 服务器之间的样子(我们将在第五章中详细讨论):
$ `rsync -ruhP --remove-source-files --protect-args test.txt \ user@192.168.1.30:/tmp`
Enter passphrase for key '/Users/user/.ssh/id_rsa':
sending incremental file list
test.txt
0 100% 0.00kB/s 0:00:00 (xfr#1, to-chk=0/1)
如我们在“确保远程访问安全”一节中提到的,请记得输入你之前创建的 SSH 密钥对的密码,而不是你用于文件传输的用户账户密码。此列表的底部包含进度百分比、当前传输速度、预计剩余时间以及剩余文件数。
注意:rsync 的最佳特性是它能够在传输中断时恢复传输。安全文件传输协议(SFTP)和安全拷贝协议(SCP)是你可以用来在系统之间传输文件的替代方法,但它们都无法在传输过程中停止并从相同位置继续,以避免在传输大文件或目录时丢失传输进度。基于这些原因,rsync 优于 SFTP 和 SCP,因此我们将在本书的剩余部分主要使用 rsync。
总结
在本章中,你建立并保护了你的第一个 Linux 机器,这对你后续在本书多个章节中的示例操作至关重要。你还学习了如何强化 Linux 系统的安全性,并提高整体的安全防护水平,包括通过使用 SSH 密钥对来创建安全的 SSH 配置,以及如何管理网络中的用户的基础知识。你学习了如何绘制网络拓扑图,了解计算机和其他设备之间的相互关系,以及它们如何相互通信。在第二章,你将学习如何布置网络以被动地增强整体安全性。
第二章:# 架构和分段你的网络

架构和分段网络的方式可以在最短的时间、最少的努力和资金投入下提供最大的安全提升。一个好的网络分段计划可以让你将高风险和低风险的设备及用户类型分开,从而帮助你决定在环境中实施其他安全控制措施的位置。
例如,你的物联网(IoT)设备,很可能比你的 Windows 操作系统更少经过测试、更新和维护,仅仅因为这些技术较新,且应用较少。这使得它们天生比其他广泛使用的技术更容易受到攻击,也更不安全。通过将这些易受攻击的终端设备放置在逻辑上或物理上隔离的网络中,可以降低攻击者利用它们并横向移动到你的计算机的风险。一旦你将设备隔离开,你可以考虑额外的控制措施——例如入侵检测或防御系统——或者其他网络安全监控和告警解决方案,这些内容我们将在第十章中讨论。
本章将讨论用于分段网络的网络硬件类型、它们的优缺点,以及一些推荐的解决方案和配置,用于物理或逻辑地分段你的网络,分离使用以太网和无线网络设备及设置的设备。
网络设备
集线器、交换机和路由器都可以用来分段网络。其中一些提供更多的功能,或者在设计上天生更具能力和安全性。根据你的需求,你可以选择使用这些设备中的一个、一些,或全部。
集线器
一个网络集线器是最基本的设备类型,能够使多个计算机相互通信。集线器可以在小型网络中相对安全地使用,而在大型网络中,集线器可能会引发重大问题。当主机 A 连接到集线器时,与主机 B 通过同一集线器通信,数据(以以太网帧表示的包)会从主机 A 传输到集线器的一个端口,然后集线器通过所有其他端口广播该数据。这意味着网络上的每个其他终端都会接收到目标是主机 B 的数据,这样就不太安全。此外,由于集线器没有智能,所有端口都属于同一个碰撞域。这意味着,如果两个或多个设备尝试同时通信,流量就会发生碰撞,导致网络性能问题。当发生碰撞时,发送设备必须停止通信并等待随机时间后再尝试重新通信,理想情况下避免发生第二次碰撞,这样就会导致进一步的延迟。
由于功能有限,集线器通常便宜且易于部署,但它们不具备扩展性。如果你有超过少数几个需要通信的设备,最好还是选择交换机。
交换机
与集线器不同,交换机通过网络使用连接到它们的终端的物理硬件(MAC)地址转发流量。当连接到交换机的主机与网络中的另一主机通信时,数据会从发送方传输到交换机的端口,然后交换机会使用目标数据的 MAC 地址来确定该数据应转发到哪个端口。交换机会在内存中保持一个 MAC 地址表,因此它知道每个终端在网络上的位置。交换机的每个端口都有自己的独立碰撞域,这意味着如果两个主机同时通信,就不会发生碰撞——数据包在传输过程中不会相遇。这也意味着数据不会广播到网络上的每个设备,因此交换机本质上比集线器更安全。
交换机可以用于任何规模的网络。小型网络通常只需要一个交换机,具体取决于终端数量。
路由器
路由器主要用于在网络或网络段之间传输数据。例如,你的本地内联网,所有终端都连接到该网络,是一个私有网络。互联网是一个非常大且公开访问的计算机网络,它与您的私有网络是分开的。路由器就是这两个网络之间的桥梁,使你能够访问其中一个并浏览互联网。交换机使用 MAC 地址,而路由器主要关注 IP 地址。所有连接到互联网的网络都使用某种类型的路由器。在一个小型网络中,连接你网络和互联网服务提供商的边界路由器可能是你唯一需要的路由器。
创建信任区
网络分段是将网络划分为更小的部分,称为子网,以提高网络的整体性能和安全性。你可以通过物理或逻辑方式分隔设备来对网络进行分段。
物理分段
可以说,最简单的网络分段方式是使用物理上独立的硬件 (物理分段) 来分隔设备。例如,你可以为你的计算机使用一个无线路由器,为你的移动设备使用另一个。或者你可能为所有个人设备使用第一个路由器,为所有物联网设备使用第二个路由器。
将设备和用户分成不同的类别或类,使它们处于信任区域,从而将最关键的数据和资产与更易受攻击的设备分开。将需要更高安全性和监控的设备与那些要求较低安全性、因此维护成本较低的设备分开,可以让你将更多的时间集中在重要资产上,减少管理不重要资产的时间。
通过将不同类型的设备分开,你的网络安全性会增加,因为集中在某一类型设备漏洞上的攻击不会使攻击者进入你网络的其他部分。随着家用电器逐渐转变为智能设备,这一点变得越来越重要。
物理网络分段比逻辑分段更难被攻击者突破。物理分段的缺点是增加了管理开销、硬件成本和其他基础设施成本,因为你可能需要为每个物理网络配置单独的互联网连接。
逻辑分段
逻辑分段比物理分段更常见,且通常实施成本较低,因为它不需要为每个网络段单独配置物理硬件。逻辑分段通常通过使用虚拟局域网(VLAN)来实现:系统群体看似处于同一局域网,但在逻辑上与其他 VLAN 上的系统分开。能够创建和管理 VLAN 的交换机被称为管理型交换机。每个 VLAN 像一个虚拟交换机一样存在于你的物理交换机内。将交换机上的物理端口分配给特定 VLAN,相当于将一根电缆插入特定的交换机。
例如,你可以将一台交换机(如八端口的 Netgear GS308E 或类似设备)放在宽带路由器后面,让连接到交换机的终端能够访问互联网。然后,在交换机上,你可以创建具有不同目的的 VLAN,比如用于管理或行政的 VLAN、用于主要终端的业务或个人 VLAN,以及用于更不安全设备类型(如移动设备和物联网设备)的来宾 VLAN。
创建 VLAN 后,你可以指定交换机上的八个端口中哪些能够在这些 VLAN 上进行通信,通过一个物理设备将每个 VLAN 及其相应的设备在逻辑上分隔开。当然,这种方法最适合以以太网或有线设备多于无线设备的网络,除非你打算使用多个无线接入点。
11: 网络分段
在小型网络中,推荐的网络分段方法是根据所需的访问类型和安全与监控等级,将终端设备分类为信任区域。
例如,你的主网络段应该包括包含或可以访问你私人数据的主设备,如电子邮件、联系人、消息以及存储在 Google Drive 或 Dropbox 等云服务中的数据。这个网络段设计为最安全,具备最严格的安全要求,并且拥有最全面的监控与检测。
你的次级网络段是用于那些不需要与主设备通信或访问相同数据的终端设备,如物联网设备和其他连接设备——智能灯、打印机、如 Google Chromecast 这样的投射设备等等。所有这些设备应当被分隔在它们自己的网络段中,因为它们本质上比你的主设备更不安全;这样可以降低对手利用这些设备作为跳板进入你网络的风险。这个网络段可以有较低的安全控制,因为它不包含任何关键数据或信息。
接下来,你可能有一个或多个三级网络段,所有其他终端设备都位于其中,比如你的访客网络。再次强调,这个网络段可以有较低的安全控制和监控要求,相较于你的主网络段。
最后,根据你网络中拥有的(或计划拥有的)设备类型,你可能需要一个具有非常严格访问规则的网络段。这个网络段可以是用于那些你不希望在任何情况下连接到互联网的设备,包括闭路电视或监控摄像头。对于这样的严格网络分段,还需要考虑其他因素,例如如何让这个网络段内的设备进行更新。
有多种方式可以对你的网络进行分段。让我们详细了解如何实现有效的网络分段,首先通过使用独立的无线网络,然后通过使用 VLAN 实现以太网分段。如果你的网络需求需要,可以将这些方法结合使用。
以太网分段
你可以使用能够将特定以太网端口分配到 VLAN 的以太网交换机来逻辑上分割你的网络及其设备。像 Netgear GS308E 这样的便宜的管理型交换机提供了此功能,安装它在你的小型网络中既快捷又简单。这个设备将用于接下来的示例网络配置。你可以直接从 Netgear 或其他在线零售商购买 GS308E,或者通过像 eBay 这样的市场购买二手设备。或者,我建议研究 Ubiquiti 的网络设备系列,虽然价格较贵,但其用户友好且功能强大。
VLAN(虚拟局域网)用于分隔信任区。理想情况下,在较大的网络中,这通常是通过使用两台不同的物理交换机来实现的。如果交换机配置错误,较高和较低安全性的网络及设备可能会相互通信,但如果两台交换机物理分开,这种情况不太可能发生。然而,在小型网络中,我们通常没有购买多台设备的奢侈,成本过高。因此,我们采取下一个最佳方案,使用 VLAN 将网络虚拟隔离。
注意:购买两台没有 VLAN 等高级功能的非托管交换机可能比购买一台带 VLAN 功能的托管交换机便宜。选择这种方式将导致两个或更多物理分离的网络,每个网络配有一台交换机。如果这两个网络都需要互联网连接,您将需要为每个网络提供单独的互联网连接,或者需要一台能够保持交换网络逻辑隔离的网关设备。在这种情况下,您最好一开始就投资稍微贵一些的托管交换机。本书中没有涉及非托管交换机的使用,因为它们是即插即用的,几乎不需要额外设置,而且会导致比托管交换机更不安全的架构。
一旦您拥有交换机,初始配置通常是直接的:
-
1. 打开包装并将交换机连接至电源。
-
2. 使用以太网电缆将您的调制解调器/路由器(或任何提供互联网连接的设备,如我们将在第三章中介绍的 pfSense 设备)连接到交换机。
-
3. 您可以通过三种方式找到交换机的 IP 地址:
-
a. 交换机会接受来自您网络中提供 DHCP 的设备的 IP 地址。您可以通过第一章中的步骤在路由器或其他 DHCP 提供者中找到其 IP 地址。
-
b. Netgear(以及大多数网络设备制造商)提供一个应用程序,用于在您的网络上发现其交换机。您可以从
www.netgear.com/support/product/netgear-switch-discovery-tool.aspx下载 Netgear 交换机发现工具(NSDT)。下载、安装并运行该工具,以识别网络中的交换机。 -
c. 默认情况下,交换机的 IP 地址为 192.168.0.239。如果前两种方法不起作用,您可以使用此默认 IP 地址连接到交换机的 Web 界面进行配置。
-
-
4. 一旦您发现或配置了交换机的 IP 地址,请在 Web 浏览器中浏览该 IP 地址并使用默认密码(在交换机手册中提供)登录。
-
5. 系统会提示您更改管理员密码。我建议您更改,因为默认密码不安全。
此时,您将看到一个概述页面,提供交换机信息,如名称、序列号、MAC 地址等。将这些信息添加到您的资产清单和网络图中。
完成这些步骤后,你就可以开始配置 VLAN 了。交换机会接受并将互联网连接传递到你连接到交换机的设备。配置和使用 Netgear 交换机上的 VLAN 是一个简单的操作,其他受管理交换机的操作方法应该类似:
-
6. 以管理员身份登录交换机。
-
7. 在网页界面的顶部,找到 VLAN 标签,如图 2-1 所示。
-
8. 在左侧菜单中,点击高级以查看高级 VLAN 选项。
-
9. 如图 2-1 所示,将高级基于端口的 VLAN 状态从“禁用”切换为“启用”。

图 2-1:VLAN 配置
接下来,你需要将交换机上的物理以太网端口分配给特定的 VLAN。为你网络中的每个信任区配置一个 VLAN。如果你想为最安全的设备配置一个主网络,为访客设备配置一个次要网络,为物联网设备配置一个三级网络,那么你应该配置三个独立的 VLAN。如果配置一个新的 VLAN 等同于创建一个新的物理局域网,那么使用新的交换机或路由器时,给端口分配 VLAN 就相当于将设备插入到该物理交换机中。如果你将 VLAN 视为独立的网络,那么将每个端口分配给一个 VLAN 就相当于告诉交换机该端口属于哪个逻辑网络,并且只有属于同一 VLAN 的端口和终端才能进行通信。
-
10. 在 VLAN 标识符下拉菜单中,选择你要配置的 VLAN 的 ID。
-
11. 对于你想要添加到此 VLAN 的每个物理端口,确保该端口已被选中。取消勾选不允许在此 VLAN 上通信的端口。点击“应用”。
当你将设备插入这些端口(这些端口已经分配了 VLAN)时,这些设备将仅在该 VLAN 内进行通信。
-
12. 若要将这些端口从 VLAN 1(默认 VLAN)中移除,请从下拉菜单中选择VLAN 1。点击相关端口,直到其显示为空白。点击应用。
要测试你的 VLAN 配置,将一个终端连接到交换机上一个已分配的端口,再将另一个终端连接到任何仍然使用默认配置或配置了其他 VLAN 的端口。如果这两个设备无法相互 ping 通,那么说明你的 VLAN 配置正确。
总结
在本章中,你已经为设备识别并创建了信任区。通过这样做,你能够将你的网络进行分段,保持高信任和高安全性的设备与低信任的设备分开。你可以通过这种方式使用交换机创建任意多或任意少的网络段,帮助你提高网络和用户的安全性。
第三章:# 使用防火墙过滤网络流量

防火墙监控并过滤进出网络的流量。人们常常误以为防火墙总是最后一道防线;实际上,边界防火墙应当是攻击者试图突破任何网络时首先遇到的障碍,不论该网络大小。每当网页浏览器访问网站、消息程序发送信息或你的电子邮件客户端发送和接收邮件时,生成的流量应至少通过一个防火墙。
本章将介绍两种防火墙解决方案:iptables 和 pfSense。在 Linux 中,iptables 是一种常见的防火墙,通常用作主机防火墙(即,允许或拒绝特定端点上的流量的防火墙)。pfSense 可以作为开源软件防火墙或通过 Netgate 销售的设备作为硬件防火墙来实施,用作边界防火墙,负责过滤整个网络或网络段的流量。
防火墙类型
硬件防火墙可以在网络中物理和逻辑地放置。软件防火墙作为应用程序安装在终端上,需要对防火墙及其连接的设备进行更多配置,以有效地过滤流量。通过使用这两者中的一个或两个,你可以有效地减少你的攻击面,即攻击者可以尝试渗透、危害或利用你的网络的点。理想情况下,攻击面应该尽可能小。
边界防火墙安装在你的私人网络与其他网络(如互联网)之间,可以是软件或硬件基础的。边界防火墙被放置在网络的物理和逻辑边界上,使其成为面向公众互联网时,进出你内部网络的流量的第一个接触点,也是出发到互联网的流量在网络中最后通过的设备,如图 3-1 所示。

图 3-1:边界防火墙
防火墙根据包含已配置规则列表的规则集允许或拒绝(阻止)流量。规则应用于流量的方式取决于你使用的防火墙类型。最常见的类型是包过滤防火墙,它会检查每个尝试进入(或离开)内部网络的数据包,然后将该数据包与规则集进行匹配。如果数据包的内容与防火墙规则集中某个规则相符,防火墙将根据该规则的指示,决定是否允许或拒绝该流量。
还有有状态和无状态防火墙。有状态防火墙跟踪所有进出连接,并将每个连接视为两个端点之间的独特会话。这种方法为防火墙提供了有关特定连接的上下文,并允许对流量进行更精细的控制。相反,无状态防火墙不会记录关于每个连接的信息。iptables 和 pfSense 都是有状态防火墙。
几乎所有操作系统都附带内置的软件防火墙,称为基于主机的防火墙,用于过滤特定于该主机的流量。大多数 Windows 和 Mac 设备出厂时都配备了开箱即用的基于主机的防火墙,其基本规则集是可用的,尽管可能不全面。该防火墙按设计在普通情况下就能正常工作;用户无需自行配置防火墙,从而减少了混淆和对计算机制造商技术支持的需求。在 Linux 设备上,您需要配置防火墙——您将在下一节中了解如何做到这一点。
最好同时使用主机防火墙和边界防火墙,并正确配置它们,以便为您的网络添加多层防护。
iptables
Linux 的 iptables 工具在过滤进入、穿越或离开网络的流量方面提供了极大的灵活性。防火墙通过策略链组织其规则,这些规则列表根据数据包的内容进行分析和匹配。每个规则决定了防火墙如何处理匹配其定义的数据包——它可能允许、拒绝或丢弃数据包。当数据包被允许时,它会顺利通过防火墙。当数据包被丢弃时,防火墙会丢弃该数据包,并且不会向发送者返回任何响应。如果数据包被拒绝,防火墙会丢弃数据包,并向发送者返回拒绝消息,提供有关您的网络和所使用的防火墙的上下文信息。
策略链有三种主要类型:输入链、输出链和转发链。输入链决定是否允许来自外部源的某些流量进入网络,例如来自远程位置的虚拟私人网络(VPN)连接。VPN 是一种逻辑上——而非物理上——连接不同网络的方法,通常用于从一个网络远程访问另一个网络。VPN 将在第五章中详细介绍。
输出链指示防火墙是否应允许某些外向流量进入外部网络。例如,互联网控制消息协议(ICMP)主要用于诊断网络通信问题。ICMP ping 数据包是通过输出链传输的外向流量。ping 是一种设备间的查询,通常用于判断两者之间是否能建立连接。你需要允许 ping 数据包从设备出发,穿越防火墙,并通过其他若干设备,最终到达目标。如果你的输出链阻止了 ICMP 流量,那么你的设备将无法 ping 任何设备,因为防火墙会阻止或丢弃这些数据包。
在大多数情况下,你的状态防火墙规则应当允许新连接和已建立连接。例如,如果你创建一个输出链来允许你的设备 ping 谷歌,你需要告诉防火墙允许与已建立连接相关的入站流量。否则,你的设备会向谷歌发送 ping 请求,这个请求会通过防火墙,但谷歌的响应会被防火墙阻止。
转发链将防火墙接收到的流量转发到另一个网络。在小型办公室或家庭网络中,基于主机的防火墙很少使用转发链,除非防火墙被配置为充当路由器。边界防火墙会使用转发链将流量从内部网络路由到外部网络,或者从一个网络段路由到另一个网络段,通常使用网络地址转换(NAT),如第一章所讨论。然而,这种配置对于小型网络来说比必要的要复杂,更适合企业网络。
通过使用这些策略链,你将能够在非常细粒度的层面控制穿越你网络的流量。在接下来的章节中,你将创建几个 Linux 服务器,每个服务器都将受益于其独立的基于主机的防火墙。我建议按照以下说明在这些服务器上配置 iptables。
请注意,iptables 无法保护 IPv6 网络和流量。如果你打算在你的网络中使用 IPv6,你需要额外使用 ip6tables 来配合 iptables。除非你的网络中有强烈的 IPv6 使用需求,否则我建议你完全禁用 IPv6。禁用 IPv6 的步骤在第四章中有介绍。
12: 安装 iptables
如果你已经按照第一章的步骤构建了一个标准的 Ubuntu 服务器,你可以开始配置它的 iptables 防火墙。一旦掌握了基础,你可以将这些知识用来在所有 Linux 终端上配置 iptables。否则,现在就回去创建你的 Ubuntu 系统吧。
最新版本的 Ubuntu 默认安装了 iptables,因此请以标准非 root 用户身份通过 SSH 登录,并通过运行版本检查来查看是否已安装 iptables:
$ `sudo iptables -V`
[sudo] password for `user`:
iptables v1.8.7 (nf_tables)
如果已安装 iptables,服务器应该会返回版本信息,如下所示。你的版本可能会有所不同。
如果没有安装 iptables,你将会收到一个错误提示,此时需要安装 iptables:
$ `sudo apt install iptables`
安装完成后,运行相同的版本检查以确认安装成功。
接下来,安装iptables-persistent,这是一个可以保存防火墙配置并在服务器重启后自动加载配置的工具:
$ `sudo apt install iptables-persistent`
一个安装向导应该会接管你的终端窗口。你将看到一个文件,显示服务器将保存防火墙规则的地方(默认文件是/etc/iptables/rules.v4),并且会告知该文件中的规则将在系统启动时加载。同时,你需要在此安装过程之外手动保存任何防火墙规则的更改。选择Yes以保存当前的防火墙规则。如果你不安装此组件,每次重启服务器时都需要重新配置防火墙。
现在你可以像这样检查当前的策略链:
$ `sudo iptables -L`
[sudo] password for `user`:
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
在输出中,policy ACCEPT表示默认情况下,iptables 接受所有输入、输出和转发流量。这个默认行为是可取的,因为它在没有用户配置的情况下就能工作。然而,它是一个不安全的解决方案,因此我们需要对其进行修改。
iptables 防火墙规则
在创建 iptables 规则时,请记住顺序非常重要。当流量到达防火墙时,iptables 会按顺序检查规则,按照它们出现的顺序。如果流量与某个规则匹配,iptables 就不会再检查其他规则——如果你的 50 条规则中的第一条规则拒绝所有流量,那么防火墙会解释这条规则,拒绝流量并停止处理,从而有效地将你的设备完全隔离。相反,如果你有相同的 50 条规则,但第一条规则允许所有流量,那么所有流量都会通过防火墙。你应该避免这两种情况。
要理解如何构建 iptables 防火墙规则,看看这个示例:
$ `sudo iptables -A INPUT -p tcp --dport 22 -m conntrack \`
` --ctstate NEW,ESTABLISHED -j ACCEPT`
在sudo命令之后,调用 iptables 开始定义规则。下一个参数决定了规则是附加到(-A)、删除(-D)还是插入(-I)指定的策略链。你还可以在这个位置指定-R来替换或更新现有规则。INPUT表示正在修改输入链中的规则。你还可以指定OUTPUT、FORWARD或其他策略链。
在大多数情况下,iptables 需要知道规则所涉及的协议和端口。在此示例中,-p tcp表示规则仅适用于 TCP 流量,--dport 22告诉 iptables 该规则适用于目标端口为 22 的数据包。两者都是可选的。你可以使用以下语法指定多个端口:--match multiport --dports port1,port2,port3。
注意,传输控制协议(TCP)是一个可靠的传输协议,旨在确保数据包在网络上的成功传输。如果计算机在使用 TCP 进行通信时发生数据包丢失,丢失的数据包将被重新传输,确保所有发送的数据最终都能被目标主机接收。用户数据报协议(UDP)是一个不可靠的协议,不保证数据的成功传输,也不会重新传输丢失的数据包。UDP 用于一些可以接受丢包的场景,通常会导致更快的连接速度。而 TCP 则在可靠性至关重要时使用,每个数据包都必须成功传输。
iptables 防火墙提供了多个匹配模块,你可以使用-m参数来指定要使用的模块。在这个例子中,使用了conntrack,一个允许有状态数据包检查的工具(也是可选的)。其他一些工具包括connbytes,它根据传输的流量大小来创建规则,以及connrate,它根据流量的传输速率进行匹配。有关更多详细信息,请参阅 iptables 手册:linux.die.net/man/8/iptables/。
接下来,--ctstate告诉 iptables 允许并跟踪以下连接类型的流量——在这种情况下是NEW和ESTABLISHED。连接状态有许多可用值,但最常用的是NEW、ESTABLISHED、RELATED和INVALID。新建和已建立的状态是不言自明的;数据包属于新的或已建立的流量流。相关数据包不一定匹配已建立的连接,但它们是防火墙所期望的,因为现有连接需要它(即根据防火墙现有的上下文进行预期)。无效的数据包是任何不符合其他状态标准的数据包。
最后,iptables 将把-j及其后面的内容视为匹配此规则时要执行的动作。最常见的动作是ACCEPT,允许匹配此规则的流量;DROP或REJECT,拒绝或阻止流量;或LOG,将流量记录到日志文件中(稍后会详细介绍)。
现在你已经理解了 iptables 规则的基础知识,接下来你将配置防火墙以允许和拒绝流量。
配置 iptables
配置 iptables 时,首先添加规则以丢弃无效流量:
$ `sudo iptables -A OUTPUT -m state --state INVALID -j DROP`
$ `sudo iptables -A INPUT -m state --state INVALID -j DROP`
然后,添加规则以接受与现有连接相关的流量,以及已建立连接和回环地址,以避免之后出现问题(回环地址是计算机用来测试和诊断网络问题的内部地址):
$ `sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT`
$ `sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT`
$ `sudo iptables -A INPUT -i lo -j ACCEPT`
这允许防火墙接受与已知连接匹配或与正在进行的连接相关的流量,并丢弃任何意外的数据包(这可以保护你的网络免受未经请求或恶意的网络扫描活动)。
一旦运行这些命令将规则输入到策略链中,请重新运行列出命令以确保它们已被接受:
$ `sudo iptables -L`
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere state INVALID
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DROP all -- anywhere anywhere state INVALID
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
请注意,规则已经被添加到INPUT和OUTPUT链下。FORWARD链保持为空。
接下来,确保您的防火墙允许 SSH 流量。您可以通过两种方式实现:广泛地允许 SSH,或者仅允许来自您网络中部分设备的 SSH 流量。要允许来自您网络中所有设备的 SSH 流量,可以使用以下命令:
$ `sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j \ ACCEPT`
创建广泛的规则在通过 SSH 连接到或从多个设备连接时很有帮助。然而,允许程序的无限制使用并完全开放协议并不是最安全的解决方案。您应该仅允许来自特定 IP 地址或范围的 SSH 等服务,因为允许远程访问或文件传输在您的端点与任何其他设备之间是有风险的。
您可以通过在输入链中使用-s source选项指定源 IP 地址或范围(例如,192.168.1.25)来减少攻击面,因此,如果您在虚拟机上配置 iptables,您可能会选择仅允许来自单个主机的管理连接,并拒绝网络中所有其他端点的访问:
$ `sudo iptables -A INPUT -p tcp -s 192.168.1.25 --dport 22 -m \`
` conntrack --ctstate NEW -j ACCEPT`
我们使用-A将此规则追加到INPUT策略链中,目标端口22,协议TCP。对于NEW连接,iptables 将ACCEPT符合此规则的流量。端口可以是您选择的任何端口;只需确保您的 SSH 配置与防火墙规则匹配。如果规则允许在端口 22 上使用 SSH,但您的 SSH 配置允许在端口 2222 上进行连接,防火墙将阻止您的 SSH 连接。
如果您犯了错误,通过运行相同的命令并将-D选项替换为-A来删除规则:
$ `sudo iptables -D INPUT -p tcp -s` `192.168.1.25` `--dport 22 -m conntrack \ --ctstate NEW,ESTABLISHED -j ACCEPT`
另外,您可以使用-F chain或--flush chain参数删除您为任何策略链指定的所有规则:
$ `sudo iptables -F INPUT`
使用这组基本规则,您现在可以告诉 iptables 如何处理所有其他流量(您不希望进入或离开您的服务器或网络)。一旦创建了允许特定流量的规则,您可以很可能阻止、拒绝或丢弃其他所有流量。您应该在配置防火墙规则后执行此操作;否则,您可能会中断连接并无法通过 SSH 重新连接。使用-P参数设置策略链的默认行为,并让 iptables 知道如何处理与规则不匹配的流量。为此,设置策略链的默认行为为DROP这些流量:
$ `sudo iptables -P INPUT DROP`
$ `sudo iptables -P FORWARD DROP`
$ `sudo iptables -P OUTPUT DROP`
以这种方式使用-P不同于之前使用的-A和-I,因为它不会影响防火墙规则本身;相反,它处理管理网络流量的整体策略。-A和-I分别用于追加或插入防火墙规则,而-P则在更高一级配置防火墙行为。
此时,检查你的 iptables 链应该返回:
链 INPUT(策略 DROP)
target prot opt source destination
DROP all -- anywhere anywhere state INVALID
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- 192.168.1.25 anywhere tcp dpt:22 ctstate NEW
链 FORWARD(策略 DROP)
target prot opt source destination
链 OUTPUT(策略 DROP)
target prot opt source destination
DROP all -- anywhere anywhere state INVALID
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
请注意,所有三个链的策略已经从 ACCEPT 更改为 DROP,这表明每个链的默认行为是丢弃不匹配任何规则的流量。你还应该能够通过将这个输出与之前列出 iptables 规则的输出进行比较,来识别你添加到链中的规则。你可能会收到 DNS 失败的错误,因为防火墙现在阻止了所有未明确允许的内容,包括 DNS(它运行在端口 53)。通过添加以下新规则来解决这个问题:
$ sudo iptables -A OUTPUT -p udp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 53 -m conntrack --ctstate NEW -j ACCEPT
这些命令将规则附加到输出链,允许此服务器在 UDP 和 TCP 端口 53 上进行域名解析的出站请求。通过添加这些规则,服务器可以解析域名。
通过尝试从网络中的另一台设备 ping 服务器来测试你的防火墙;你应该会收到一个错误,因为 ICMP 被防火墙禁止。类似地,如果你尝试从服务器本身 ping 任何内容,你也应该收到类似的错误:
$ `ping google.com -c 5`
PING google.com (<`ip_address`>): 56(84) bytes of data.
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
ping: sendmsg: Operation not permitted
--- google.com ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4000ms
ICMP 可以是一个非常有用的故障排除工具,你可能会决定允许通过 iptables 防火墙进行 ping 操作。要做到这一点,请添加以下规则:
$ `sudo iptables -A INPUT -p icmp -j ACCEPT`
$ `sudo iptables -A OUTPUT -p icmp -j ACCEPT`
你可能会发现需要在防火墙中打开额外的端口。例如,如果你安装了代理,或者在阅读完第六章后构建了一个,你需要在防火墙中打开代理端口(3128):
$ sudo iptables -A OUTPUT -p tcp --dport 3128 -m conntrack --ctstate NEW -j ACCEPT
在大多数情况下,你应该从服务器中禁止网页浏览——几乎没有正当理由使用服务器进行此类活动。理想情况下,从管理和安全角度来看,服务器应为单一用途。允许任何额外的服务——特别是浏览互联网——会导致更大的攻击面,并在你的网络中创建潜在的漏洞。
如果你决定允许来自服务器的此类流量,以便服务器可以获取软件更新,创建针对端口 80 和 443 的输出规则,这两个端口分别是 HTTP 和 HTTPS 流量的默认端口:
$ sudo iptables -A OUTPUT -p tcp --dport 80 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
$ sudo iptables -A OUTPUT -p tcp --dport 443 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
HTTP 和 HTTPS 规则之间唯一的区别是端口号。
每次添加规则后,你都应该进行测试。此时,最简单的测试方法是先使用服务器上的浏览器(如果安装了 GUI)或者在 bash 终端中使用curl测试是否能上网。首先安装curl:
$ `sudo apt install curl`
如果没有允许 HTTP 和 HTTPS 的规则,安装命令将会失败,因为更新通常是通过 HTTP 进行的。不过,如果已经配置了这些规则,curl应该已经成功安装,你现在可以确保端口 80 和 443 已开放:
$ `curl http://icanhazip.com`
`ipaddress`
地址icanhazip.com/是一个公共服务提供商,当通过curl查询时,它会返回你当前的公共 IP 地址。如果显示了当前的公共 IP 地址,那么说明防火墙配置正确。
如果你收到错误,可能是某个规则存在问题。检查拼写,如果仍然无法解决,请删除规则并使用之前讨论过的-D或-F参数重新开始。一旦防火墙配置正确,可以根据需要添加更多规则。
一个特别要添加的规则集是那些阻止流量到特定 IP 地址的规则。然而,由于大多数公共网站可能有多个 IP 地址,使用 iptables 屏蔽一个网站并不是最好的选择,因为你需要为每个唯一的 IP 地址创建规则。在大多数情况下,使用代理会更好,我们将在第六章中介绍。
如果你想使用 iptables 屏蔽某些网站—比如,屏蔽所有流量到www.squirreldirectory.com/,该网站目前位于 IP 地址 206.189.69.35,你需要将以下规则添加到INPUT和OUTPUT链中:
$ `sudo iptables -A INPUT -s 206.189.69.35 -j DROP`
$ `sudo iptables -A OUTPUT -s 206.189.69.35 -j DROP`
通常,你会添加这种类型的规则来允许或拒绝来自静态、私有 IP 地址的流量,该 IP 地址预期不会更改,并使用代理处理公共 IP 地址或 URL。
记录 iptables 行为
你现在已经安装并配置了 iptables 防火墙,但你没有告诉它记录任何内容,所以它不会产生任何行为记录,这可能使得故障排除或确定是否应阻止某些流量变得困难。
首先,创建一个新的自定义策略链。请注意,此配置示例中规则的顺序非常关键。你可以随意命名链,但在这里,我们将其命名为LOGGING:
$ `sudo iptables -N LOGGING`
-N参数用于创建新链。
接下来,在INPUT和OUTPUT链的末尾添加一条规则,告诉 iptables 将所有尚未匹配规则的流量发送到新的LOGGING链:
$ `sudo iptables -A INPUT -j LOGGING`
$ `sudo iptables -A OUTPUT -j LOGGING`
然后,告诉 iptables 每分钟只记录每种丢弃的数据包一次:
$ `sudo iptables -A LOGGING -m limit --limit 1/minute -j LOG \`
` --log-prefix "FW-Dropped: " --log-level 4`
这个限制是可选的,你可以将其设置为任何时间段,比如1/second、1/minute、1/hour或1/day。限制日志条目的数量可以减少日志中的噪声以及日志文件的大小。为日志信息添加前缀("FW-Dropped: "),这样防火墙日志条目就容易识别。将日志级别设置为4会记录警告级别及以上的事件,表示对服务器或防火墙有实质性影响的事件。增加数字会记录更多较低严重性的事件,这在故障排除时非常有用。日志级别 1 到 3 只会记录警告级别以上的事件或错误。
最后,以下命令告诉防火墙,在记录后应该丢弃数据包:
$ `sudo iptables -A LOGGING -j DROP`
现在,你的防火墙将记录所有丢弃的数据包,包括从服务器的入站和出站流量。默认情况下,这些日志将保存在/var/log/messages中。
最后一步是保存防火墙配置。请记住,iptables 配置默认是临时的,重启后会丢失,这就是我们在项目 12 中安装iptables-persistent的原因。要保存配置,请运行以下命令(netfilter是iptables-persistent用于此目的的命令):
$ sudo netfilter-persistent save
run-parts: 执行 /usr/share/netfilter-persistent/plugins.d/15-ip4tables save
run-parts: 执行 /usr/share/netfilter-persistent/plugins.d/25-ip6tables save
这样,防火墙就准备好了。
你可以考虑在防火墙中添加临时规则,但请记住那句谚语:“没有什么比临时防火墙规则更持久”(Austin Scott)。例如,在防火墙中添加临时规则以允许用户从互联网下载文件时,最好找到其他替代方法,比如使用另一台主机。如果这样的规则被创建并留在防火墙配置中,它会造成一个漏洞,降低防火墙的安全性。尽量避免使用临时规则。
pfSense
除了使用 iptables 防火墙保护你网络中的每个端点外,你还应实施像 pfSense 这样的防火墙,来保护网络边界。通过这两层防火墙,你的防御深度策略得到了加强,每一层的复杂性都让任何攻击者的任务变得更加困难。你应当将边界防火墙放置在网络的物理边缘——也就是尽可能接近互联网的位置,相对于网络中的其他端点而言。对于大多数人来说,这个位置将直接位于调制解调器/路由器或连接你网络和互联网服务提供商的网络边界点后面。通过虚拟机和正确的路由配置,也有可能从逻辑上实现这一点。然而,设置边界防火墙的最佳和最安全的方式是使用物理设备。
与 iptables 类似,pfSense 防火墙是有状态的。然而,iptables 是作为一个功能安装在像 Ubuntu 这样的基本操作系统之上,而 pfSense 是一个完全成熟的操作系统。它基于 FreeBSD,这是一个开源的 Unix 版本(一个类似于 Linux 的操作系统,使用自己的内核),具有像 Web 管理界面等用户友好的特性,并且可以作为虚拟机或物理设备部署。
在创建物理防火墙时,你有几个选择。第一个是从小型计算机(如英特尔的下一代计算单元 NUC)构建一个适合此目的的设备。然而,对于相同的价格或更低的价格,Netgate 销售易于配置并且几乎开箱即用的 pfSense 设备。
为了简便(和安全考虑),我们将讨论使用预构建的设备。本文不会涉及从零开始构建设备,因为配置错误的风险太高,尤其是当有价格低廉且安全的解决方案现成可用时。撰写本文时,Netgate 2100 Base pfSense+ 的价格大约为 400 美元。它足够强大,可以应对你所需要的大部分任务,但不包括大规模的企业网络。SG-3100 比入门级的 1100 pfSense+ 更强大,功能也更全面。它具有更高的带宽和更大的吞吐量,因此它是小型网络的理想选择。
13: 安装 pfSense 防火墙
收到 pfSense 设备后,将其从盒子中取出并连接电源。用一根以太网电缆将设备上的 WAN 端口连接到你的电缆、DSL 调制解调器或网络边界设备的任意端口。再用一根以太网电缆将 LAN1 端口连接到计算机上的以太网端口。
要从计算机访问 pfSense 配置页面,请浏览到 192.168.1.1,这是 SG-3100 的默认 IP 地址。如果无法连接,您可能需要断开计算机与常规网络的连接,并手动将其 IP 地址设置为 192.168.1.2(或任何其他在 192.168.1.x范围内的地址,除了 pfSense 的 IP 地址 192.168.1.1),按照以下说明进行设置。这仅在设备的初始配置时需要完成,并且只需要在您用来设置 pfSense 设备的计算机上执行一次。
macOS
-
打开系统偏好设置。
-
点击网络。
-
选择连接在 pfSense 设备和计算机之间的以太网连接,然后将配置 IPv4 下拉框设置为手动。
-
在 IP 地址字段中输入192.168.1.2,将子网掩码设置为255.255.255.0,并在路由器字段中输入192.168.1.1。
-
点击应用。
-
打开您的网页浏览器并访问 192.168.1.1。您应该会看到 pfSense 登录页面。
Windows
-
打开网络和互联网设置。
-
点击更改适配器选项。
-
打开 pfSense 设备和计算机之间的以太网连接,然后点击属性▸互联网协议版本▸(TCP/IP)▸属性。
-
选择使用以下 IP 地址单选按钮。
-
在 IP 地址字段中输入192.168.1.2,将子网掩码设置为255.255.255.0,并在默认网关字段中输入192.168.1.1。
-
点击确定并关闭剩余的窗口。
-
打开您的网页浏览器并访问 192.168.1.1。您应该会看到 pfSense 登录页面。
Linux
-
打开设置。
-
点击网络。
-
在 pfSense 设备和计算机之间的以太网连接上,点击配置齿轮图标。
-
选择IPv4标签。
-
选择手动单选按钮。
-
在 IP 地址字段中输入192.168.1.2,将网络掩码设置为255.255.255.0,并在网关字段中输入192.168.1.1。
-
点击应用并关闭设置窗口。
-
打开您的网页浏览器并访问 192.168.1.1。您应该会看到 pfSense 登录页面。
注意:如果您收到警告消息,表示该站点不安全或不私密,请点击继续到登录页面。此警告出现是因为没有配置 SSL 证书,您现在可以忽略它。不过,请留意类似的错误;通常,SSL 证书错误(尤其是在互联网上)是一个严重的警告,表示您正在尝试访问的页面不安全。
在 pfSense 登录页面,使用收到设备时提供的凭证进行登录。如果显示了最终用户许可协议(EULA),请接受它。花点时间查看系统信息,然后点击页面顶部的系统菜单并启动设置向导。使用以下步骤完成 pfSense 的设置:
-
在欢迎屏幕上点击下一步。
-
2. 如果显示了支持屏幕,点击下一步。
-
3. 在常规信息屏幕上,为设备选择一个主机名,或者保持默认值 pfSense。
-
4. 如果您在环境中配置了域,请在“域”字段中输入它。
-
5. 现在暂时忽略 DNS 设置,点击下一步。
-
6. 在时间服务器信息屏幕上,接受默认的时间服务器主机名,除非您在环境中有时间服务器,在这种情况下,请在此输入其详细信息。
-
7. 确保选择正确的时区,然后点击下一步。
现在您应该看到“配置 WAN 接口”页面。您可以使用此页面配置您的 pfSense 设备与互联网服务提供商连接。我们将在这里介绍最常见的配置,称为PPPoE,这可能与您当前的调制解调器/路由器设置相匹配。如果不匹配,请联系您的互联网服务提供商以获取正确的连接配置详情。
-
8. 在“选择类型”框中,选择PPPoE。
-
9. 跳过常规配置选项,接受默认设置。
-
10. 静态 IP 配置和 DHCP 客户端配置应被禁用,因此请继续进行 PPPoE 配置。
-
11. 输入由您的互联网服务提供商提供的用户名和密码。
-
12. 接受所有其他默认设置并点击下一步。
-
13. 设置 pfSense 设备的 LAN IP 地址。您可以选择保持在第一章中确定的 IP 地址方案,给此设备分配地址范围中的第一个 IP(例如,在 192.168.0.0/16 地址方案中是 192.168.1.1),或者您也可以通过在此页面上指定不同的 LAN IP 地址来更改它。如果您希望使用 10.0.0.0/8 范围的地址,可以指定 10.0.0.1,以此类推。然后点击下一步。
-
14. 更改管理员密码。请务必选择一个至少 12 个字符或更长的强密码,并将其保存在密码管理工具中(我们将在第十一章中进一步讨论)。完成后,点击下一步▸重新加载▸完成。
您的初始配置现已完成。假设设备已经凭借您的凭证成功连接到您的互联网服务提供商,您应该能够浏览互联网。如果无法连接,可能需要进行故障排除。进行故障排除的最佳地方是在 Web 界面顶部的“状态”菜单中的系统日志页面。运气好的话,查看日志后,任何问题都会显现出来。如果您确认输入了所有配置详情,联系您的互联网服务提供商以确保您的设置正确。
加固 pfSense
您的防火墙现在已配置并正在运行,它应该能够有效地拒绝未经请求的流量进入您的网络。然而,您可以采取额外的措施,确保您的设备和网络更加安全。
登录到您的 pfSense 设备后,点击系统▸高级。

图 3-2:高级 pfSense 菜单
在高级菜单选项卡中,您可以更改 pfSense 使用的协议、端口和代理设置等。如果更改任何设置,请在离开选项卡之前点击保存。
在图 3-2 所示的管理员访问选项卡中,将 webConfigurator 协议设置为HTTPS,以确保与设备的安全加密连接。总是优先使用 HTTPS 而不是未加密的 HTTP 协议,因为添加的加密确保即使网络流量被攻击者拦截,攻击者也无法解密它。
在管理员访问页面的下一部分(未在图 3-2 中显示),您可以更改 SSH 选项。我建议不要一直允许 SSH 访问设备——那就像晚上把前门锁忘了。如果您只在主动使用时才允许 SSH 访问,那么只有在该服务可用时,攻击者才能尝试访问您的网络。大部分时间禁用该服务意味着攻击者只有 1%的时间可以尝试入侵网络。除非您正在通过 SSH 连接设备,否则请禁用此选项。更新这些设置后,点击保存。
在网络选项卡中,您可以启用或禁用 IPv6 流量。如果您没有积极使用 IPv6,请在此处禁用它,以减少攻击面。这样做应该会让页面上的其他设置变得不重要。
如果您使用代理服务器来处理网页流量,请在杂项选项卡中输入您的代理详细信息。如果您计划按照第六章中详细的步骤构建自己的代理服务器,请返回此章节,并在那个阶段输入代理详细信息。
pfSense 防火墙规则
默认的 pfSense 防火墙规则会阻止来自 RFC1918 私有网络连接和bogon 网络的流量进入您的网络。RFC1918 地址在第一章中讨论,是仅供私有内部网络使用的 IP 地址范围,意味着这些范围内的地址不应出现在公共互联网中。它们包括以下范围:192.168.0.0/16、10.0.0.0/8 和 172.16.0.0/12。如果这些地址出现在互联网上,您的防火墙应视为可疑并丢弃这些流量。同样,bogon 网络或 bogon 地址是那些公共的但尚未由 IANA 分配给任何人的地址。如果尚未分配的地址或地址范围发送网络流量,这也是可疑的,防火墙应丢弃这些流量。
尽管默认的防火墙规则是一个不错的起点,但你应该手动添加一些规则,以提供更高的安全性。例如,你不应该允许像服务器消息块(SMB)这样的服务,它允许 Windows 计算机在网络上共享文件,发送或接收来自你网络到互联网的出站或入站流量,或者从互联网接收入站流量。
注意:2017 年 5 月的 WannaCry 勒索病毒通过一个名为 EternalBlue 的 SMB 漏洞传播;在你的边界防火墙阻止 SMB 流量能显著减少你暴露于此漏洞的风险,并降低其他类似漏洞被用来危害你网络的风险。
要添加一个阻止 SMB 流量的规则,请按照以下步骤操作:
-
1. 在 pfSense 中,在页面顶部点击防火墙▸规则。
-
2. 点击LAN▸添加开始添加规则。
-
3. 将动作设置为阻止(丢弃数据包)或拒绝(丢弃数据包并通知发送者)。
-
4. 将地址族设置为IPv4,协议设置为TCP。
-
5. 将源设置为任何,目标设置为任何,目标端口范围(到和从)设置为(其他) 445。
-
6. 确保勾选日志框以记录任何丢弃的数据包,然后点击保存。
完成后,你的防火墙不再允许 SMB 流量通过网络边界。按照相同的步骤操作端口 137、138 和 139,因为这些服务(NetBIOS 名称解析、NetBIOS 数据报服务和 NetBIOS 会话服务)也不应允许跨越网络边界,因为所有这些协议都是用于本地网络内部的过程。
14: 测试你的防火墙
设置一个或多个规则后,测试防火墙以确保被阻止的流量确实被拦截。最好的工具是Nmap,它用于网络扫描或网络映射。在 Windows、Linux 和 Mac 上都有 GUI 版本(称为Zenmap),也可以作为命令行工具使用。安装 GUI 版本后,它也会在命令行上可用,因此请从www.nmap.org/下载并安装最新版本。
否则,你可以在 Ubuntu 上通过命令行安装:
$ `sudo apt install nmap`
安装完 Nmap 后,使用以下命令从命令行扫描 445 端口,这是我们告诉防火墙要阻止的端口:
$ `sudo nmap -p 445 -A scanme.nmap.org`
`--snip--`
Nmap scan report for scanme.nmap.org (45.33.32.156)
Host is up (0.20s latency).
Other addresses for scanme.nmap.org (not scanned): 2600:3c01::f03c:91ff:fe18:bb2f
PORT STATE SERVICE VERSION
445/tcp filtered microsoft-ds
Service detection performed. Please report any incorrect results at https://nmap.org/submit/.
Nmap done: 1 IP address (1 host up) scanned in 2.54 seconds
你可以在 Zenmap GUI 中使用相同的命令—只需排除sudo。此命令将从你设备的防火墙后面执行端口扫描,扫描目标网站scanme.nmap.org/,这是一个由 Nmap 创建者提供的公共网页,用于测试目的。
该命令分解如下:nmap 是程序的名称。-p 445 参数指定要扫描的端口,可以是逗号分隔的端口列表(如 -p 445,137,138,22)、特定端口(如所示)或端口范围(如 -p1-1024)。-A 参数告诉 Nmap 尝试识别每个扫描端口上的服务和操作系统,而 scanme.nmap.org 是要扫描的网站或系统。如果结果返回并且端口的 STATE 显示为 filtered,则说明防火墙已阻止该流量,防火墙规则正常工作。如果 STATE 显示为 closed,则表示防火墙允许流量通过,且是网站本身而不是防火墙返回的响应,表示端口已关闭。如果收到此结果,则说明你的防火墙规则没有配置或没有生效。
一旦你的规则生效,进入防火墙日志查看被阻止的数据包。在 pfSense 中,点击页面顶部的状态▸系统日志▸防火墙,可以查看防火墙日志中的最后 500 条记录,如图 3-3 所示。

图 3-3:pfSense 防火墙日志
很可能,你会看到大量被阻止的流量。在这个阶段,很难知道这些被阻止的流量是什么。举个例子,我日志顶部的一个条目显示了来自 IP 地址 80.82.77.245 的连接在端口 46732 被阻止。
经过进一步调查,似乎这是一个为“研究目的”定期扫描公共 IP 地址的服务。也就是说,它可能是什么都不确定;我怎么知道这个“研究”是否合法,还是有敌人试图找到我防火墙中的漏洞来渗透我的网络呢?在大多数情况下,无法知道,但至少我的防火墙在积极地阻止这种活动,如果需要,我可以在防火墙日志中找到它,回顾并采取行动。我们将在第十章中详细讨论如何处理这些信息,内容包括网络安全监控。
总结
你的网络和主机由于有主机和网络级别的防火墙而显著更加安全。在本章的项目中,你已经创建了规则和规则集,使得敌人更难渗透你的网络,甚至更难做到不被发现。
虽然本章已经为你提供了防火墙的基础知识和更深的理解,但为了你的利益,建议进一步研究你希望在网络内、进出网络时允许或拒绝的端口和协议。每个网络都会有所不同,具有不同的需求。
第四章:# 无线网络安全

无线网络已经变得无处不在,几乎等同于在线连接。大多数有互联网连接的地方都有一个无线调制解调器或路由器,为从台式电脑到手机以及物联网(IoT)设备,如电视、灯泡和冰箱等多种设备提供服务。如果没有无线技术,现代生活将不那么便利,但便利性通常迫使我们放弃一些在线安全。
无线网络使我们的网络超越了最初作为物理边界的电缆。它们甚至绕过了我们习以为常的其他物理障碍:墙壁。随着无线技术的发展,我们的无线网络的有效距离不断提高,以至于我们现在看到的更大网络已经超出了原本仅限于局域网(LAN)范围的区域,甚至扩展到了我们的邻居家。这在连接性方面是令人兴奋的,但在安全性方面却可能带来灾难性后果。
本章将讨论与更广泛的无线网络相关的一些陷阱。你将了解如何通过禁用 IPv6 和限制允许接入无线网络的设备数量来减少攻击面。本章还将深入探讨 MAC 地址过滤,它只允许已知设备接入内部网络;在不使用时禁用功能;使用安全的认证方法;以及根据设备或用户在网络中的必要权限级别对它们进行分组。
15: 禁用 IPv6
IPv6,即互联网协议的新版,旨在解决我们最终将耗尽公开可寻址的 IPv4 地址空间这一问题。IPv6 通过大幅扩展可用的地址空间,但它不如另一种缓解措施普遍:网络地址转换(NAT),我们在第一章中已有介绍。如果你在网络中没有使用 IPv6,但仍然启用它,那么你就为攻击者提供了一个潜在的入侵通道(即进入或以其他方式破坏网络的另一种方式)。作为一般规则,你应该禁用或卸载所有未在积极使用中的协议和应用程序,以防止攻击者利用这些工具(或工具的漏洞)来攻击你。禁用未使用的协议可以减少你环境的攻击面,攻击面应尽可能小。
如果你在网络中没有积极使用 IPv6,尽量在所有可以禁用的地方禁用它,包括在你的 Wi-Fi 配置中。要禁用 IPv6,按照以下步骤操作:
Windows
-
1. 打开网络和互联网设置。
-
2. 点击更改适配器选项。
-
3. 在弹出的窗口中,对于每个适配器,双击适配器并点击属性。
-
a. 找到互联网协议版本 6(TCP/IPv6)复选框并取消选中。
-
b. 点击确定并关闭剩余的窗口。
-
macOS
-
1. 打开系统偏好设置。
-
2. 点击网络。
-
3. 对于列表中的每个适配器,点击高级。
-
a. 打开TCP/IP标签页。
-
b. 确保将配置 IPv6 设置为关闭。
-
Linux
-
1. 打开设置。
-
2. 从左侧列表中选择网络。
-
3. 对于每个适配器,点击配置齿轮图标。
- a. 在IPv6标签页中,点击禁用单选按钮,然后点击应用。
你的调制解调器或路由器
配置你的调制解调器或路由器可能更为复杂,因为每个设备都有自己的配置菜单和选项。一些设备会有 IPv6 部分;如果是这种情况,访问该菜单并完全禁用 IPv6。或者,你可能会在 DHCP 设置中找到 IPv6 选项。其他设备可能隐藏在无线或局域网设置中。在第三章讨论的 pfSense 设备中,IPv6 设置位于服务▸DHCPv6 服务器 & RA下。除非你在 pfSense 中配置了具有静态 IPv6 地址的网络接口,否则默认情况下会禁用此项。
如果你无法在设备中找到 IPv6 的设置,尝试在互联网上搜索设备的品牌和型号。一旦禁用了 IPv6,你就更接近于提高安全性了一步。
16: 限制网络设备
大多数小型非企业网络很少指定或限制网络中存在的设备,并且由于过于开放,允许所有设备连接而遭受安全问题。虽然这种设置提供了便利,特别是在购买新设备或朋友过来时,但这是一种不安全的做法,给潜在的对手留出了一个巨大的漏洞,无论是针对性的还是 opportunistic(机会主义的)。
你可以通过识别所有被允许连接到网络的设备并限制只允许这些设备访问,从而避免这个安全风险。创建一个资产清单——包含每个设备的数据表,例如设备类型(PC、笔记本、手机等)、位置、主机名、MAC 地址(硬件地址)和 IP 地址——将补充你的网络图,并互为补充,帮助你追踪网络中的各种设备。
一旦你收集了网络中所有端点的信息,你就可以为已知设备分配静态 IP 地址,并减少 DHCP 服务器中可分配的 IP 地址范围。将范围设定得足够小,以便包括资产清单和网络图中的设备所需的地址。通过减少可用地址的数量,你可以降低对手将新设备添加到你的网络中的风险,即使采取了这个安全措施,对手也可能强迫其中一个设备断开并连接他们自己的设备。这时,MAC 地址过滤就发挥作用了。
MAC 地址过滤 允许您根据设备的 MAC 地址允许或拒绝对网络的访问。如果您知道所有允许设备的 MAC 地址,您可以使未经授权的设备更难加入网络,同时更容易被发现。
创建资产列表
与大企业不同,在小型网络中制作资产列表相对简单。首先,使用纸笔、Excel 或其他工具创建一个类似于 表 4-1 的表格。
| 表 4-1:资产列表模板 |
|---|
| 设备 |
| --- |
| 我的笔记本 |
| 他们的笔记本 |
| 我的手机 |
| 他们的手机 |
| 电视 |
| 平板电脑 |
| Xbox |
您可以选择省略主机名和位置,但一定要包括每台设备的 IP 和 MAC 地址。如果设备已连接到网络,您可以从路由器的 DHCP 部分或 DHCP 服务器中获取这些信息(如果您有 DHCP 服务器)。对于没有用户界面的设备,如 Wi-Fi 连接的灯光,这可能是您的最佳或唯一选择。或者,您可以从每个主机收集详细信息。
Windows
-
1. 打开 网络和互联网设置。
-
2. 点击 更改适配器选项。
-
3. 确定连接设备到网络的适配器。如果连接到 Wi-Fi,它将是 Wi-Fi 适配器;否则,它就是以太网适配器。双击适配器,然后点击 详细信息。
-
4. 查找物理地址,并将其记录为计算机的 MAC 地址,放入您的资产列表。
-
5. 查找 IP 地址并记录下来。
-
6. 点击 关闭 并关闭剩余窗口。
macOS
-
1. 打开 系统偏好设置 并点击 网络。
-
2. 确定连接设备到网络的适配器。如果连接到 Wi-Fi,它将是 Wi-Fi 适配器;否则,它就是以太网适配器。
-
3. 点击 高级,然后点击 TCP/IP 标签。
-
4. 记录 IPv4 地址。
-
5. 转到 硬件 标签并记录 MAC 地址。
-
6. 点击 确定 并关闭网络窗口。
Linux
-
1. 打开 设置。
-
2. 从左侧列表中选择 网络。
-
3. 确定连接设备到网络的适配器。如果连接到 Wi-Fi,它将是 Wi-Fi 适配器;否则,它就是以太网适配器。
-
4. 点击配置 齿轮图标。
-
5. 在 详细信息 标签中,记录 IP 地址和硬件地址(MAC 地址)。
-
6. 关闭窗口。
您应该已经成功识别了网络中所有已知的设备。如果有任何未知设备连接,您将通过接下来的 “MAC 地址过滤” 部分的步骤将其屏蔽。接下来,您将为每台设备分配静态 IP 地址。
静态 IP 地址配置
IP 地址可以是静态的也可以是动态的。默认情况下,大多数路由器使用动态主机配置协议(DHCP)服务器为端点分配 IP 地址,当它们连接到网络时。这个分配过程被称为DHCP 租约,并且是有时间限制的;租约通常在 24 小时后到期。动态 IP 地址可能会在每次端点连接或租约到期时发生变化。然而,你也可以为每个端点分配一个静态 IP 地址,这样它每次连接到你的网络时都会保持不变。这可以帮助你知道某个 IP 地址对应哪个端点,并且通过限制可用的动态地址来防止未知设备连接。
你可以在大多数 Wi-Fi 路由器的 DHCP 菜单中找到静态 IP 地址设置。以本例为例,我们将使用 Netgate SG-3100 上的 DHCP 租约菜单,详情见第三章,但无论你使用的是哪个设备,过程应该是类似的。要进入 SG-3100 中的 DHCP 租约菜单,点击状态▸DHCP 租约。在类似的设备中,它可能出现在 LAN 或高级设置中。你应该能看到一个类似于图 4-1 的表格。

图 4-1:Netgate SG-3100 pfSense 防火墙上的 DHCP 租约菜单
要创建一个静态 IP 地址(也叫做静态租约),点击添加按钮(在 SG-3100 中是左侧未填充的+按钮)。随后出现的页面允许你为选定的主机指定 IP 地址。你可以指定任何你想要的地址,只要它在你的地址方案范围内,然后点击保存。例如,如果你的地址方案是192.168.1.x,你可能会选择192.168.1.100。你选择的 IP 地址不必是连续的;你可以为此主机使用192.168.1.100,为下一个主机使用192.168.1.54。分配了静态地址后,主机可能需要重新连接网络以获取该地址;你可以通过重启设备(关机再开机)强制它重新连接。
一旦你为授权设备分配了静态 IP 地址,更新你的资产清单和网络图。然后,为了有效地禁止其他设备未经授权连接,缩小 DHCP 服务器可分配的地址范围。
默认情况下,DHCP 服务器服务会使整个 IP 地址范围对设备可用,以便它们连接到网络。如果你的 IP 地址方案是192.168.0.0/16,你的网络最多可以连接 65,534 个主机。没有哪个小型网络需要这么多主机,且将地址范围保持开放是一个安全隐患。
要查看 SG-3100 中的 DHCP 地址范围,点击服务▸DHCP 服务器。你的设备应该会显示一个类似于图 4-2 的 IP 地址范围。

图 4-2: DHCP 地址范围
虽然数字可能不同,但总体配置应该差不多。为了手动授权每个连接到你网络的设备,你需要禁用 DHCP 服务器,并为每个端点添加新的静态地址。另一种方法是缩短可用的 DHCP 地址范围。比如,你可以指定一个地址范围从192.168.1.100到192.168.1.105,而不是让范围从192.168.1.100到192.168.1.245,从而限制最多可以分配 DHCP 地址的设备数量为六个。当这些 IP 地址已被静态分配给网络中的设备时,没有任何新设备可以从 DHCP 服务器获取 IP 地址,除非某个设备下线或被移除出网络。减少可用地址空间可以减少未经授权设备连接到网络的能力,从而最小化攻击面。
你可能会想,考虑到任何想要连接到你的无线网络的人都需要靠近,你可能也不会让陌生人进入你的家或办公室,那么这些步骤是否真的必要呢?不过要考虑到,“靠近”的定义可能仅是距离你楼外街上的一辆车,或者隔壁办公室的一套房间。
MAC 地址过滤
MAC 地址过滤可以作为独立的防御措施或额外的安全层实现。大多数无线路由器允许你指定允许连接到网络的 MAC 地址,从而阻止未指定的 MAC 地址。由于 MAC 地址与设备的硬件相关,它们比 IP 地址更不容易发生变化。
如今,伪造或欺骗硬件地址并不困难。然而,你可以在对手和你的网络之间设置更多障碍,来增强网络安全性。举个例子,要访问 ASUS RT-AC5300 无线路由器的 MAC 地址过滤页面,你需要点击无线▸无线 MAC 过滤器,如图 4-3 所示。

图 4-3: ASUS AC-RT5300 路由器上的无线 MAC 地址过滤
如图 4-3 所示的基本配置选项——无线频段、过滤器是否启用以及过滤模式是接受还是拒绝——可以应用于 2.4 GHz 或 5 GHz 无线电频段。
在图 4-3 中,5 GHz 频段的 MAC 过滤器已启用,模式选项设置为拒绝。这种模式使过滤器作为拒绝列表工作,意味着列表中的任何设备都将被阻止或拒绝访问。另一方面,允许列表是允许访问的端点列表。当您知道要拒绝访问的设备的 MAC 地址时,使用拒绝列表。在大多数情况下,您将使用接受模式或允许列表模式。在接受模式下,MAC 过滤器列表包含您明确允许访问网络的 MAC 地址。
选择启用 MAC 过滤器和接受,然后输入您资产列表中的 MAC 地址。添加所有 MAC 地址并保存配置后,除非设备在允许列表中,否则无法连接到无线网络并获取 IP 地址。您可以通过从接受列表中移除某个不太重要的设备并尝试连接到网络来进行测试。如果该设备无法连接,则说明您的 MAC 过滤器工作正常。
17: 网络分段
无线网络使您能够通过使用独立的客户网络与访客共享互联网连接,而不会妥协您的安全性。大多数中端无线路由器都提供此功能。例如,ASUS RT-AC5300 允许在 2.4 GHz 和 5 GHz 无线频率上设置多个客户网络,如图 4-4 所示。

图 4-4:多无线网络功能
客户网络不仅对您的访客方便,它还允许您根据风险或信任等级将用户和设备进行分组。例如,在您的私人内部网络中,您可能会连接主要设备:笔记本电脑、移动设备等。然后,在客户网络上,您可能会连接物联网设备:您的 Google Home、Amazon Alexa、LIFX 或其他智能灯泡以及其他类似设备。
某些类别的设备天生不太安全。例如,物联网(IoT)设备容易受到僵尸网络感染。僵尸网络是由一组连接到互联网的设备组成,通常通过安装在每个设备上的恶意软件链接在一起。恶意软件使得这些设备作为一个整体被控制,通常用于恶意活动,如分布式拒绝服务攻击、数据盗窃或垃圾邮件发送。允许安全性较低的设备与您的主要设备在同一网络段上是有风险的。减轻这种风险的最佳方法是将它们分开,无论是逻辑上还是物理上。
如图 4-4 所示,你可以允许网络上的访客设备连接无限时长,或者只允许他们在你选择的特定时间段内连接,这对那些只需要几小时访问权限的访客非常有用。通过将路由器配置为允许访客无限制访问,你实际上是在以安全性换取便利性。相反,限制访客连接的时间,直到他们需要重新授权,需要更多的工作。但这是一个更安全的访问控制方式。
一些无线路由器和接入点提供的最后一个功能是允许或拒绝对你 内网 的访问选项,内网是你的私人设备连接的内部网络。允许访客访问这一网络段会降低你的安全性,因为它允许他们访问你的计算机和移动设备。如果你让访客访问整个网络,倒不如让他们直接访问你的主要无线网络,而不是配置一个访客网络。我讨论的这款华硕无线路由器具备这个功能;如果你配置了一个访客网络,你可以选择是否允许连接到该无线网络的终端访问你的内网,或者只允许他们访问互联网网关。路由器通过允许或禁止连接到访客网络的设备查看连接到主网络的设备来处理这种访问。禁止访客网络访问你的内网是更安全的选项,也是你应该实施的选项。如果你的路由器具备此功能,应该在无线网络设置中有一个明显的复选框。如果找不到它,很可能你的路由器没有此功能(不过你可以通过阅读手册或进行快速互联网搜索来确认)。
18: 配置无线认证
你应该通过创建密码短语来保护你的 Wi-Fi 网络,以便访问该网络。一个没有保护或加密的开放无线网络为对手提供了一个主要目标。今天,大多数网络使用三种安全算法之一来保护它们的通信:WEP、WPA/WPA2 或 WPA3。
WEP
有线等效隐私(WEP) 是三种安全协议中最古老的,也是最不安全的。WEP 使用 40 位或 104 位的加密密钥,与后续协议相比,这些密钥相对较短。WEP 将此加密密钥与 24 位初始化向量(IV)结合使用,旨在提供增强的安全性,但这些 IV 的长度较短意味着该算法可能会重复使用密钥,从而使加密变得更容易破解。理解这些细节并不是必须的;只需知道 WEP 是一种不安全的技术,不应再使用。实际上,厂商在 2001 年就已逐步淘汰 WEP;目前大多数硬件上已不再支持它。
WPA/WPA2
Wi-Fi 保护访问(WPA),作为 WEP 的继任者,改善了 WEP 的保护。虽然它仍然依赖于相同的 RC4 加密算法,但它还引入了时间密钥完整性协议(TKIP)。TKIP 通过使用 256 位密钥并实现消息完整性检查、更大的 48 位初始化向量(IVs)和减少 IV 重用的机制,加强了无线安全性。
反过来,WPA2 改进了原始的 WPA 协议。WPA 和 WPA2 都允许用户在个人模式和企业模式之间选择。个人模式称为 WPA-PSK,使用预共享密钥(PSK)或密码短语来授权访问,而企业模式则需要一个身份验证服务器。WPA2 替换了 RC4 加密算法和 TKIP,采用了更安全的算法和加密协议。此外,它实现了计数模式 CBC-MAC 协议(CCMP),这是一种更安全的加密机制。所有这些使得 WPA2 比早期的加密协议更加安全,并且便于在接入点之间漫游,提供更流畅的用户体验。如果可能的话,在你的无线网络中选择 WPA2 或更高版本。
尽管如此,攻击者仍然可以捕获你的无线流量并暴力破解你的网络密码。尽管 WPA2 表现良好,但没有任何安全技术是完美无缺的。因此,请确保使用强密码短语来保护你的无线网络。密码短语的详细内容请参阅第十一章。
WPA3
Wi-Fi 保护访问版本 3(WPA3)是最新的无线安全技术。它非常新,尚未得到广泛应用。WPA3 通过防止同一网络中的用户窃听彼此的无线通信来提高安全性——即使无线网络是开放的,并且不需要密码进行身份验证。
WPA3 通过用一种新协议替代 WPA2 中使用的预共享密钥认证:等效认证(SAE)。这一变化还意味着对手无法捕获破解网络密码所需的流量,从而使得未经授权访问网络变得更加困难。
目前,WPA3 仍处于初期阶段,因此很少有设备兼容。更新的无线路由器和接入点将默认支持 WPA3。不过,即便如此,其他设备仍需追赶才能使用它;如果你的手机和电脑无法连接,那么拥有一个 WPA3 路由器也没有太大意义。一旦这一情况改变,你应该优先使用 WPA3,而不是其他无线安全标准。
要配置我们讨论的 ASUS 路由器,在无线设置中,进入 高级设置▸无线▸一般,您需要通过指定网络名称(SSID)和安全密钥或密码来创建主内网,如图 4-5 所示。然后,在 一般▸访客网络▸启用 中,创建一个或多个访客网络,并通过指定网络名称和安全密钥或密码,将所有其他设备连接到这些网络,就像为主无线网络所做的那样。

图 4-5:主要无线网络设置
本示例中使用的 ASUS 路由器将主无线网络与访客网络隔离开来。大多数现代中高端无线路由器也可以遵循相同的设置过程。连接到主无线网络的任何终端无法与连接到访客网络的终端通信,反之亦然。然而,如果创建多个访客网络,这些网络中的设备将能够看到并互相通信。一些无线路由器还可能提供将每个访客网络完全隔离的功能。如果您希望具备这种功能,在购买无线路由器之前请做好相关调研。
一定要遵循安全操作规范,并利用任何可用的安全选项,例如前面讨论过的那些。例如,ASUS 路由器提供了多个功能来保护无线网络,具体如图 4-6 所示。

图 4-6:无线网络安全设置
如果您能够设置 WPA 密码短语或预共享密钥,请务必设置。您应该随时抓住任何机会加强网络安全,防范机会主义的对手。在某些情况下,限制连接到这些网络的终端的访问时间也是有益的。如果您打算为始终在线并保持连接的终端使用一个辅助网络,这个选项可能不适合您的需求。然而,如果您将这些网络用于访客或仅需要有限连接的终端,建议限制这些终端的连接时间,控制在合理的分钟或小时数范围内。最后一个选项,见于图 4-6,启用 MAC 过滤,允许或拒绝设备基于其硬件地址访问您的网络。
总结
在本章中,我们讨论了常见的无线网络安全风险以及通过实施措施(如 IP 和 MAC 地址过滤、减少 DHCP 服务器中的可用地址空间)来降低这些风险的方法。创建和维护资产清单和网络地图有助于确保没有未经授权的设备连接到您的网络。窃听是最容易防范的风险。通过在您的网络中添加加密(采用 WPA 安全性,理想情况下是 WPA3,因为它越来越普及),并为网络访问实现密码短语而非密码,可以有效防范此类风险。
第五章:# 创建虚拟私人网络

虚拟私人网络(VPN)是一种通过公共互联网提供通信隐私和安全性的手段。如果你不希望恶意第三方在你的谷歌搜索流量从本地笔记本电脑传输到谷歌服务器的过程中进行拦截,你应该使用 VPN 来加密两端之间的流量。如果你经常传输敏感文件或数据,如个人身份信息或银行信息,最好使用加密来保护这些信息。
VPN 的另一个主要功能是将私人网络(例如家庭和办公室中的网络)从一个地理位置扩展到另一个地理位置。VPN 在互联网上创建一个隧道,将一个网络与第二个网络连接。这意味着,如果一个通常位于澳大利亚的用户正在欧洲旅行,他们可以像在澳大利亚一样从欧洲连接到他们的家庭网络。相反,如果一个位于澳大利亚的用户希望看起来像是位于欧洲,他们可以将 VPN 端点设置在欧洲,通常通过某个第三方服务。
本章概述了一种创建私人 VPN 的方法,其中的出口节点(即 VPN 隧道结束的地方)位于你的本地网络之外,地理位置上位于世界某个地方,从而使你的实际物理位置保持隐私。我们将讨论如何使用 OpenVPN 或 Wireguard 实现这一目标。
第三方 VPN 和远程访问服务的缺点
尽管你可以订阅像 NordVPN 或 ExpressVPN 这样的 VPN 服务,运营自己的 VPN 更有利,因为你可以控制其中的一切,包括连接和流量记录的级别,以及服务的成本。此外,虽然第三方服务提供了一些好处,例如使用位于不同位置的多个出口节点的可能性,但它们通常不提供连接到你自己网络的远程访问功能。使用第三方 VPN 服务的最后一个挑战是,它们通常限制你可以同时连接的设备数量。私人管理的 VPN 没有这样的限制。
最近,许多应用程序涌现出来,旨在允许从更广泛的互联网远程访问端点。这些包括 Teamviewer 和 AnyDesk 等软件和供应商。尽管这些解决方案方便且入门门槛较低,但它们通过为你的计算机打开远程访问到互联网,增加了你的私人网络的攻击面,而这种行为应尽量避免,甚至从不做过。此外,已经发生了几起这些解决方案被攻破的著名事件,表明它们易受攻击。VPN 提供了一个更加安全的解决方案。
OpenVPN
OpenVPN是最常见的 VPN 解决方案之一。由于其历史悠久且普及,您可以确信它在安全性方面优于较新的解决方案,因为后者在漏洞和安全缺陷的测试上不够严格。OpenVPN 已内置于多种网络硬件中,这一点非常有利,因为在很多情况下,您的路由器可以作为您网络内部的 VPN 端点(即 VPN 服务器)。这意味着您的路由器也可以充当 VPN 客户端,连接到云中的 VPN 服务器,然后您内部网络上连接到路由器的所有设备都可以通过 VPN 隧道发送和接收流量。以这种方式加密您的互联网流量,比不使用 VPN 直接上网提供了更大的隐私保护。然而,理想情况下,您希望对 VPN 出口节点有更多控制,因为大多数路由器使用的是简化版的 Linux 或专有操作系统,因此您将学习如何使用 Ubuntu 创建一个 VPN 服务器,以获得更大的灵活性。
EasyRSA
EasyRSA 是一个命令行工具,用于创建和管理证书授权机构。为了加密和保护流量,OpenVPN 需要一个证书授权机构(CA)来颁发证书。数字证书用于建立不同方之间的信任,通常是网络和计算机之间的信任。公钥基础设施(PKI)负责公钥证书的分发、认证和撤销,这些证书用于验证数字证书的所有权。这些证书包含一个实体用作公私钥对一部分的公钥,用于加密数据,只有拥有匹配私钥的公钥所有者才能解密。这种方法保护了今天互联网上的大多数通信。
您创建的 CA 将生成、签名、验证并撤销(如有必要)所有用于加密和保护 VPN 服务器与 VPN 客户端之间通信的证书。从技术上讲,您可以将 OpenVPN 和 CA 安装在同一台服务器上,但这样做比将它们安装在不同的服务器上更不安全。任何能够访问该服务器的对手都能获取服务器使用的证书和私钥,并且有能力生成新的证书。因此,您需要两台 Ubuntu 服务器:一台作为 OpenVPN 服务器,另一台作为证书服务器。您将使用证书服务器来签署在 OpenVPN 服务器上生成的请求,这些请求既包括 VPN 服务器的请求,也包括任何连接到 VPN 的客户端设备的请求,无论它们是笔记本电脑、工作站、移动设备还是其他类型的设备。
Wireguard
Wireguard,作为 OpenVPN 的一个相对较新的替代品,比起 OpenVPN 来说,它非常简单且速度极快。它较新的缺点是,尽管 Wireguard 是开源的,但由于开发时间较短,尚未经过充分的漏洞和错误测试。然而,它已经在安全社区中积累了相当大的用户群,并且因其可靠性和安全性而享有良好的声誉。
注意:如果你计划远程连接到你的私有网络,请记住,你需要在家里或办公室的互联网连接上拥有一个静态 IP 地址,并在边界路由器上进行一些端口转发。大多数互联网服务提供商可以按需提供静态 IP 地址,通常需要支付少量费用。
19:使用 OpenVPN 创建 VPN
在这个第一个项目中,你将从创建一个 OpenVPN 服务器和一个证书授权机构开始,以通过 VPN 保护通信。接下来,你将生成相关证书,创建 OpenVPN 配置文件,配置主机防火墙,并启动 VPN。最后,你将配置每个将使用此 VPN 进行数据传输的 VPN 客户端,并连接和测试 VPN 连接。
在云端启动 OpenVPN 服务器并连接客户端的整个过程应该不会超过几个小时。为每个后续客户端添加连接大约需要每个端点 30 分钟。作为创建 VPN 的一部分,你需要启用并配置服务器上的防火墙。Ubuntu 内置的防火墙,简单防火墙(UFW),旨在简化防火墙配置的复杂性。它比像 iptables(在第三章中讲解的)这样的解决方案要简单得多。在这个项目中,我们将介绍 UFW 及其用法,作为一种替代的主机防火墙解决方案。或者,你也可以应用在第三章中学到的知识,并在 iptables 部署中实现与 UFW 相同的规则。即使你已经部署了像 pfSense 这样的外围防火墙,仍然要确保启用 Ubuntu 提供的主机防火墙或 iptables,按照第三章中的内容,提供额外的主机级保护。实施主机防火墙还可以更精细地配置服务器的网络连接。
一旦启用防火墙,你需要调整 Ubuntu 安装的设置,以便 OpenVPN 流量能够穿越该防火墙。(我将在项目的后面部分讲解如何操作。)
为了保护来源于你网络内部的互联网流量,你将需要在其他地方配置一个 VPN 出口节点,以及一个证书服务器,因此请参照项目 3 和第一章,在云端创建两台基础的 Ubuntu 服务器,选择你偏好的云服务提供商。
一旦你的 Ubuntu 服务器启动并运行,作为标准的非 root 用户,通过 SSH 登录到你打算用作 OpenVPN 服务器(而不是证书颁发机构)的服务器:
$ `ssh` `user``@``your_server_IP`
登录到 OpenVPN 服务器后,在 bash 终端中使用 apt 安装 OpenVPN:
$ `sudo apt install openvpn -y`
你还需要在 OpenVPN 服务器和证书服务器上安装 EasyRSA。也通过 apt 安装最新版本:
$ `sudo apt install easy-rsa -y`
确保在两个 Ubuntu 服务器上都安装此软件。默认情况下,EasyRSA 将被安装到 /usr/share/easy-rsa/ 目录下。
设置证书颁发机构
接下来,你必须配置并构建证书服务器,使其充当 CA。最简单的方法是复制 EasyRSA 提供的模板,然后修改其配置以适应你的需求。之后,你可以初始化 PKI,构建 CA,并生成其公钥证书和私钥。
在证书服务器上导航到 easy-rsa 文件夹,然后创建 vars.example 文件的副本,命名为 vars:
$ `cd /usr/share/easy-rsa/`
$ `sudo cp vars.example vars`
请记住,大多数情况下,当 bash 中的命令成功运行时,屏幕上不会有输出,你将返回到提示符。
在文本编辑器中打开生成的 vars 文件:
$ `sudo nano vars`
在文件中,找到包含证书将由此服务器生成的组织信息的 组织字段;例如:
`--snip--`
#set_var EASYRSA_REQ_COUNTRY "US"
#set_var EASYRSA_REQ_PROVINCE "California"
#set_var EASYRSA_REQ_CITY "San Francisco"
#set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
#set_var EASYRSA_REQ_EMAIL "me@example.net"
#set_var EASYRSA_REQ_OU "My Organizational Unit"
`--snip--`
文件中的每一行默认都是注释,因此在文件运行时不会被读取或解释;它们将被忽略或抑制。删除每行开头的哈希符号(#),确保在调用此文件时它们能被读取。根据你的组织或个人网络,修改右侧引号中的值。这些值可以是任何你选择的内容,但不能为空。以下是一个示例:
`--snip--`
set_var EASYRSA_REQ_COUNTRY "AU"
set_var EASYRSA_REQ_PROVINCE "Queensland"
set_var EASYRSA_REQ_CITY "Brisbane"
set_var EASYRSA_REQ_ORG "Smithco"
set_var EASYRSA_REQ_EMAIL "john@smithco.net"
set_var EASYRSA_REQ_OU "Cyber Unit"
`--snip--`
保存并关闭文件。在 easy-rsa 文件夹(它应该仍然是你当前的工作目录)内执行 easyrsa 脚本,初始化 PKI,然后使用相同的 easyrsa 脚本构建 CA,这将生成 CA 的公钥证书 (ca.crt) 和私钥 (ca.key):
$ `sudo ./easyrsa init-pki`
`--snip--`
Your newly created PKI dir is: /usr/share/easy-rsa/pki
$ `sudo ./easyrsa build-ca nopass`
`--snip--`
CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/usr/share/easy-rsa/pki/ca.crt
当系统提示输入服务器的通用名称时,你可以输入任何字符串,但通常使用服务器的主机名更方便,或者按回车接受默认的通用名称。输出将包含指向你的 PKI 目录和 ca.crt 文件的路径;ca.key 文件将位于同一位置的 private 文件夹内。nopass 选项可以避免每次查询 CA 时都需要输入密码。
到此为止,CA 服务器的配置已完成。下一组配置步骤将在 OpenVPN 服务器上进行。
创建 OpenVPN 服务器证书和密钥
每个你计划连接到 VPN 的客户端都需要自己的公钥证书和私钥文件。这些文件允许证书服务器、VPN 服务器以及 VPN 上的任何其他客户端对客户端进行认证,并允许所有设备之间进行通信。VPN 服务器也需要自己的证书和密钥,原因相同。本部分内容描述了如何为 OpenVPN 服务器签署证书并生成密钥。连接客户端到 OpenVPN 服务器的过程将类似。
在 OpenVPN 服务器上,导航到easy-rsa文件夹,并按照之前的方式初始化该服务器的 PKI:
$ `cd /usr/share/easy-rsa`
$ `sudo ./easyrsa init-pki`
就像每个连接到 VPN 的客户端需要一个证书和密钥一样,OpenVPN 服务器本身也需要一个由 CA 签署的证书。为此,首先从 OpenVPN 服务器生成一个证书请求:
$ `sudo ./easyrsa gen-req server nopass`
Using SSL: openssl OpenSSL 1.1.1f 31 Mar 2020
Generating a RSA private key
.................................+++++
........................................+++++
writing new private key to '/usr/share/easy-rsa/pki/private/server.key.2ljAQtgUYY'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [server]:
Keypair and certificate request completed. Your files are:
req: /usr/share/easy-rsa/pki/reqs/server.req
key: /usr/share/easy-rsa/pki/private/server.key
当系统提示时,按回车键接受 VPN 服务器的默认公用名称 server,或者提供自定义名称。输出显示已生成一个 RSA 私钥,并指示脚本将生成的服务器密钥和证书请求存储的位置。
将生成的server.key文件复制到 VPN 服务器的 OpenVPN 配置目录:
$ `sudo cp /usr/share/easy-rsa/pki/private/server.key /etc/openvpn/`
使用rsync将server.req文件复制到证书服务器,替换其中的用户和 CA-ip 占位符,使用你证书服务器的相关用户名和 IP 地址:
$ `sudo rsync -ruhP /usr/share/easy-rsa/pki/reqs/server.req` `user``@``CA``_``ip``:/tmp/`
接下来,输入以下命令以登录到你的证书服务器,然后导入并签署之前生成的 VPN 证书请求,从而使 VPN 通信加密并确保安全:
$ `ssh` `user``@``CA_ip`
$ `cd /usr/share/easy-rsa/`
$ `sudo ./easyrsa import-req /tmp/server.req` ❶ `server`
$ `sudo ./easyrsa sign-req` ❷ `server`
第一个easyrsa import-req命令用于导入请求。第二个参数是你之前为 VPN 服务器创建的公用名称 ❶。要签署请求,传递easyrsa sign-req命令时需要传入参数server ❷来指定请求类型,然后再次输入公用名称。(稍后,当签署客户端请求时,你将使用相同的命令,参数改为client。)
当系统询问是否确认详情无误时,仔细检查以确保公用名称已按预期设置,然后键入yes并按回车键完成导入和签署过程。你需要将生成的server.crt证书文件(连同 CA 证书)从 CA 服务器复制回 OpenVPN 服务器,以便彼此验证:
$ `sudo rsync -ruhP /usr/share/easy-rsa/pki/issued/server.crt` `user``@``vpn_ip``:/tmp/`
$ `sudo rsync -ruhP /usr/share/easy-rsa/pki/ca.crt` `user``@``vpn_ip``:/tmp/`
在 OpenVPN 服务器上,将相关文件移动到/etc/openvpn/目录:
$ `sudo mv /tmp/server.crt /etc/openvpn/`
$ `sudo mv /tmp/ca.crt /etc/openvpn/`
接下来,你需要一个 Diffie-Hellman 密钥用于设备间的密钥交换。Diffie-Hellman 密钥交换是一种通过公共通信通道安全地传递公钥和私钥信息的方式。如果没有此功能,就无法在像互联网这样的公共网络上创建安全的加密通道。
您还需要一个HMAC 签名来使过程更加安全。HMAC 签名用于 HMAC 认证并配合秘密密钥,是一种验证消息或有效载荷完整性的方法。在这个过程中使用 HMAC 签名将保持密钥交换的完整性,并允许您验证密钥的真实性。
在您的 VPN 服务器上,导航到您的easy-rsa目录,并使用之前创建的easyrsa脚本生成共享密钥:
$ `cd /usr/share/easy-rsa/`
$ `sudo ./easyrsa` ❶ `gen-dh`
$ `sudo` ❷ `openvpn --genkey secret ta.key`
$ `sudo cp /usr/share/easy-rsa/ta.key /etc/openvpn/`
$ `sudo cp /usr/share/easy-rsa/pki/dh.pem /etc/openvpn/`
gen-dh参数❶创建 Diffie-Hellman 密钥,这可能需要很长时间并产生大量输出。openvpn --gen-key secret❷命令快速生成 HMAC 签名,如果成功,您将不会看到任何输出。这些过程会创建/usr/share/easy-rsa/ta.key和/usr/share/easy-rsa/pki/dh.pem文件。将它们复制到 OpenVPN 配置目录/etc/openvpn/下:
$ `sudo cp /usr/share/easy-rsa/ta.key /etc/openvpn/`
$ `sudo cp /usr/share/easy-rsa/pki/dh.pem /etc/openvpn/`
此时,您已经创建了服务器所需的所有证书和密钥。
创建客户端证书
接下来,您需要创建客户端证书和密钥,以便客户端能够连接到 VPN,这些证书与服务器证书相同,但与每个单独的客户端设备相关。最有效的方法是在服务器上创建所需的文件,而不是在客户端上创建,这样可以避免不必要的设备间文件传输。在 OpenVPN 服务器上,为文件创建一个安全位置:
$ `sudo mkdir -p /etc/openvpn/client-configs/keys/`
导航到easy-rsa目录,为客户端生成新的证书请求,将密钥复制到您刚才创建的目录,并将请求文件安全地复制到您的 CA 服务器,如下所示:
$ `cd /usr/share/easy-rsa/`
$ `sudo ./easyrsa gen-req` ❶ `myclient` `nopass`
$ `sudo cp /usr/share/easy-rsa/pki/private/``myclient``.key \`
` /etc/openvpn/client-configs/keys/`
$ `sudo rsync -ruhP /usr/share/easy-rsa/pki/reqs/``myclient``.req` `user``@``CA_ip``:/tmp/`
系统会要求您为请求输入密码短语;请输入并确保将其保存以供以后参考。系统还会要求您为 VPN 客户端输入公共名称。这个名称需要对每个提供 VPN 访问的客户端不同,因此考虑使用客户端的主机名(例如myclient;将myclient❶更改为您选择的客户端名称)。
在您的证书服务器上,导航到easy-rsa目录:
$ `cd /usr/share/easy-rsa/`
使用客户端的公共名称(例如myclient)导入请求,然后使用client指令签署,而不是您之前使用的server指令:
$ `sudo ./easyrsa import-req /tmp/``myclient``.req` `myclient`
$ `sudo ./easyrsa sign-req client` `myclient`
确认公共名称是否正确,然后输入yes并按回车键完成命令。
最后,将新生成的证书安全地复制回 OpenVPN 服务器:
$ sudo rsync -ruhP /usr/share/easy-rsa/pki/issued/myclient.crt user@vpn_ip``:/tmp/
为了确保 VPN 正常工作,您之前创建的ta.key和ca.crt文件,以及myclient.crt文件,需位于 OpenVPN 服务器上的客户端配置目录中。在您的 VPN 服务器上,将这些文件复制到/etc/openvpn/client-configs/keys/目录:
$ `sudo cp /usr/share/easy-rsa/ta.key /etc/openvpn/client-configs/keys/`
$ `sudo mv /tmp/``myclient``.crt /etc/openvpn/client-configs/keys/`
$ `sudo cp /etc/openvpn/ca.crt /etc/openvpn/client-configs/keys/`
至此,您已创建了连接客户端到 OpenVPN 服务器所需的文件。您可以根据需要多次重复此过程。只需确保每次为新客户端生成文件时,都会将客户端名称从 myclient 更改为其他名称。
配置 OpenVPN
证书服务器设置完成后,您可以配置 OpenVPN 服务器。为此,您将复制一个模板 OpenVPN 配置并根据需要进行修改。
在 OpenVPN 服务器上,将配置模板复制到 OpenVPN 配置目录:
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf /etc/openvpn/
使用文本编辑器打开生成的 server.conf 文件(本示例使用 nano):
$ `sudo nano /etc/openvpn/server.conf`
与任何配置文件一样,打开它并熟悉其内容。您可能会注意到,这些配置文件使用 # 和 ; 来标记注释行。
一旦您对可用选项感到熟悉,您可能会决定更改 VPN 使用的端口或协议。找到以 port 或 proto 开头的行,注意分号用于注释掉未激活的行:
`--snip--`
port 1194
`--snip--`
`;`proto tcp
proto udp
`--snip--`
OpenVPN 可以通过 UDP 或 TCP 运行,但默认使用 UDP,且默认端口为 1194\。不过,您可以让它运行在任何您喜欢的端口上,但如果您做了更改,您需要在后续的命令或文件中也做相应的更改。另外,确保文件中提到的证书和密钥与您在前面的章节中配置的一致:
`--snip--`
ca `ca.crt`
cert `server.crt`
key `server.key`
`--snip--`
当您到达 Diffie-Hellman 部分时,确保文件与您之前创建的文件匹配;配置文件默认列出 dh2048.pem,但您需要将其更改为 dh.pem:
`--snip--`
`#`dh dh2048.pem
`dh dh.pem`
`--snip--`
此外,redirect-gateway 和 dhcp-option DNS 指令不应被注释掉,因此请删除这些行开头的分号:
`--snip--`
push "redirect-gateway def1 bypass-dhcp"
`--snip--`
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
`--snip--`
这些指令确保所有流量都会通过 VPN 而不是不安全的互联网。您可以保留 DNS 的默认设置,或者设置为您希望使用的任何 DNS 服务器,如 Quad9 (9.9.9.9)、Google (8.8.8.8),或者如果您有配置的 Pi-Hole DNS 服务器,可以设置为其地址,正如在 第七章 中描述的那样。
接下来,检查 tls-auth 指令是否设置为 0,并确保没有用分号注释掉,同时确认 cipher 设置为 AES-256-CBC。然后,在 cipher 指令后立即添加一个 auth 指令:
`--snip--`
tls-auth ta.key 0
`--snip--`
cipher AES-256-CBC
`auth SHA256`
`--snip--`
tls-auth 指令确保您之前配置的 HMAC 签名确实会被用于保护 VPN。此处提供了多种加密算法可供选择,AES-256 是一个合理的选择,因为它的加密效果良好且被广泛支持。SHA256 表示用于 HMAC 消息摘要的算法,这意味着计算出的哈希值将是一个 SHA256 哈希,被认为是安全的,并且比其他一些哈希算法更不容易发生哈希冲突。
为了使 VPN 更安全,移除user和group指令中的分号,这样 VPN 服务将以较少的权限运行,并理想地减轻权限提升攻击的风险:
`--snip--`
user nobody
group nogroup
`--snip--`
完成这些更改后,保存并关闭配置文件。
OpenVPN 配置已经完成,但你需要对服务器的网络设置进行一些更改。首先,你必须配置 IP 转发,否则 VPN 不会处理接收到的流量:
$ `sudo sysctl -w net.ipv4.ip_forward=1`
重新加载sysctl以使更改生效,如下所示。
$ `sudo sysctl -p`
net.ipv4.ip_forward = 1
该命令可能会输出在sysctl.conf文件中修改的行。
配置防火墙
这个过程的第一步是找到你 VPN 服务器的公共网络接口;你的服务器可能有多个网络接口,选择错误的接口会导致 VPN 无法正确地将流量路由到互联网:
$ `ip route | grep -i default`
default via 202.182.98.1 dev `ens3` proto dhcp src 202.182.98.40 metric 100
在这个输出中,网络接口被称为ens3,但你的接口可能会不同。ip route显示的默认路由将是你主机的公共网络接口。你需要这个信息来正确配置防火墙。
在大多数防火墙中,你设置规则的顺序是最重要的考虑因素。在 UFW 中,规则是按照以下顺序从规则文件中评估的:首先是before.rules,然后是user.rules,最后是after.rules。防火墙必须正确识别并通过 VPN 流量,因此规则需要放在防火墙配置的顶部。要在 UFW 中做到这一点,打开before.rules文件进行编辑:
$ `sudo nano /etc/ufw/before.rules`
然后,在文件顶部添加这些行,以允许通过你在前述命令中识别的公共网络接口传递 OpenVPN 客户端流量:
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s `10.8.0.0/24`-o `ens3` -j MASQUERADE
COMMIT
网络10.8.0.0/24表示连接到你 VPN 的客户端将被分配的地址。这些地址应该与网络中使用的地址不同。如果你的网络使用192.168.1.x地址,就不要在 VPN 网络中使用192.168.1.x地址。只要你的网络使用的地址不是10.8.0.x,先前的配置就是安全的。
保存并关闭文件。UFW 还需要接受转发的数据包,而不是丢弃它们。你可以通过修改 UFW 配置文件来允许这一点:
$ `sudo ufw default allow FORWARD`
最后,防火墙需要允许 VPN 使用的端口和协议发送和接收流量,以及用于服务器管理的 SSH。根据你在etc/openvpn/server.conf中设置的配置,输入以下命令以允许正确的端口和协议:
$ `sudo ufw allow 1194/udp`
接下来,允许 OpenSSH:
$ `sudo ufw allow OpenSSH`
重启防火墙以使更改永久生效:
$ `sudo ufw disable`
$ `sudo ufw enable`
在防火墙重启时,你的 SSH 连接可能会中断,你可能需要重新登录。
启动 VPN
到此,你准备好启动 VPN 了。使用systemctl来启动 VPN,这是一个用于控制 Ubuntu 服务的工具,传递你的服务器的公共名称:
$ `sudo systemctl start openvpn@``server`
检查 VPN 的状态:
$ `sudo systemctl status openvpn@``server`
如果正常工作,输出应该显示active (running)。
按 Q 返回终端,然后设置 VPN 在服务器启动时自动启动:
$ `sudo systemctl enable openvpn@``server`
你的 VPN 现在应该已经启动并运行,并准备好接收客户端连接。
配置 VPN 客户端
客户端必须配置.ovpn文件才能连接到 VPN 服务器,并通过安全隧道发送和接收流量。如果你有多个客户端需要连接,创建这些配置文件可能会很繁琐,因此我们将使用一个容易重复的程序来为我们完成这项工作。我们将在 OpenVPN 服务器上生成配置文件,然后将这些配置文件传输到相关客户端。
在你的 OpenVPN 服务器上,为客户端配置文件创建一个安全的位置(如/etc/openvpn/client-configs/files/),复制 OpenVPN 提供的另一个模板,并用文本编辑器打开生成的base.conf文件:
$ `sudo mkdir -p /etc/openvpn/client-configs/files/`
$ `sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf \`
` /etc/openvpn/client-configs/base.conf`
$ `nano /etc/openvpn/client-configs/base.conf`
熟悉文件内容。如果你在前面的步骤中更改了端口或协议,请在此文件中进行相同的更改。
`--snip--`
;proto tcp
`proto udp`
`--snip--`
remote `vpn_ip` `1194`
;remote `vpn_ip` `1194`
`--snip--`
同时,取消注释user和group指令:
`--snip--`
user nobody
group nogroup
`--snip--`
注释掉 SSL/TLS 参数:
`--snip--`
`#`ca ca.crt
`#`cert client.crt
`#`key client.key
`--snip--`
注释掉tls-auth指令:
`--snip--`
`#`tls-auth ta.key 1
`--snip--`
将cipher和auth指令设置为在其他配置文件中找到的值:
`--snip--`
`cipher AES-256-CBC`
`auth SHA256`
`--snip--`
最后,在文件末尾添加以下内容:
`--snip--`
key-direction 1
key-direction指令指示客户端在客户端-服务器对中哪一方将提供密钥,因此为 VPN 隧道提供加密。该值可以设置为0或1,但此配置应设置为1,因为这将通过强制客户端-服务器和服务器-客户端通信使用不同的密钥来提供更好的整体安全性。保存并关闭文件。
你可以通过编写并执行脚本来轻松创建客户端配置,将所有这些元素整合在一起。创建一个.sh文件来放置你的脚本,赋予它可执行权限,然后用文本编辑器打开它(此例中使用 nano):
$ `sudo touch /etc/openvpn/client-configs/client_config.sh`
$ `sudo chmod +x /etc/openvpn/client-configs/client_config.sh`
$ `sudo nano /etc/openvpn/client-configs/client_config.sh`
将列表 5-1 中的脚本复制到文件中。
#!/bin/bash
KEY_DIR=/etc/openvpn/client-configs/keys
OUTPUT_DIR=/etc/openvpn/client-configs/files
BASE_CONFIG=/etc/openvpn/client-configs/base.conf
cat ${BASE_CONFIG} \
<(echo -e '<ca>') ${KEY_DIR}/ca.crt \
<(echo -e '</ca>\n<cert>') ${KEY_DIR}/${1}.crt \
<(echo -e '</cert>\n<key>') ${KEY_DIR}/${1}.key \
<(echo -e '</key>\n<tls-auth>') ${KEY_DIR}/ta.key \
<(echo -e '</tls-auth>') > $ {OUTPUT_DIR}/${1}.ovpn
列表 5-1:用于生成客户端配置(.ovpn)文件的脚本
保存并关闭文件。第一行告诉 bash,后续内容是脚本。接下来的三行是变量,如果你的密钥目录、输出目录或基础配置文件和文件夹与本章中的示例不同,可以在此处修改。
按照列表 5-2 中所示,在client-configs目录中执行脚本,客户端名称作为唯一参数。客户端名称应与之前步骤中创建的证书和密钥文件中的名称匹配。要为其他客户端生成配置文件,请确保生成它们的证书和密钥,然后使用这些文件通过列表 5-1 中的脚本为该客户端创建相应的.ovpn文件。别忘了,这涉及到创建证书请求、将其传输到证书服务器签名,然后将其传输回 VPN 服务器,放置在client-configs目录中。
列表 5-2 展示了对myclient客户端执行脚本,并列出了生成文件的命令。
$ `cd /etc/openvpn/client-configs/`
$ `sudo ./client_config.sh` `myclient`
$ `ls -lah /etc/openvpn/client-configs/files/`
total 20
drwxrwxr-x 2 test test 4096 Apr 28 23:22 ./
drwxrwxr-x 4 test test 4096 Apr 28 23:21 ../
-rw-rw-r-- 1 test test 11842 Apr 28 23:22 `myclient``.ovpn`
列表 5-2:执行来自列表 5-1 的脚本
一旦为该客户端创建了.ovpn文件,通过 rsync 将文件下载到本地计算机,然后将其导入到该设备的 OpenVPN 客户端中。
$ `rsync -ruhP` `user@vpn_ip:``/etc/openvpn/client-configs/files/``myclient``.ovpn ./`
OpenVPN 为大多数操作系统提供客户端应用程序,包括 Windows、Linux、macOS、iOS 和 Android。你可以在 OpenVPN 官网找到这些应用:openvpn.net/community-downloads/。
完成后,你现在可以导入.ovpn配置文件,连接到 VPN,并以更私密、更安全的方式上网。如果你计划使用 Linux 客户端连接到 VPN,可以使用以下命令安装 OpenVPN:
$ `sudo apt install openvpn -y`
然后,使用你的配置文件和以下命令连接到 VPN:
$ `sudo openvpn` `myclient``.ovpn`
请参阅“测试你的 VPN”在第 89 页了解更多可以确保 VPN 安全性的测试方法。
20: 使用 Wireguard 创建 VPN
现代版本的 Ubuntu(从 2020 年 3 月开始的版本)已经将 Wireguard 集成到内核中,因此安装和启动非常简单。此时,Wireguard 并未集成到许多网络硬件中,因此你需要手动配置每个端点来连接到它,而不是像配置路由器并通过 VPN 隧道传递所有网络流量那样简单。在这个项目中,你将按照创建云端虚拟机的说明,创建一个 Wireguard 服务器,然后安装和配置 Wireguard。我们将为服务器及任何客户端创建相应的公钥和私钥对,按需配置服务器防火墙,配置并连接客户端,并测试 VPN 以确保它正常工作。只要你连接到 Wireguard VPN,互联网流量就会变得安全可靠。
安装 Wireguard
使用第一章中的项目 3 提供的说明创建一个新的 Ubuntu 服务器。通过 SSH 以标准用户(非 root 用户)登录服务器:
$ `ssh` `user@your_server_IP`
然后,使用apt安装 Wireguard,并指定-y跳过确认提示:
$ `sudo apt install wireguard -y`
接下来,您将创建连接和加密 VPN 所需的公钥和私钥。
设置密钥对
由于您即将创建的文件或文件夹具有敏感性,建议比平常更加严格地设置权限。您可以运行以下命令,确保只有文件的所有者可以读取和写入该文件:
$ `umask 077`
这个umask命令在退出终端会话后不会持续有效,但仅允许文件和文件夹的所有者在此会话中读取和写入您创建的文件和文件夹。
现在,使用wg genkey命令创建私有的 Wireguard 密钥:
$ `wg genkey | sudo tee /etc/wireguard/private.key`
终端中显示的输出是您的私钥,它将存储在命令指定的private.key文件中。请勿共享此密钥。像对待密码一样对待它——它是您 VPN 安全的保障。
创建私钥后,您需要一个相应的公钥提供给您的客户端,以便他们可以进行服务器身份验证:
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
该命令首先使用cat读取private.key文件的内容。然后,wg pubkey命令使用私钥生成公钥。公钥随后输出到终端并保存到public.key文件中。
现在您已经拥有公钥/私钥对,可以配置您的 VPN 服务器和客户端。
配置 Wireguard
Wireguard 需要一个配置文件才能运行。安装 Wireguard 时并不会创建此文件,因此您需要从头开始创建一个。使用文本编辑器创建并打开/etc/wireguard/wg0.conf文件:
$ `sudo nano /etc/wireguard/wg0.conf`
将以下内容添加到文件中:
`[Interface]`
`PrivateKey =` `your_private_key`
`Address =` `10.8.0.1/24`
`ListenPort =` `26535`
`SaveConfig = true`
将your_private_key替换为您之前创建的私钥。您的密钥将是/etc/wireguard/private.key文件的内容。地址将是您希望 VPN 客户端连接到服务器时分配的子网地址;确保该子网与您的私有网络不同。例如,如果您在网络中使用192.168.1.x地址,则避免在 VPN 中使用192.168.1.x地址。监听端口应该是 1025 到 65535 之间的任意端口,随机选择。这个端口是您的服务器和客户端用来通信的端口。完成后,保存并退出配置文件。
此时,服务器的网络设置需要一些修改。使用以下命令配置 IP 转发,使 VPN 能够转发其接收到的流量,然后重启sysctl以使更改生效:
$ `sudo sysctl -w net.ipv4.ip_forward=1`
$ `sudo sysctl -p`
接下来,你需要配置防火墙以允许 VPN 流量进入和离开服务器。
配置防火墙
在本节中,我们将讨论 简单防火墙(UFW) 的使用,这是 Ubuntu 内置的防火墙,旨在简化防火墙配置。要配置防火墙,首先需要识别 VPN 的正确网络接口。指定错误的接口将导致 VPN 无法正常工作。输入以下命令来查找服务器的默认网络接口:
$ `ip route | grep -i default`
default via 172.16.90.1 dev `ens33` proto dhcp metric 100
在此输出中,网络接口名为 ens33(你的可能不同)。ip route 显示的 默认路由 将是你主机的公共网络接口。你需要这个信息来正确配置防火墙。
接下来,通过再次使用文本编辑器打开 /etc/wireguard/wg0.conf 文件,并将 ens33 替换为你的网络接口名,向 Wireguard 配置文件的底部添加以下规则:
$ `sudo nano /etc/wireguard/wg0.conf`
`--snip--`
SaveConfig = true
`PostUp = ufw route allow in on wg0 out on` `ens33`
`PostUp = iptables -t nat -I POSTROUTING -o` `ens33` `-j MASQUERADE`
`PreDown = ufw route delete allow in on wg0 out on` `ens33`
`PreDown = iptables -t nat -D POSTROUTING -o` `ens33` `-j MASQUERADE`
保存并关闭文件。这允许 Wireguard 在启动后和停止前修改防火墙配置,以便 VPN 正常工作。
此外,你需要允许通过你在本章早些时候配置的监听端口(示例中的端口为 26535)进行流量传输:
$ `sudo ufw allow` `26535``/udp`
接下来,允许 OpenSSH:
$ `sudo ufw allow ssh`
最后,更新规则后,你需要禁用并启用 UFW 以重新加载规则(你的 SSH 会话可能会被中断,你可能需要重新登录):
$ `sudo ufw disable`
$ `sudo ufw enable`
至此,你的防火墙配置已经完成。
识别 DNS 服务器
为了确保你的互联网流量安全,VPN 需要正确配置 DNS,以防止 DNS 泄漏,因为这可能会危及你的安全。为了解决这个问题,你将强制 Wireguard VPN 使用 Wireguard 服务器本身使用的 DNS。通过以下命令识别该 DNS 服务器:
$ `resolvectl dns ens33`
结果输出是你稍后在此项目中将提供给客户端的 DNS 地址——记下来。
启动 VPN
理想情况下,VPN 应该在服务器启动时自动启动并准备好接受客户端连接。你可以通过使用 systemctl 创建并启动 Wireguard 系统服务来实现这一点:
$ `sudo systemctl enable wg-quick@wg0.service`
$ `sudo systemctl start wg-quick@wg0.service`
完成后,检查状态以确保 Wireguard 正在运行:
$ `sudo systemctl status wg-quick@wg0.service`
如果正常工作,输出应该显示 active。如果服务未激活或状态为失败,仔细检查配置文件和防火墙状态,确保配置中没有拼写错误或其他问题。
配置 VPN 客户端
Wireguard 为 Windows、macOS、Android 和 iOS 提供了官方客户端应用程序——它们的设置过程大致相同。Linux 客户端的设置稍微复杂一些,但如果你已经成功配置了 Wireguard 服务器,配置 Linux 客户端应该非常熟悉。
Windows、macOS、Android 或 iOS 客户端配置
要在任何这些操作系统上配置客户端,请按照以下步骤操作:
-
1. 从
www.wireguard.com/install/下载并安装相关客户端程序。 -
2. 在客户端界面中,点击 + 或 添加隧道▸添加空隧道 来从头创建一个新的 VPN 配置文件。
-
3. 请注意,客户端的公钥和私钥将显示出来。
-
4. 在名称字段中提供一个友好的名称。
-
5. 忽略任何按需设置或勾选框。
-
6. 在配置文件中添加以下详细信息,位于客户端自动生成的 PrivateKey 下方:
`--snip--` `Address =` `10.8.0.2` `DNS =` `108.61.10.10` `[Peer]` `PublicKey =` `server_public_key` `AllowedIPs =` `0.0.0.0/0` `Endpoint =` `server_public_ip:listening_port`Address是您希望客户端在 VPN 子网中使用的 IP 地址,每个 VPN 客户端的地址应该不同。DNS应该是您在 “识别 DNS 服务器”中确定的 DNS 服务器的 IP 地址,详见 第 85 页。PublicKey是您在之前的过程中为 Wireguard 服务器创建的公钥。AllowedIPs是用于 分割隧道 的设置;列在此指令中的网络或地址之间的流量将通过 VPN 隧道传输,其他所有流量则会直接出去,绕过 VPN。将其设置为0.0.0.0/0将使所有来自客户端的流量都通过 VPN 传输。Endpoint是您的 VPN 服务器的公共 IP 地址,后跟您之前指定的监听端口(在示例中为 26535)。 -
7. 保存配置。
-
8. 在 Wireguard 服务器上停止 Wireguard 服务,注意此操作会导致当前连接的用户出现停机,使用以下命令:
$ `sudo systemctl stop wg-quick@wg0.service` -
9. 使用文本编辑器打开 /etc/wireguard/wg0.conf 配置文件:
$ `sudo nano /etc/wireguard/wg0.conf` -
10. 将客户端的详细信息添加到配置文件的底部,请记住,每个添加的对等端都需要在此文件中添加自己的 [Peer] 部分:
`--snip--` `[Peer]` `PublicKey =` `client_public_key` `AllowedIPs =` `10.8.0.2`这个
PublicKey实例是由客户端应用程序为您的 Wireguard 客户端创建的公钥。在文件的[Peer]部分,AllowedIPs指定了允许通过 VPN 隧道发送流量的 IP 地址。将其设置为您希望客户端在 VPN 网络上使用的特定主机 IP,必须与您在客户端配置中为此对等端配置的 IP 相匹配。 -
11. 保存并关闭文件。
-
12. 启动 Wireguard 服务,并再次检查状态是否为
active:$ `sudo systemctl start wg-quick@wg0.service` $ `sudo systemctl status wg-quick@wg0.service`返回您的客户端,激活 VPN 连接。成功连接后,ping 您的 Wireguard 服务器的 VPN 地址(例如 10.8.0.1):
$ `ping 10.8.0.1` PING 10.8.0.1 (10.8.0.1): 56 data bytes 64 bytes from 10.8.0.1: icmp_seq=0 ttl=57 time=43.969 ms 64 bytes from 10.8.0.1: icmp_seq=0 ttl=57 time=43.969 ms 64 bytes from 10.8.0.1: icmp_seq=0 ttl=57 time=43.969 ms 64 bytes from 10.8.0.1: icmp_seq=0 ttl=57 time=43.969 ms --- 10.8.0.1 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 43.969/43.969/43.969/0 ms成功的结果表示您的 VPN 连接在客户端和服务器之间工作正常。对任何额外的客户端,重复此过程。
Linux 客户端
配置 Linux 客户端,按照以下步骤进行操作:
-
1. 安装 Wireguard 和 resolvconf(用于 DNS 配置):
$ `sudo apt install wireguard resolvconf -y` -
2. 为客户端生成公钥/私钥对:
$ `wg genkey | sudo tee /etc/wireguard/private.key` $ `sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee \` ` /etc/wireguard/public.key` -
3. 创建 Wireguard 客户端配置文件:
$ `sudo nano /etc/wireguard/wg0.conf` `[Interface]` `PrivateKey =` `client_private_key` `Address =` `10.8.0.3` `DNS =` `108.61.10.10` `[Peer]` `PublicKey =` `server_public_key` `AllowedIPs =` `0.0.0.0/0` `Endpoint =` `server_public_ip:listening_port` -
4. 保存并关闭文件。
-
5. 在 Wireguard 服务器上停止 Wireguard 服务:
$ `sudo systemctl stop wg-quick@wg0.service` -
6. 使用文本编辑器打开 /etc/wireguard/wg0.conf 配置文件:
$ `sudo nano /etc/wireguard/wg0.conf` -
7. 将客户端详细信息添加到配置文件的底部:
`--snip--` `[Peer]` `PublicKey =` `client_public_key` `AllowedIPs =` `10.8.0.3`此处的
PublicKey是由客户端应用程序为你的 Wireguard 客户端生成的公钥。在文件的[Peer]部分,AllowedIPs指的是允许通过 VPN 隧道发送流量的 IP 地址。将其设置为你希望客户端在 VPN 网络中拥有的特定主机 IP。 -
8. 保存并关闭文件。
-
9. 启动 Wireguard 服务并仔细检查状态是否为“活动”:
$ `sudo systemctl start wg-quick@wg0.service` $ `sudo systemctl status wg-quick@wg0.service`返回客户端,使用以下命令激活 VPN 连接:
$ `wg-quick up wg0`成功连接后,ping 你的 Wireguard 服务器的 VPN 地址(例如 10.8.0.1)。如果测试成功,表示你的 VPN 连接在客户端和服务器之间正常工作。要断开 Linux 客户端与 VPN 服务器的连接,可以使用以下命令:
$ `wg-quick down wg0`对任何其他要添加的客户端重复此过程。
测试你的 VPN
无论你选择了哪个 VPN,都可以通过像 www.whatismyip.com/ 这样的网站,在未连接 VPN 时找到你的公共 IP 地址。完成后,连接到 VPN 并刷新页面。此时,你的公共 IP 地址应该变成 VPN 服务器的 IP 地址。另一个测试 VPN 的方法是使用像 dnsleaktest.com/ 这样的服务。进行标准测试后,你应该能清楚地看到 VPN 配置是否存在问题。如果你的实际公共 IP 地址被隐藏,并且 DNS 泄漏测试只显示了你配置的 DNS 服务器,那么说明你已成功搭建了自己的私人 VPN 服务器。
总结
将多个客户端连接到你的 OpenVPN 或 Wireguard 服务器将允许它们之间的流量像在同一网络上一样传递。这意味着你可以轻松地通过同时将多个设备连接到你的 VPN,来远程管理这些设备。本章讲解了如何搭建你自己的私人 VPN,使用 OpenVPN 或更加轻量、快速的 Wireguard,给你完全的控制权。通过连接到 VPN,你的私人互联网流量将变得真正安全和私密。
第六章:# 使用 Squid 代理提升浏览和隐私保护

代理服务器充当你与互联网之间的中介。当你请求一个网页时,代理会接收请求并将其转发到 Web 服务器(如果需要)。代理允许你通过模糊化通常可以向我们日常互动的服务提供的元数据,来保护你的隐私。代理还允许管理员屏蔽某些内容,如社交媒体或在线赌博。
本章将向你展示如何安装、配置和使用Squid 代理,这是一种可以在大多数操作系统上运行的解决方案。通过使用 Squid,你将能够加速网站访问,增强安全性,并允许或禁止访问特定的域名或网站。第七章介绍了另一种代理解决方案,Pi-Hole,它提供与 Squid 相同的好处,但额外地能够阻止广告并解决其他追踪和隐私问题。选择最适合你需求的代理,取决于你觉得哪一种更易于使用,以及哪一种提供了最佳的用户体验。
为什么使用代理?
每次你访问一个网站时,你的计算机会向 Web 服务器发送请求,服务器响应并向你提供浏览该网站所需的信息。浏览器与服务器之间的通信可能会通过元数据暴露你的个人信息(如你使用的浏览器、你的公共 IP 地址等)。这些元数据使得 Web 服务器能够推测出你和你的设备的一些信息,例如你的位置、你所在时区的时间以及你的浏览习惯。出于多种原因,你可能希望保持这些信息的隐私性。此外,加载网页及其内容会消耗带宽,因此当越来越多的人使用同一个互联网连接时,连接可能会开始变慢,从而影响到所有使用者。
代理的一个伟大之处在于它们会缓存所有通过它们的流量。这意味着每次检索网页时,代理会保留该页面的本地副本。下次有人尝试浏览该网站时,代理首先检查其缓存中是否有副本,如果有,它会向用户呈现该副本,而不是向 Web 服务器发送请求获取页面的新副本。默认情况下,Squid 会将网站的缓存副本保留一段时间,之后当缓存被认为“不再新鲜”时,它会重新获取该页面的最新版本,无论内容是否发生变化。这减少了网络负载、加载频繁访问网站的时间以及总的带宽使用量,从而提高了每个人的体验。
代理还减少了向网页服务器泄露的个人身份信息(PII)的数量。PII 是任何可以用来识别特定个人(例如你)的数据或信息。例如,代理可以将自己标识为任何网页浏览器,虽然你可能使用的是 Google Chrome,但代理可以向服务器呈现 Firefox。代理还可以拥有一个不同的公共 IP 地址来隐藏你正在使用的地址,如果它位于你所在的地方以外(例如云端),则能模糊你的物理位置和互联网服务提供商。
即使这与小型网络管理员直接相关性不大,你可能会感兴趣的是,商业组织通常依赖代理(包括 Squid),以便利用我们已经讨论的好处,以及内容交付,如流媒体音频和视频。内容提供商,如 Netflix 和 YouTube,战略性地在全球范围内部署代理服务器,以保留本地内容副本。这种做法使得这些服务的用户可以从离家更近的地方访问内容,而不是所有用户都从单一位置访问内容,这样会更有效,并且避免在很多情况下出现性能差的问题。
21: 配置 Squid
Squid 网络代理提供了你刚刚学习到的所有好处:它减少了带宽,使用户的上网速度更快。如果配置正确,它还能够匿名化你的个人信息;例如,你的身份信息(如网络请求来自哪里或者你使用的网页浏览器)可以在流量发送到互联网之前被删除或更改。许多企业级设备都使用 Squid。虽然你也可以使用其他代理解决方案,如 NGINX、Apache Traffic Server 或 Forcepoint,但 Squid 是免费的开源软件,因此相比商业解决方案,它提供了更多对底层配置和数据的访问。
网上有大量关于使用 Squid 保护和增强网络的信息。你可以在 Squid 的维基上找到更多关于 Squid 代理配置的信息,链接地址是 wiki.squid-cache.org/SquidFaq/。
本项目将涵盖 Squid 的初始安装和配置,配置你网络中的客户端使用代理,配置完成后测试代理,以及执行一些额外步骤,以通过代理允许或拒绝访问某些互联网资源。
配置 Squid
按照第一章中的步骤创建一个基础的 Ubuntu 服务器。如果你想隐藏自己的位置或不希望泄露你的互联网服务提供商(除了防止记录你的元数据),可以在云端的一个与自己国家不同的国家创建代理服务器。否则,可以将代理服务器部署在你自己的网络内。不要忘记将新服务器添加到你在前几章中创建的网络地图和资产列表中。完成后,通过 SSH 以标准非 root 用户登录服务器。要安装代理,使用以下命令:
$ `sudo apt install squid`
安装应该在一分钟内完成。默认情况下,你会找到配置文件位于/etc/squid/squid.conf,日志文件位于/var/log/squid/,缓存数据(即缓存的网站信息)位于/var/spool/squid/。
使用文本编辑器打开squid.conf配置文件,以熟悉其中的设置:
$ `sudo nano /etc/squid/squid.conf`
Squid 有许多可能的配置,所以很容易让人感到不知所措。不过请注意,许多设置并未启用,因为它们默认被注释掉了。我们先专注于活动设置。当你的代理服务器按预期工作时,你可以再探索其他更改。
通过按 CTRL-W 进行搜索;然后输入搜索词并按 ENTER 找到标有Recommended minimum configuration的部分:
`--snip--`
# Recommended minimum configuration:
#
# Example rule allowing access from your local networks.
# Adapt to list your (internal) IP networks from where browsing
# should be allowed
acl `localnet src` 0.0.0.1-0.255.255.255 # RFC 1122 "this" network (LAN)
acl `localnet src` 10.0.0.0/8 # RFC 1918 local private network (LAN)
`--snip--`
本节详细介绍了访问控制列表(ACLs),它告诉 Squid 哪些端点可以通过代理服务器访问互联网资源。ACL 是一个包含你特别允许或禁止在网络中进行通信的端口、地址或资源的列表。
一个 ACL 由多个元素组成。首先是一个唯一的名称,例如localnet,用于标识一个特定的 ACL。每个命名的 ACL 接着包含一个 ACL 类型(例如src),后面跟着一个值或值的列表,如 IP 地址或端口号。这些值可以跨多行输入,Squid 会将它们合并成一个单一的列表。
src这样的关键词告诉 Squid 流量的流向;例如,src 10.0.0.0/8表示来自10.0.0.0/8 IP 地址范围内的任何流量,目的地是任何 IP 地址的任何范围。
注释掉不适用于你网络的任何行。例如,如果你的内部 IP 地址遵循10.x.x.x格式,保留相关指令不变,并通过在每行开头添加#来注释掉所有其他以acl localnet src开头的行:
--snip--
acl localnet src 0.0.0.1-0.255.255.255 # RFC 1122 "this"网络(LAN)
acl localnet src 10.0.0.0/8 # RFC 1918 本地私有网络(LAN)
#acl localnet src 100.64.0.0/10 # RFC 6598 共享地址空间(CGN)
#acl localnet src 169.254.0.0/16 # RFC 3927 链路本地机器
#acl localnet src 172.16.0.0/12 # RFC 1918 本地私有网络(LAN)
#acl localnet src 192.168.0.0/16 # RFC 1918 本地私有网络(LAN)
#acl localnet src fc00::/7 # RFC 4193 本地私有网络范围
#acl localnet src fe80::/10 # RFC 4291 链路本地机器
--snip--
推荐的最小配置部分的第二部分告诉 Squid 哪些端口可以发送和接收流量:
`--snip--`
acl SSL_ports port 443
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 # https
`#`acl Safe_ports port 70 # gopher
`#`acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
`#`acl Safe_ports port 280 # http-mgmt
`--snip--`
在这里,SSL_ports 和 Safe_ports 是 ACL 名称,而 port 类型告诉 Squid 将后面的数字解释为特定服务用于通信的端口号(请参见 第一章)。acl SSL_ports port 443 行设置了代理用于加密过滤隧道的端口,如 HTTPS 流量所使用的端口。包含 Safe_ports 标签的指令决定了 Squid 应该允许连接的端口。如果您不需要某个协议或端口,可以注释掉以减少攻击面。为了谨慎起见,您可以只保留端口 80 和 443,并注释掉 acl Safe_ports port 1025-65535 行,从而阻止 1025 到 65535 之间的端口。然而,这样做可能会导致某些应用程序或服务无法正常工作,如果它们需要其他端口。您可以使用 Google 以及给定应用程序的官方网站或手册来确定它可能需要哪些其他端口才能正常运行。
在配置文件的稍后部分,您会找到启用这些 ACL 的指令:
`--snip--`
# Recommended minimum Access Permission configuration:
#
# Deny requests to certain unsafe ports
http_access deny !Safe_ports
# Deny CONNECT to other than secure SSL ports
http_access deny CONNECT !SSL_ports
`--snip--`
http_access deny !Safe_ports 指令告诉 Squid 禁止除 Safe_ports 列表中列出的端口以外的所有端口之间的通信。同样,http_access deny CONNECT !SSL_ports 行告诉 Squid 禁止在除 SSL_ports 中指定的端口之外的任何端口上建立过滤隧道。
配置文件的下一部分与您的本地网络相关,而不是互联网:
`--snip--`
# Example rule allowing access from your local networks.
# Adapt localnet in the ACL section to list your (internal) IP networks
# from where browsing should be allowed
`#http_access allow localnet`
http_access allow localhost
# And finally deny all other access to this proxy
http_access deny all
`--snip--`
删除 # 符号以启用之前指定的 localnet 设置,该设置允许您本地网络上的终端通过代理访问互联网。最后,http_access deny all 确保代理拒绝所有其他流量,以防影响您的内部网络。通过拒绝所有没有明确允许的流量,您将保护网络免受不必要的流量,包括恶意软件。
如果您想更改 Squid 监听请求的端口,请在配置文件中修改以下行:
`--snip--`
# Squid normally listens to port 3128
http_port `3128`
`--snip--`
您的设备将使用此端口连接到代理服务器,以便发送请求、接收流量并浏览互联网。
完成编辑后,保存并关闭配置文件。使用以下命令重新加载更新后的 Squid 配置,以使更改生效(请注意,重新加载配置可能会中断任何打开的连接):
$ `sudo systemctl reload squid`
现在,您可以使用以下命令确认 Squid 是否成功启动并正在运行:
$ sudo systemctl status squid
squid.service - Squid Web 代理服务器
已加载: 加载 (/lib/systemd/system/squid.service; 已启用; 供应商预设: 已启用)
活动: active (running); 2 分钟 5 秒前
--snip--
在squid.service前有一个绿色点并且状态显示active (running),表示 Squid 正常运行。如果 Squid 由于错误未能正确启动,你会看到一个失败的消息,squid.service前有一个红点:
$ sudo systemctl status squid
squid.service - Squid Web 代理服务器
已加载: 加载 (/lib/systemd/system/squid.service; 已启用; 供应商预设: 已启用)
活动: 失败 (结果: 退出代码); 2 分钟 5 秒前
--snip--
返回并再次检查你的配置,或者使用以下命令验证你的配置文件:
$ squid -k parse
2024/05/06 00:44:06| 处理: acl 拒绝列表 dstdomain .twitter.com
2024/05/06 00:44:06| 处理: http_deny 拒绝列表
2024/05/06 00:44:06| /etc/squid/squid.conf:1406 无法识别: 'http_deny'
2024/05/06 00:44:06| 处理: anonymize_headers 拒绝 From Referer Server
2024/05/06 00:44:06| /etc/squid/squid.conf:1408 无法识别: 'anonymize_headers'
2024/05/06 00:44:06| 处理: anonymize_headers 拒绝 User-Agent WWW-Authenticate
2024/05/06 00:44:06| /etc/squid/squid.conf:1409 无法识别: 'anonymize_headers'
2024/05/06 00:44:06| 处理: http_access 允许 localnet
--snip--
此输出显示的是如果你使用无法识别的指令http_deny和anonymize_headers时的情况。当你解决了配置中的任何错误后,使用start命令启动 Squid:
$ `sudo systemctl start squid`
现在,你已经完成了基本的 Squid 代理配置。
配置设备使用 Squid
接下来,你需要在每个将使用代理的设备上配置代理设置。我们将解释如何配置 Windows、macOS 和 Linux 设备。
Windows
-
1. 在你的 Windows 主机上,打开Windows 设置对话框。
-
2. 在查找设置框中,搜索代理设置。
-
3. 在代理窗口中启用使用代理服务器开关。
-
4. 输入你的代理服务器的 IP 地址和端口——例如,192.168.1.50:3128。
-
5. 确保勾选不为本地(内网)地址使用代理服务器复选框。
macOS
-
1. 打开系统偏好设置。
-
2. 选择网络并选择你的无线或以太网适配器。
-
3. 点击高级▸代理。
-
4. 勾选Web 代理 (HTTP)框。输入你的代理服务器的 IP 地址和端口号——例如,192.168.1.50:3128。对于之前在/etc/squid/squid.conf文件中配置的每个协议都执行此操作。
-
5. 将你的本地网络输入到“为这些主机和域绕过代理设置”框中。
-
6. 点击确定然后应用。
Linux
-
1. 在你的 Linux 端点上,打开设置对话框。
-
2. 进入网络▸网络代理设置。
-
3. 设置代理为手动,并输入 HTTP 代理的 IP 地址和端口号——例如,192.168.1.50:3128。
-
4. 确保在忽略主机框中输入你的本地网络,然后关闭任何打开的设置窗口。
测试 Squid
在配置好 Squid 服务器并确保至少有一台设备使用代理的情况下,确保设备实际在使用代理,并且代理按预期工作。在 Squid 服务器上,使用以下命令查看 Squid 代理日志文件的实时更新:
$ `sudo tail -f /var/log/squid/access.log`
`--snip--`
1619747519.519 54 172.16.90.1 TCP_TUNNEL/200 39 CONNECT play.google.com:443 - HIER_DIRECT/172.217.25.174 -
1619747519.755 54 172.16.90.1 TCP_TUNNEL/200 39 CONNECT mail.google.com:443 - HIER_DIRECT/216.58.200.101 -
1619747519.776 55 172.16.90.1 TCP_TUNNEL/200 39 CONNECT mail.google.com:443 - HIER_DIRECT/216.58.200.101 -
1619747520.190 161 172.16.90.1 TCP_MISS/200 985 GET
`--snip--`
你的输出将根据你在网络中使用的应用程序不同而有所不同。
如果没有任何输出(并且你的主机无法浏览互联网),请按照第三章中的步骤更新你的 iptables 或其他防火墙规则,以允许流量进出 Squid 代理服务器的 3128 端口(或你配置的 Squid 监听端口)。
如果你在运行tail命令时从配置为使用代理服务器的主机访问 Facebook,你应该能在日志中看到此请求作为多个访问 Facebook 服务的请求:
--snip--
1584414232.470 3 192.168.1.51 NONE/503 0 CONNECT pixel.facebook.com:443 - HIER_NONE/- -
1584414237.647 0 192.168.1.51 NONE/503 0 CONNECT pixel.facebook.com:443 - HIER_NONE/- -
1584414242.652 0 192.168.1.51 NONE/503 0 CONNECT pixel.facebook.com:443 - HIER_NONE/- -
1584414247.864 69023 192.168.1.51 TCP_TUNNEL/200 6426 CONNECT static.xx.fbcdn.net:443 - HIER_DIRECT/157.240.8.23 -
1584414248.566 0 192.168.1.51 NONE/503 0 CONNECT pixel.facebook.com:443 - HIER_NONE/- -
1584414254.535 0 192.168.1.51 NONE/503 0 CONNECT pixel.facebook.com:443 - HIER_NONE/- -
--snip--
如果没有,尝试重启代理服务器、主机或两者。
阻止和允许域名
现在你的代理服务器正常工作,你可能想要阻止(黑名单)或允许(白名单)一些域名。例如,如果你有孩子,你可能希望防止他们访问分散注意力或不适当的网站。为此,打开 squid.conf 文件并使用文本编辑器编辑:
$ `sudo nano /etc/squid/squid.conf`
现在,找到那行注释,内容为 INSERT YOUR OWN RULE(S) HERE。在该部分,你可以定义自己的规则(即 ACL)。如前所述,ACL 由 ACL 名称、如 allow 或 deny 的 ACL 类型以及 IP 地址或域名等元素列表组成。你的配置将由一个或多个这样的规则组成,标识哪些是允许通过代理的,哪些是不允许的。(之前,你启用了类似 http_access allow localnet 和 http_access deny !Safe_ports 这样的规则,以使用推荐的最小配置部分中的 ACL。)
例如,要将 Facebook 加入黑名单,在 include 指令后输入以下行:
`--snip--`
include /etc/squid/conf.d/*
`acl denylist dstdomain .facebook.com`
`http_access deny CONNECT denylist`
`--snip--`
行首的acl指令告诉 Squid 将接下来的内容视为允许或拒绝的项目列表。接下来,denylist是该列表的唯一名称;可以选择任何名称,只要它由字母数字字符组成。dstdomain指令表示接下来是一个目标域名的列表。域名前的句点告诉 Squid 应当将整个域名,包括子域名,列入 denylist。例如,www.facebook.com是一个顶级域名,可能有子域名如campus.facebook.com或hertz.facebook.com。如果省略前导句点,Squid 将仅阻止父域名(facebook.com)。最后,http_access指令与deny和CONNECT参数一起使用,告诉代理禁止连接到 ACL 中指定的域名或 URL。
保存配置文件并重新加载 Squid 以使更改生效:
$ `sudo systemctl reload squid`
现在,尝试从配置为使用代理服务器的主机浏览到www.facebook.com。你应该看到类似于图 6-1 的错误页面。

图 6-1:Squid 引起的 Web 浏览器错误
若要重新允许访问 Facebook,可以删除或注释掉你所添加的行,保存配置文件并重新加载 Squid。
你可以通过将额外的域名添加到相同的 denylist ACL 中来重复这个过程:
acl denylist dstdomain `.facebook.com .twitter.com .linkedin.com`
另外,你可以根据需要为每个网站或网站的组或类别创建单独的 ACL。
允许列表的工作方式基本相同;任何添加到允许列表中的域名都会被允许,但仅限于已通过代理认证的用户:
`--snip--`
include /etc/squid/conf.d/*
acl `allowlist` dstdomain .facebook.com .twitter.com .linkedin.com
`http_access allow CONNECT allowlist`
`--snip--`
如果你添加新的 ACL 规则,请注意它们在配置文件中彼此的位置。Squid 会按照规则出现的顺序解释 ACL 规则,就像防火墙一样。如果在 ACL 规则列表的开头有一个deny all规则,Squid 会首先解释此规则,然后忽略文件中的其他规则。这意味着你应该将任何自定义规则放在以下几行之前:
`--snip--`
# And finally deny all other access to this proxy
http_access deny all
`--snip--`
使用 Squid 保护个人信息
Squid 具有高度的可配置性,允许你作为管理员设置希望在互联网上暴露多少关于用户及其设备的信息。默认情况下,通过代理从客户端设备传输到互联网的流量不会进行匿名化处理。
为了防止网络外部人员知道你的流量来源(也就是服务器信息,或者你可能被引导到哪个网站或资源,例如 Amazon 或博客),使用 request_header_access 指令来拒绝这些信息:
`--snip--`
include /etc/squid/conf.d/*
`request_header_access From deny all`
`request_header_access Referer deny all`
`request_header_access Server deny all`
`--snip--`
为了进一步匿名化你的流量,明智之举是也拒绝 User-Agent、WWW-Authenticate 和 Link 头部信息,这些信息可能会泄露关于你的浏览器或浏览活动的附加信息:
`--snip--`
include /etc/squid/conf.d/*
request_header_access From deny all
request_header_access Referer deny all
request_header_access Server deny all
`request_header_access User-Agent deny all`
`request_header_access WWW-Authenticate deny all`
`request_header_access Link deny all`
`--snip--`
使用这些选项匿名化你的流量将限制你在互联网上发送的个人身份信息(PII)量,使你更难被追踪,并在一定程度上保护你的浏览历史和习惯。
注意,某些网站和服务使用用户代理来决定如何向用户展示内容,因此要注意,移除头部信息可能会导致你体验到不同的内容。
禁用特定网站的缓存
可能有一些你不希望 Squid 缓存的网站,因为你总是希望从 Web 服务器获取最新版本,而不是从代理缓存中获取。可以通过拒绝缓存该网站或多个网站来实现:
`--snip--`
include /etc/squid/conf.d/*
`acl deny_cache dstdomain .facebook.com`
`no_cache deny deny_cache`
`--snip--`
记得为每个你希望防止 Squid 创建并保留缓存副本的网站添加 ACL 条目。
Squid 代理报告
你可能已经注意到,Squid 日志可能比较难以阅读,需要一定的适应时间。有一些第三方解决方案可以让活动报告和日志查看变得更加容易。其中一个较为简单的解决方案是 Squid 分析报告生成器(SARG)。SARG 是一个基于 Web 的报告生成器和查看器,可以让你在浏览器窗口中查看 Squid 日志,而不是通过终端查看。
在你的 Squid 服务器上,安装 SARG:
$ `sudo apt install sarg`
SARG 报告文件将通过 Web 浏览器访问,因此你还需要安装一个 Web 服务器。安装 Apache:
$ `sudo apt install apache2`
接下来,打开应该位于 /etc/sarg/sarg.conf 的 SARG 配置文件:
$ `sudo nano /etc/sarg/sarg.conf`
找到以 access_log 开头的行,该行指定了 Squid 访问日志的位置:
`--snip--`
access_log /var/log/squid/access.log
`--snip--`
然后,关闭文件,并使用 find 命令确认它与日志文件的实际位置匹配:
$ `sudo find / -name access.log`
/var/log/squid/access.log
在文本编辑器中打开文件,找到输出目录标签(以 output_dir 开头的行),注释掉包含 /var/lib/sarg 的行,并将其替换为一行,设置目录为 Apache Web 位置 /var/www/html/squid-reports/:
`--snip--`
`#`output_dir /var/lib/sarg
`output_dir /var/www/html/squid-reports/`
`--snip--`
保存并关闭文件。如果你愿意,可以浏览其他设置。
要生成 SARG 报告,在你的 Squid 服务器上运行以下命令:
$ `sudo sarg -x`
在你的 Web 浏览器中,导航到代理服务器上的报告位置: http://<proxy_ip_address>/squid-reports。你应该能看到一个基本的网站,如 图 6-2 所示。

图 6-2:SARG 报告摘要
点击显示页面上的相关报告,您应该会看到有关每个通过代理连接的用户的信息,包括每个连接传输了多少数据,连接持续了多长时间,以及一个时间戳,指示连接建立的时间,如图 6-3 所示。

图 6-3:SARG 报告输出
报告显示了使用代理的用户或主机,他们发送和接收的流量水平(以字节表示);以及有关代理使用的其他有用信息。报告中还包含了子报告的链接,如通过代理访问的前站点;站点与用户报告,列出每个站点的访问情况以及访问该站点的用户或主机;以及任何根据您提供的规则和配置被代理拒绝的缓存或网站访问。
尝试使用您的新代理服务器几个星期,看看它是否有助于改善带宽使用和浏览速度。一旦您感到舒适,您可以调查并开始尝试代理的更多高级功能,例如防止用户下载大文件(如果您的互联网服务提供商有数据限制并且对带宽收费,建议采取此措施)。
总结
使用像 Squid 这样的代理服务器,您可以更好地控制网络中允许进出数据的内容。您将能够控制从您的端点(例如您正在使用的网页浏览器)暴露的个人身份信息(PII),从而提高网络的在线隐私保护。代理服务器还提供更好的整体浏览体验。
第七章:# 阻止互联网广告

公司通过广告实现互联网盈利,这导致了在线广告的数量激增(更准确地说,是爆炸式增长)。这些广告随着时间的推移变得更加隐蔽,因为网站会跟踪你的活动,以显示最有可能促成购买的广告。更糟糕的是,广告使得互联网连接变慢,因为网站因自动播放广告而变得臃肿。
你可以通过多种方式阻止来自网络的广告。本章将首先讨论各种浏览器广告拦截解决方案。然后,我们将使用 Pi-Hole 构建一个广告拦截 DNS 代理服务器,以为用户提供更好的浏览体验,同时提高数据和隐私保护。
浏览器级广告拦截
大多数现代浏览器都有某种形式的内置广告拦截技术。默认情况下,一些浏览器会阻止各种跟踪器和脚本按设计运行。这些包括社交媒体跟踪器、Cookies、指纹识别器和加密矿工。阻止社交媒体跟踪器意味着像 Facebook、Twitter 和 LinkedIn 等网站无法在你浏览包含社交媒体按钮或即时分享链接的网站时进行跟踪。Cookies是网站用来跟踪信息和用户偏好的文件,跨站点泄露你的私人信息。指纹识别器通过收集浏览习惯的多个指标来识别特定用户,从而让广告商在浏览会话期间跟踪你的活动。最后,加密矿工是利用你计算机硬件进行加密货币挖矿的应用程序(有些人可能会说它是恶意软件)。这是一项非常消耗资源的过程,可能导致系统不稳定。所有这些都会对你的浏览体验产生负面影响,因此应当被阻止。
除了一些网页浏览器提供的内置功能外,一些最流行的浏览器广告拦截器是浏览器的扩展程序,也叫做附加组件——这些是你可以添加到浏览器中的软件,用以改善其功能或增加其他功能。例如,Adblock Plus——可以在大多数浏览器中安装——通过在广告显示给用户之前拦截广告来工作,尽管广告仍然会下载到你的计算机上。
许多网站能够识别浏览器扩展程序的使用,并会修改其内容或完全阻止用户查看网页,直到扩展程序被禁用或网站被列入白名单以允许播放广告。浏览器扩展程序在第十一章中进行了进一步讨论。以下项目涵盖了如何为 Google Chrome、Mozilla Firefox 和 Brave 浏览器设置广告拦截功能。
22: 在 Google Chrome 中阻止广告
Chrome 的广告拦截器(www.google.com/chrome/)旨在隐藏网页上广告过多或干扰用户体验的广告,比如闪烁或发出噪音的广告。Chrome 还会拦截那些将内容隐藏在付费墙后的广告,这种广告会完全遮挡网页,直到用户允许显示广告或支付费用以查看内容。这种行为适用于 Chrome 的安卓版本以及桌面版本。你可以激活或停用内置的广告拦截器,并允许特定网站:
-
在 Chrome 浏览器的右上角,点击更多图标(三个水平线)。
-
点击设置▸高级▸站点设置▸广告。
-
如果显示“已在通常会显示干扰性广告的网站上屏蔽广告(推荐)”的文字,说明 Chrome 正在为你屏蔽广告。
-
如果你想关闭广告拦截功能,点击开关将设置更改为允许。
保护你在线隐私的另一种方式是使用私人浏览窗口。Chrome 的隐身模式不会保存你的个人信息,或在你关闭浏览器时立即删除这些信息(包括跟踪信息如 Cookie)。你的浏览历史和互联网搜索记录将不会被保存。要打开隐身窗口,请按照以下步骤操作:
-
在 Chrome 浏览器的右上角,点击更多图标(三个水平线)。
-
点击新建私密窗口。
会打开一个新的浏览器窗口,其外观与正常的 Chrome 窗口不同——通常会显示类似“您已进入隐身模式”的文字。这就是你知道正在以私密方式浏览的标志。
23: 在 Mozilla Firefox 中阻止广告
Firefox 的私人浏览(www.mozilla.org/)窗口不仅拦截广告,还会阻止跟踪内容,包括网页上显示的视频和其他媒体。要打开一个新的私人窗口,请按照以下步骤操作:
-
在 Firefox 浏览器的右上角,点击更多图标(三个水平线)。
-
点击新建私密窗口。
你可以更改 Firefox 的默认行为,以禁用所有 Firefox 窗口中的跟踪内容,而不仅仅是私密窗口。要修改这些设置,请按照以下步骤操作:
-
点击 Firefox 窗口右上角的更多。
-
点击首选项▸隐私与安全。
-
设置增强跟踪保护的设置为标准(默认)、严格(提供更高隐私保护,但可能导致某些网站无法正常显示)或自定义。
-
配置你的 Cookie 设置,在浏览器退出时删除 Cookie,通过勾选关闭 Firefox 时删除 Cookies 和站点数据复选框。
-
通过将历史记录下拉菜单设置为从不记住历史,使 Firefox 忘记你的浏览历史。
-
设置诸如摄像头和麦克风的权限,以便 Firefox 无法在未授权的情况下进行监视或监听。
你可以在 Mozilla 知识库中找到更多关于禁用追踪器和其他安全与隐私设置的信息,链接:support.mozilla.org/en-US/kb/enhanced-tracking-protection-firefox-desktop/。
24: 控制 Brave 的隐私设置
Brave (brave.com/) 是一款基于谷歌 Chromium 的相对较新的网页浏览器(因此它与 Chrome 具有很多相同的功能);所有与 Chrome 兼容的扩展也都与 Brave 兼容。与其他浏览器相比,Brave 的优点在于它的目标是为用户提供一个私密、无追踪器和广告的浏览体验。通过在浏览器中积极屏蔽广告,Brave 声称不仅能为用户节省上网时间和带宽,还能减少浏览器消耗的电池电量。
Brave 提供了比其他浏览器更细粒度的安全性和隐私设置控制,并且使这些设置比其他浏览器更易访问:
-
1. 在 Brave 浏览器的右上角,点击更多图标(三条横线)。
-
2. 点击设置▸护盾。
-
3. 将追踪器和广告屏蔽设置为标准或积极模式。
-
打开升级连接为 HTTPS。
-
5. 将 Cookie 屏蔽设置为仅跨站或全部(浏览器关闭后不会记住你的会话信息)。
-
6. 将指纹识别屏蔽设置为标准或严格(可能会导致一些网站无法正常显示)。
尝试调整这些设置以及社交媒体屏蔽设置,直到找到适合自己的组合。
25: 使用 Pi-Hole 屏蔽广告
使用浏览器扩展或内置工具来屏蔽广告是提升互联网浏览体验的一个良好开始。然而,这些选项每次仅适用于一个设备,且管理多个设备的设置可能会很快变得繁琐。不仅如此,一些网站可能会屏蔽浏览器扩展。从 DNS 层面屏蔽广告可以解决所有这些问题。
域名系统(DNS)使你的计算机(或浏览器)能够与互联网上的网站进行通信。所有网站都有一个分配给它们的 IP 地址(或多个 IP 地址)。与 IP 地址相比,你用来访问网站的 URL(例如,www.facebook.com)是人类可读的,并且易于记忆。你的计算机会将该 URL 转换为 IP 地址,以便找到互联网上为你提供 Facebook 服务的 web 服务器——这就是 DNS 的作用。DNS 像邮政服务一样工作,IP 地址相当于物理地址,而 URL 则像街道名称。DNS 允许你向特定地址(或服务器)发送和接收互联网流量,而无需记住该服务器的确切地址(IP 地址)。
考虑到广告域名也使用 DNS 向你发送广告,我们来构建一个 Pi-Hole 服务器,将所有这些请求发送到黑洞,从而为你的用户提供更好的浏览体验。Pi-Hole 类似于第六章中讨论的 Squid 代理;它位于你和你想要浏览的网站之间,观察所有互联网流量,通过一份精心策划的已知广告域名和地址列表,在 DNS 层面识别广告,并允许只有合法、非广告的流量通过到浏览器。与浏览器解决方案相比,Pi-Hole 能屏蔽更大比例的广告,而且网站更难检测和绕过。
在你的本地网络中设置一个 Ubuntu 服务器,如第一章中所述,并将其添加到网络地图和资产列表中。虽然可以使用位于云端的服务器,但将 DNS 服务器暴露到开放互联网会带来一些技术挑战,这些挑战我们不会在本章中讨论。适当的控制措施可以解决这些挑战,因此如果你选择使用云服务器,务必谨慎操作并进行相关风险缓解的研究。如果你已经安装了第三章中讨论的周边防火墙,并且你通过虚拟机创建了 Pi-Hole 服务器,那么该服务器应该位于防火墙之后(即在防火墙的网络端,而不是互联网端)。
可以将 Pi-Hole 与 Squid 一起使用(在第六章中讨论),通过 Pi-Hole 处理 DNS 请求,通过 Squid 处理 HTTP 流量。然而,默认情况下,Squid 使用内部 DNS 客户端——这不能更改,除非重新构建 Squid,而这超出了本书的讨论范围。如果你选择同时使用 Squid 和 Pi-Hole,可以根据每个解决方案的配置说明分别在终端上进行配置,以达到相同的效果。
配置 Pi-Hole
首先创建一个基础的 Ubuntu 服务器,如第一章中所述。然后,使用以下步骤安装 Pi-Hole 服务器:
-
1. 通过 SSH 以标准的非 root 用户身份登录到你的 Ubuntu 服务器。接着,从
install.pi-hole.net/下载 Pi-Hole 安装脚本,使其可执行,并使用sudo执行脚本:$ `ssh` `user@your_server_ip` $ `wget -O basic-install.sh https://install.pi-hole.net` $ `chmod +x basic-install.sh` $ `sudo ./basic-install.sh` -
2. 此时,自动化安装程序将接管你的终端窗口。阅读出现的各种信息屏幕,按回车键进入下一屏幕。
-
3. 当提示选择上游 DNS 服务器时,如图 7-1 所示,选择你觉得合适的上游(权威)DNS 提供商。Google 或 Quad9 都是不错的选择。
注意:使用箭头键或 TAB 键在选项之间导航,空格键选择选项,回车键接受设置。
![选择上游 DNS 提供商的提示包含多个选项,包括 Google(ECS)、OpenDNS(ECS、DNSSEC)、Level3、Comodo、DNS.WATCH、Quad9(过滤,DNSSEC)和 Quad9(未过滤,无 DNSSEC)。你也可以选择“自定义”来使用自己的 DNS 提供商。选择 DNS 提供商后,点击窗口左下方的 OK 按钮,或点击取消以恢复更改。]()
图 7-1:上游 DNS 提供商
为了执行 DNS 查询,当 Pi-Hole 服务器尝试解析未缓存的域名时,它需要一个权威 DNS 服务器来查询。权威DNS 服务器是持有特定域名或地址实际 DNS 记录的名称服务器,例如www.google.com。相比之下,你的服务器是递归的,是你和一个或多个权威 DNS 服务器之间的中介。当你请求一个网站时,你的设备会将请求传递给 Pi-Hole 服务器,后者会将此请求转发给权威服务器,以查找你想访问的网站的地址。
-
4. 在提示时,选择所有可用的屏蔽列表。
Pi-Hole 使用屏蔽列表(由第三方维护的广告域名列表)来识别并拦截互联网上的广告。所选择的列表可以稍后更改。
-
5. 如果你的网络中使用 IPv6,在协议屏幕上选择 IPv6 和 IPv4。
在大多数情况下,IPv6 并不必要。IPv6 为终端提供互联网可寻址的 IP 空间,但在这种情况下你并不需要这样做。除非你有合法需求,否则最好禁用 IPv6,以减少攻击面。
-
6. 以下屏幕显示了你的服务器的静态 IP 地址和网关。如果此页面上列出的地址信息正确,按 ENTER 键以接受。如果不正确,选择否并按 ENTER 键;然后手动设置所需的静态 IP 地址。
你的 Pi-Hole 网关可以是你的防火墙或路由器。一旦你配置或接受了服务器的 IP 设置,自动化安装程序将提醒你配置你的路由器或 DHCP 服务器,以为此服务器保留 IP 地址。如果你不这么做,网络可能会遇到地址冲突,但大多数路由器可以在不需要你干预的情况下避免这个冲突。(有关在路由器上配置静态 IP 地址,请参见第四章中的“静态 IP 地址配置”)。按回车键以确认警告。
-
7. 选择开启以安装 Web 界面,这使得服务器配置更容易管理(即使对于高级管理员也是如此),然后按下 ENTER 键。
-
8. 选择开启以安装由自动化安装程序提供的网络服务器,除非你计划安装自己的服务器(这超出了本书的范围)。
-
9. 选择开启以记录通过你的 Pi-Hole 服务器的 DNS 查询。
由于 Pi-Hole 是一个代理,它会记录并缓存所有通过它的 Web 请求。这意味着任何配置为使用您 Pi-Hole 服务器进行 DNS 的端点都会被记录其浏览历史。如果这对您的用户构成隐私问题,可以获取他们的许可,或者关闭日志记录。您不需要日志记录就可以使用 Pi-Hole 的广告拦截功能,但启用它可以帮助排查任何问题。
-
10. 选择一个在您的网络中可以接受的隐私级别。
Pi-Hole 使用 比光速更快(FTL) DNS,它提供有关 Pi-Hole 活动的统计数据,并以图形方式显示。您将能够看到诸如在给定时间内屏蔽了多少广告、以及屏蔽了哪些端点等信息。FTL 通过解析 Pi-Hole 文本日志来获取这些数据。与日志记录一样,这对 Pi-Hole 的正常运行并不是必需的,但可能会引发用户隐私方面的担忧。务必事先获得他们的许可,或者将隐私级别设置为隐藏域名和客户端,如图 7-2 所示。这样做将促使 FTL 收集匿名数据,在确保用户隐私的同时,使统计数据和图形显示功能得以正常运行。您也可以选择完全禁用统计数据,方法是在前一步关闭日志记录。
![FTL DNS 设置窗口的截图,显示“为 FTL 选择隐私模式”,并包含一个链接,了解更多关于隐私级别的信息(https://docs.pi-hole.net/ftldns/privacylevels/),以及以下选项:显示所有内容、隐藏域名、隐藏域名和客户端、匿名模式。]()
图 7-2:FTL DNS 设置
-
11. 当安装完成时,您将看到一个显示配置的屏幕,并显示 Web 界面的 URL 和管理员密码,如图 7-3 所示。务必记录这些值,最好将其存储在密码库中(在第十一章中讨论过),以确保安全;然后按 ENTER 返回终端。
![安装完成窗口的截图,其中包含以下信息:“使用以下信息将设备配置为使用 Pi-Hole 作为 DNS 服务器:IPv4:172.16.90.11,IPv6:未配置;如果设置了新的 IP 地址,您应重新启动 Pi。安装日志位于 /etc/pihole。查看 Web 界面:http://pi.hole/admin 或 http://172.16.90.11/admin;您的管理员 Web 页面登录密码是 rOhpBpI3。”]()
图 7-3:Pi-Hole 安装完成
您可以使用以下命令更改管理员密码:
$ `sudo pihole -a -p`
为了保持 Pi-Hole 的更新,定期运行以下命令:
$ `sudo pihole -up`
确保 Pi-Hole 及其组件是最新的,这对于保持 Pi-Hole 服务器和您的网络安全至关重要。
使用 Pi-Hole
浏览到最后配置步骤中显示的管理员 URL (http://<your_server_ip>/admin/),你应该能够看到用户仪表板。当有新更新时,你将在屏幕底部收到通知,如图 7-4 所示。目前,无法通过 Web 界面更新 Pi-Hole;必须使用前一节中的命令进行更新。

图 7-4:需要更新 Pi-Hole
点击屏幕左侧的登录,并使用管理员用户名和密码进行身份验证。验证后,仪表板将显示更详细的信息。登录后,你将在管理员菜单中找到更多选项,如图 7-5 所示。

图 7-5:Pi-Hole 管理员仪表板
导航仪表板中重要选项的简要描述如下:
查询日志 浏览器所有请求的按时间顺序排列且可搜索的历史记录,这些请求经过 Pi-Hole 代理服务器。
长期数据 代理服务器请求的更详细历史记录,你可以根据日期范围进行筛选。
白名单 Pi-Hole 默认阻止的域名,但你希望允许访问的域名。
黑名单 代理服务器可能默认不会阻止的域名,但你希望显式阻止的域名。
注意 尽管我们使用了允许列表/拒绝列表,Pi-Hole 在其菜单选项和配置中使用了白名单/黑名单术语。在讨论 Pi-Hole 时,我们将遵循这一术语。
禁用 禁用代理服务器一段时间。
工具 用于调试或更新黑名单,并查看后台代理日志。后台日志提供有关 Pi-Hole 本身的调试信息,而非 Web 流量。
工具▸网络 显示所有连接到 Pi-Hole 服务器的客户端,帮助你识别哪些端点正在使用代理,哪些端点可能绕过了代理(你的网络地图和资产清单会派上用场)。
设置▸系统 包含 Pi-Hole 代理设置(包括安装过程中配置的设置);显示关键信息;允许你禁用、重启和关闭服务器;并允许你清除(删除)DNS 代理日志。
设置▸DNS 更改用于域名翻译的权威 DNS 服务器,并修改接收请求并通过代理过滤器传递的网络接口(虽然默认设置通常是最安全的)。
设置▸DHCP 允许 Pi-Hole 服务器作为 DHCP 服务器运行(如果需要)。
设置▸隐私通过选择将终端与浏览活动关联或匿名化代理捕获的数据,来增加或减少查询报告时的隐私级别。
设置▸传送器将 Pi-Hole 的设置导入或导出到其他服务器。
注销会将你从管理仪表板登出。
探索各种菜单和选项,熟悉 Pi-Hole 的设置和配置。考虑阅读手册,以更好地了解 Pi-Hole 的工作原理及其强大功能。
配置终端上的 DNS
此时,只剩下一件事要做:让你的客户端使用 Pi-Hole 服务器作为其 DNS 服务器。你需要配置你的 DHCP 服务器或路由器,将 DNS 设置推送到访问互联网的设备。或者,你可以通过设备的内部网络设置单独配置每个终端。如果你希望只有特定设备通过代理连接,而让其他设备直接连接互联网,可能需要这样做。也就是说,让所有设备都通过 Pi-Hole 服务器连接,能为用户提供最佳体验,并使你更好地控制网络流量,及早发现问题。服务器还将缓存更多网站,用户浏览时会更快地访问常用网站。
注意 你的路由器能够指定终端访问互联网时使用的 DNS 服务器。在我们使用的 ASUS 路由器示例中,设置路径为高级设置▸LAN▸DNS 服务器。输入 Pi-Hole 服务器的 IP 地址到 DNS 服务器 1 框中,然后点击应用,以设置连接设备将使用的 DNS 服务器。
如果你只希望某些终端使用 Pi-Hole 服务器,你可以通过配置这些客户端的本地 DNS 设置,或使用 pfSense 防火墙中的 DNS 设置(如果你实施了 pfSense,如第三章所述)。
Windows DNS 设置
要在 Windows 客户端上配置 DNS 设置,请按照以下步骤操作:
-
1. 打开设置▸网络和互联网 4 更改适配器选项。
-
2. 右键点击以太网适配器。
-
3. 点击属性。
-
4. 点击互联网协议版本 4 (TCP/IPv4)▸属性。
-
5. 选择使用以下 DNS 服务器地址单选按钮。
-
6. 在首选 DNS 服务器框中输入你的 Pi-Hole 服务器的 IP 地址。
-
7. 点击确定并关闭所有剩余的窗口。
macOS DNS 设置
要配置你的 Mac 使用 Pi-Hole 服务器进行 DNS 设置,请按照以下步骤操作:
-
1. 打开系统偏好设置▸网络。
-
2. 在左侧的连接列表中选择你的网络适配器(以太网或Wi-Fi)。
-
3. 点击高级▸DNS。
-
4. 将你的 Pi-Hole 服务器的 IP 地址添加到左侧的 DNS 服务器列表中。
-
5. 点击确定▸应用。
Linux DNS 设置
要在 Linux 端点上通过 Pi-Hole 服务器路由 DNS 请求,请按照以下步骤操作:
-
1. 打开设置▸网络。
-
2. 点击你有线或无线连接右侧的配置齿轮。
-
3. 选择IPv4标签。
-
4. 在 DNS 框中输入你的 Pi-Hole 服务器的 IP 地址。
-
5. 点击应用。
pfSense DNS 设置
使用 pfSense,你可以通过之前使用过的静态 IP 地址设置为每个客户端配置 DNS,或者通过将 pfSense 设备指向你的 Pi-Hole 服务器进行 DNS 配置,从而批量设置 DNS。如果你想通过 Pi-Hole 服务器发送所有 DNS 请求,请在服务▸DHCP 服务器页面的 DNS 服务器框中输入你的 Pi-Hole IP 地址。如果你想指定哪些端点将使用 Pi-Hole 服务器进行 DNS 解析,请按照以下步骤操作:
-
1. 浏览到 pfSense 设备的服务▸DHCP 服务器页面。
-
2. 在页面底部的 DHCP 静态映射表中找到相关端点的静态映射选项。
-
3. 点击该端点的编辑铅笔图标。
-
4. 在 DNS 框中输入你的 Pi-Hole 服务器的 IP 地址。
-
5. 点击保存▸应用更改。
一旦你使用之前的任意选项配置了端点,你可以通过像canyoublockit.com/这样的站点测试你的广告屏蔽功能。这类网站提供了多种测试广告屏蔽工具的方法,无论是基于浏览器的,还是像 Pi-Hole 这样更为强大的工具,从简单到高级的测试方式都有。如果你运行这些测试并且没有看到广告,说明你的广告屏蔽工具正在正常工作。如果你仍然看到广告,请回顾本章的早期部分,确保设置正确。登录到你的 Pi-Hole 服务器,检查仪表盘,看看你的 DNS 查询是否被服务器看到并通过了服务器。
总结
无论你选择如何使用 Pi-Hole,你现在都有了一个监控和控制网络中互联网使用的手段,大家的互联网浏览体验也会变得更好。你可以选择在你可能在第六章实现的 Squid 代理的基础上使用 Pi-Hole,或者仅使用 Squid 或 Pi-Hole 中的任何一个。无论你选择哪种解决方案,你都会体验到与该技术相关的好处。或者,如果你更喜欢使用基于浏览器的屏蔽功能并使用浏览器插件,也可以选择放弃 DNS 级别的广告屏蔽;选择权在你。
第八章:# 检测、移除和防止恶意软件

恶意软件,如病毒、木马和勒索软件,对互联网用户构成重大威胁,并且在可预见的未来可能仍然如此。因此,装备自己和用户一个能够检测和移除恶意软件的防病毒解决方案非常重要。此外,保持终端设备的最新状态可以防止恶意软件感染你的网络,在某些情况下,还能提供比防病毒(AV)解决方案更多的保护。
防病毒解决方案可能难以管理,因为它们通常不是跨平台的(即只适用于某一操作系统)。如果你的网络中有多个操作系统,你将需要为每个操作系统找到有效的 AV 产品。尽管本章讨论了如何安装、配置和使用特定产品进行扫描,但大多数选项和设置在大多数防病毒解决方案中是相同的。设置和配置选项的名称可能会略有不同,但相同的逻辑和过程应该适用于大多数产品。
在探索了适用于各种操作系统的防病毒解决方案之后,我们将考虑恶意软件特征和启发式扫描之间的差异,每种方法的优缺点,以及创建一个防病毒农场的概念,以便在不同的终端设备上尽可能多地捕获恶意软件。最后,我们将讨论各种操作系统的补丁管理,以及如何最好地保持终端设备的最新状态。
Microsoft Defender for Windows
内置的微软防病毒解决方案的最新版本是Microsoft Defender。Defender 会自动更新病毒定义并定期扫描威胁,因此 Windows 电脑开箱即用时就能提供良好的保护。
Defender 的自动扫描是快速扫描,只检查通常会发现威胁的文件夹。虽然快速扫描能提供快速结果并且消耗少量系统资源,但它不太可能发现并移除位于这些文件夹之外的恶意软件。完全扫描会扫描所有文件和正在运行的程序,进行彻底的恶意软件搜索。建议每周至每月之间运行一次完全扫描。扫描周期越长,攻击者就越有机会在你的系统上造成破坏。
你还可以选择自定义扫描和离线扫描。自定义扫描允许你选择要扫描的文件夹和文件。离线扫描类似于早期版本 Windows 中的安全模式启动恶意软件移除方法。Windows 现在能够自动重启到一个状态,在该状态下,Microsoft Defender 可以通过离线扫描移除顽固的恶意软件。此选项是最后的手段,而不是你定期进行的扫描。如果你认为计算机被感染,但无法通过完整扫描找到感染,请运行离线扫描以确保清除。如果仍然无效,你唯一的办法就是清空硬盘并重新安装 Windows。
要运行扫描,打开 设置▸更新与安全▸Windows 安全▸病毒与威胁防护。点击 扫描选项,选择你想要的扫描类型,然后点击 立即扫描。
在病毒与威胁防护 4 管理设置菜单中,确保实时保护已开启,以便 Defender 持续保护你的计算机。你还可以在此菜单中添加文件和文件夹排除项。当你有一些合法且对系统没有风险的文件或程序时,但 Defender 将其误认为恶意软件并尝试隔离时,你可以添加这些排除项。
有一个设置特别可能会对你的隐私构成风险,那就是自动样本提交,它允许 Microsoft Defender 自动上传你的文件到微软的云服务器进行分析和扫描以检测恶意软件。这一做法存在风险:私密或机密数据可能在你不知情的情况下泄露给第三方,因为 Defender 不会询问或告知你文件被上传到 Microsoft。要关闭此设置,请切换自动样本提交。
与此设置相关的是云端保护设置。这个设置相对不那么危险,因为它仅将文件的元数据传送给 Microsoft,而不是整个文件内容。即使关闭了自动样本提交,云端保护依然能正常工作,尽管它的表现可能不会那么好。
Windows 会保持 Microsoft Defender 的最新状态,但偶尔手动更新也没有坏处。要更新,点击主界面上的 检查更新,进入病毒和威胁防护页面。
选择恶意软件检测和杀毒工具
在决定使用哪种杀毒和恶意软件检测工具时,考虑是否值得为商业工具(或免费工具的高级版)付费,并且工具是否会使用签名或启发式方法来检测恶意软件。
一般来说,如果你只需要一个简单的恶意软件扫描工具,几乎没有必要支付商业产品的费用。通常,你支付的是一些高级功能,例如内置的电子邮件或网页浏览器扫描器。
通常,付费解决方案提供某种形式的集中管理。不论是通过网页门户、管理服务器还是代理,你都可以从一个地方获得对所有设备的可视性并进行管理。如果你拥有一个较大的网络,这种能力非常有价值;如果你的网络中设备少于 30 个,你可能不需要这种功能。
杀毒农场
在较小的网络中,放弃单一解决方案而使用多个杀毒产品也有好处。杀毒农场使用多个产品,旨在捕捉比单一解决方案更多的恶意软件。这也使得攻击者的工作变得更加困难;他们不仅需要避开一个杀毒产品,还需要避开多个产品,才能在网络中横向传播。
杀毒农场之所以有用,是因为每个杀毒厂商都会创建自己专有的恶意软件特征码数据库——即可用于识别特定恶意软件样本的可执行文件中的字节序列。这些数据库需要定期优化;否则,你下载的病毒定义文件会变得过大、难以使用。因此,随着时间推移,较旧的病毒定义可能会从这些数据库中移除,这意味着使用多个厂商的产品可能会提供更广泛的已知威胁覆盖。
特征码与启发式分析
你还应该选择那些既能进行基于特征码检测又能进行启发式分析的杀毒产品。特征码通过可执行文件或其他文件的内容来识别已知的恶意软件,尽管攻击者通过轻微修改恶意软件内容,就能轻松改变其特征码。这是恶意软件检测软件的一个重大弱点。另一方面,启发式分析则是分析文件的行为方式及文件可能执行的命令,以判断其是否为恶意文件。这是一种更加可靠的检测已知和未知威胁的方法。如何判断某个杀毒程序是执行特征码检测还是启发式扫描呢?如果在其官网上没有列出相关信息,最好的方法是联系厂商并询问。厂商官网上通常会列出联系方式。
26: 在 macOS 上安装 Avast
苹果设备通常被认为不太容易感染恶意软件,但现在它们感染的情况越来越多,这意味着你应该在网络中的任何 Mac 电脑上安装杀毒软件。在为你的苹果计算机安装第三方启发式杀毒解决方案时,有许多选择,既有免费的,也有商业的。在这些选择中,Avast 已经连续多年位居多个排行榜的前列。要安装和配置 Avast,请按照以下步骤进行:
- 1. 从
www.avast.com/下载 Avast 并安装该软件。安装完成后,您应该会看到 Avast 安全窗口(见 图 8-1)。

图 8-1:Avast 安全窗口
-
2. 点击菜单▸偏好设置,进入 Avast 的设置页面。
-
3. 在“常规”标签中,确保勾选了开启自动更新复选框。
-
4. 在“隐私”标签中,取消勾选 允许将您的数据与 Avast 分享的两个复选框。与 Windows Defender 类似,最好保护您的隐私。
-
5. 在“核心防护”标签中,启用 Avast 将运行的每一个安全检查,例如文件扫描、网页保护和电子邮件保护。
-
6. 在每个防护盾下点击添加例外按钮,指定任何必要的例外。如果您知道某些文件或程序是合法的或低风险的,但您的防病毒软件将它们分类为潜在的恶意文件,请添加例外。
-
7. 在“扫描”标签中,确保勾选了扫描整个文件、扫描外部驱动器、扫描已挂载的网络卷、扫描所有 Time Machine 备份和扫描归档。这样,您可以确保您的防病毒软件尽可能多地识别威胁并保护您免受威胁。
智能扫描 旨在快速扫描计算机最脆弱的区域。虽然它消耗的资源较少且所需时间较短,但它不太可能发现计算机上的所有威胁,因为它并未扫描硬盘的所有区域。深度扫描 更为全面,涵盖设备上的所有存储区域,可以选择包括外部存储、网络位置、Time Machine 备份、内存和根套件检测。定向扫描 只扫描指定区域。
所有这些扫描都在 Mac 上的 Avast 扫描中央屏幕中运行。点击搜索按钮选择您要运行的扫描类型,然后点击立即扫描。选择定向扫描、USB/DVD 扫描或自定义扫描时,系统会提示您选择要扫描的位置。Avast 会扫描您的计算机以寻找威胁,如果检测到任何威胁,它会询问您希望如何处理相关文件。选择所有文件并点击解决所选将它们全部移动到病毒库;然后点击完成。您的计算机现在应该清除了所有潜在的恶意文件和应用程序。
27:在 Linux 上安装 ClamAV
Linux 同样容易受到病毒的攻击。然而,Linux 操作系统很少内置杀毒软件,并且与其他操作系统相比,Linux 的可用杀毒软件也更少。大多数可用的解决方案都是商业软件,因此需要付费,如 Avast Core Security for Linux,但也有一个开源解决方案:ClamAV。
ClamAV 是一个免费的应用程序,可以在 Windows、macOS 和 Linux 上使用。要在 Ubuntu 上安装它,首先通过 SSH 以标准的非 root 用户登录到您的服务器。运行以下命令安装 ClamAV 版本,允许您自动化病毒扫描活动,并安装 GUI 工具 clamtk,后者可能会在稍后使用:
$ `sudo apt install clamav clamav-daemon clamtk`
安装完成后,您的杀毒定义(ClamAV 用来判断恶意软件的数据库)应该是最新的,但您可以运行以下命令来更新病毒定义—无论是现在还是以后—以停止、更新然后重启 ClamAV:
$ `sudo systemctl stop clamav-freshclam`
$ `sudo freshclam`
$ `sudo systemctl start clamav-freshclam`
要运行恶意软件扫描,请使用clamscan folder_to_scan命令。要扫描系统中的所有内容,请使用/,这将指示 ClamAV 扫描文件系统根目录中的所有内容,提供-r参数使扫描递归所有目录,并使用sudo,以便 ClamAV 获得必要的权限读取文件系统中的所有文件:
$ `sudo clamscan -r /`
`--snip--`
----------- SCAN SUMMARY -----------
Known viruses: 8927215
Engine version: 0.102.3
Scanned directories: 89954
Scanned files: 362758
Infected files: 0
Total errors: 82216
Data scanned: 8767.58 MB
Data read: 14195.27 MB (ratio 0.62:1)
Time: 1171.021 sec (19 m 31 s)
扫描完成后,clamscan将输出扫描摘要。
除了已知的恶意软件,ClamAV 还可以检测潜在不受欢迎的应用程序(PUA),包括广告软件、点对点(p2p)程序、远程管理工具、比特币挖矿程序和捆绑软件(与正在安装的应用程序无关的软件,但一并捆绑安装),这些程序本身并不恶意,但可能对终端的安全性和性能构成风险或产生负面影响。要扫描 PUA,请在运行 ClamAV 时包含--detect-pua=yes参数。
如果您的扫描耗时过长,可以使用其他高级参数来缩短扫描时间。您可以使用--max-filesize=``n参数限制 ClamAV 扫描的文件大小,其中n是以千字节为单位的最大文件大小。任何大于您指定大小的文件将被跳过,并假定是干净的,从而减少扫描完成的时间。同样,--max-scansize=``n只扫描指定大小以内的归档文件(.rar文件、.zip文件等)—所有其他归档文件将被跳过。要限制递归深度(即扫描开始目录下的目录层级数量),请使用--max-dir-recursion=``n参数。有关更多参数,请使用-h参数,如sudo clamscan -h,打印帮助菜单。
要定期运行扫描,请使用 Crontab,这是一个 Linux 实用程序,旨在按预设的时间或间隔执行程序。在终端中,使用crontab -e命令编辑计划任务文件:
$ `sudo crontab -e`
[sudo] password for user:
# Edit this file to introduce tasks to be run by cron.
#
# Each task to run has to be defined through a single line
# indicating with different fields when the task will be run
# and what command to run for the task
#
# To define the time you can provide concrete values for
# minute (m), hour (h), day of month (dom), month (mon),
# and day of week (dow) or use '*' in these fields (for 'any').
#
# Notice that tasks will be started based on the cron’s system
# daemon’s notion of time and timezones.
#
# Output of the crontab jobs (including errors) is sent through
# email to the user the crontab file belongs to (unless redirected).
#
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
#
# For more information see the manual pages of crontab(5) and cron(8)
#
`# m h dom mon dow command`
文件开头的大注释解释了如何使用示例指定任务。注释的最后一行提供了调度执行脚本和应用程序的语法。顺序是分钟、小时、日期、月份、星期几和要执行的命令。分钟和小时必须是数字,分别为 0 到 59 和 0 到 23,你可以通过逗号分隔的方式指定分钟或小时的列表(也就是说,你可以通过指定1,2,3在凌晨 1 点、2 点和 3 点运行命令)。你可以通过数字指定日期(1 到 7,1 是星期天),或者使用 Sun、Mon、Tue 等表示。月份是 1 到 12(1 代表一月)。星号(*)表示该字段的所有可能值;如果你希望命令每个月运行一次,可以在月份(mon)位置放一个星号。
假设你想在每个星期天凌晨 1 点对整个文件系统运行clamscan,并包括扫描潜在的不需要的应用程序。在 Crontab 文件的底部,添加一行并输入以下内容:
0 1 * * sun clamscan -r / --detect-pua=yes -l /`path_to_logfile/clamav.log`
默认情况下,除非你使用-l参数指定日志文件,否则你无法查看扫描结果。如果你希望每天扫描特定的文件夹,比如用户的主目录(/home/),除了全系统扫描之外,可以在 Crontab 中添加另一条记录,参考之前的示例作为指南。
在 Crontab 中添加另一行以确保 ClamAV 保持最新:
0 0 * * mon systemctl stop clamav-freshclam && freshclam && systemctl start clamav-freshclam
你可以将多个命令链接在一起,并用一对和符号将它们分开,以串行执行它们。可以使用man命令获取更多关于 Crontab(或任何其他终端命令)的信息。在命令行中输入man crontab来打开该应用程序的手册。
28: 使用 VirusTotal
VirusTotal (VT) 测试文件以确定它们是否可能是恶意的(www.virustotal.com/),其方式是将反病毒农场的概念进行大规模实现。这是一个公开的服务,你可以上传任何文件扫描恶意软件,VT 会用超过 60 种反病毒程序扫描它。然后它会生成一份报告,告诉你文件是否包含恶意软件,或者是否以某种方式影响你的终端、安全性或隐私。这个功能在你认为一个文件是恶意的,但你的反病毒软件没有检测到时,特别有用。
请注意,任何上传到 VT 的文件都会变成公开的,因此任何人都可以搜索并下载你上传的文件。为了在不公开私人信息的情况下使用 VT,请在 VT 中搜索你想检查的文件的哈希值。哈希是一种根据文件内容计算固定长度字符串的过程。哈希应该是单向过程,这意味着你不能通过文件的哈希值反推回原始文件内容。通过创建文件的哈希值,你应该得到一个唯一的字符字符串,用于标识该文件。某些哈希算法可能会导致冲突,即两个文件生成相同的哈希值,尽管在大多数现代哈希函数中,这种情况几乎不会发生。你可以通过使用任何操作系统的内置工具获取文件的哈希值。
Windows PowerShell 在 Windows 中,打开 PowerShell 窗口并输入以下命令来获取任何文件的 MD5 哈希值:
$ `Get-FileHash` `path_to_file` `-Algorithm MD5`
然后,你可以直接在 VirusTotal 网页门户中搜索该哈希值。
Linux 和 macOS 终端,你可以使用以下命令在 Linux 和 macOS 中获取文件的 MD5 哈希值:
$ `md5sum` `path_to_file`
然后,在 VT 网页门户中搜索结果哈希值。
如果某个哈希值相同的文件曾在过去的某个时间点上传到 VT,你将看到该文件的公共报告,报告详细说明了 VT 所有提供商的恶意软件扫描结果。如果该文件之前没有被上传,文件很可能不是恶意的。
29: 管理补丁和更新
除了使用防病毒工具外,补丁管理也是一种重要的防御措施,因为恶意软件利用是针对网络、应用程序、协议或操作系统中的特定漏洞进行攻击。攻击者密切关注 Windows 更新和其他操作系统的补丁,因为补丁说明会指出它旨在修复的漏洞。攻击者利用这些漏洞信息编写专门针对该安全缺陷的恶意软件,而没有下载更新的用户可能会成为受害者。这也是操作系统不断要求你安装更新和补丁的原因。
在大多数情况下,最终用户不会立即安装更新,攻击者有机会利用未打补丁的系统进行攻击。为了你的最佳利益,更新软件应该尽快进行。幸运的是,更新过程非常简单且易于自动化。本项目描述了如何在单个系统上配置系统更新,接下来的部分将讨论跨多个终端的补丁管理解决方案。
Windows 更新
对于 Windows 更新,打开Windows 设置▸更新与安全。Windows 会至少每天自动检查一次更新(前提是设备始终开机)。要手动检查、下载并安装更新,请点击检查更新按钮。
如果你希望暂时不考虑更新,可以点击暂停更新 7 天。更新对于保持系统安全至关重要,因此不建议暂停更新。
你可以通过设置活动时间来限制 Windows 在特定时间更新你的计算机。如果你主要在上午 9 点到下午 5 点之间使用计算机,可以告诉 Windows 在此时间段内不要更新,这比长时间暂停更新更为合适。
在“高级选项”中,你可以允许 Windows 通过 Windows 更新来更新其他 Microsoft 产品——我建议启用此选项。你还可以让 Windows 在安装更新后强制设备重启,如果你作为管理员希望强制终端用户重启他们的机器,这非常有用。你可能会不太受欢迎,但你的网络会更安全。
在“高级选项▸传递优化”菜单中,你可以启用从网络中其他 PC 下载更新的选项。这将减少从互联网下载相同更新到多台计算机所需的带宽。你应该启用此设置,但有一个前提条件:仅允许从本地网络中的 PC 下载,而不是来自互联网上的 PC。
在“高级选项”面板中,最后一个特别需要注意的设置是隐私设置。通过在此菜单中禁用 Windows 和 Microsoft 根据你的地理位置、浏览习惯和应用使用统计数据向你发送定向广告和内容,你可以提高自己的隐私保护。
macOS 软件更新
Apple 设备比 Windows 或 Linux 更简单,因为它们的更新过程几乎可以完全自动化,并且几乎不需要用户输入。为了确保你的 Apple 电脑保持最新,打开系统偏好设置▸软件更新。要启用自动更新,请勾选自动保持我的 Mac 最新。
勾选此复选框后,点击高级按钮选择应自动执行的操作。在此菜单中(图 8-2),选择你的计算机是否可以检查更新、下载更新或在没有用户输入的情况下完成安装过程,然后点击确定保存设置。在大多数情况下,允许计算机在没有用户输入的情况下保持最新是理想的;计算机仍然会在任何需要重启的更新后询问用户是否重启(这种情况并不常见)。

图 8-2:macOS 高级软件更新配置
以这种方式保持你的设备更新,可以确保它们尽可能安全,并保护你和你的用户的隐私。
使用 apt 更新 Linux
如第一章中所述,Linux 操作系统有多种实现方式,称为发行版。这些发行版中的每一个都使用软件包管理器来维护和更新系统或用户安装的软件。本书中我们使用的是 Ubuntu Linux,它使用高级包工具(APT)软件包管理器。软件包管理器简化了保持 Linux 终端系统最新和安全的过程。
要更新 Ubuntu 系统,使用 SSH 以标准的非 root 用户身份登录。当你登录时,系统会显示欢迎信息,其中包括关于必需和推荐更新的相关信息:
`--snip--`
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
105 updates can be installed immediately.
68 of these updates are security updates.
To see these additional updates run: apt list --upgradable
`--snip--`
为确保更新列表完整,运行apt update命令:
$ `sudo apt update`
更新列表完成后,运行upgrade命令以更新所有软件包:
$ `sudo apt upgrade`
命令输出将显示需要更新的包的数量、它们将使用的磁盘空间以及各种状态信息。当提示时,输入Y并按回车键继续。
与 Windows 和 macOS 一样,某些更新需要重启系统。如果是这种情况,你会看到类似下面的提示:
A reboot is required to replace the running dbus-daemon.
Please reboot the system when convenient.
要使 Ubuntu 自动更新系统和已安装的软件包,请使用以下命令:
$ `sudo dpkg-reconfigure -plow unattended-upgrades`
命令将显示图 Figure 8-3 中所示的提示。

图 8-3:Ubuntu 无人值守更新
选择Yes并按回车键,你将确保服务器保持最新,从而使其本身更加安全。然而,你仍然应该手动检查更新,并每月重启一次服务器。
30: 安装 Automox
根据你的网络规模,手动或半手动地保持所有终端系统更新可能会让人感到乏味或不知所措。像 Automox 这样的集中式补丁管理解决方案可以让你轻松在一个地方管理所有这些内容。Automox 采用按终端订阅的模式:你可以通过支付名义上的月费来管理一个或多个 Windows、macOS 或 Linux 系统(工作站或服务器),该费用允许你通过一个仪表板为所有终端应用系统和第三方软件的补丁。Automox 还维护资产和软件清单,这是任何人保持网络安全的第一步。
安装 Automox
访问 Automox 网站(www.automox.com/)注册一个帐户(或免费试用)。然后登录到您的帐户仪表板(console.automox.com/)。仪表板是您查看管理的端点和它们所需更新的摘要的地方。当然,在您向帐户添加一些端点之前,仪表板将会很简洁。在接下来的章节中,您将需要一个用户密钥来将端点连接到 Automox。您的密钥可以在 Automox Web UI 的个人资料设置页面下的“密钥”标签中找到。
Windows
要在 Windows 端点上安装 Automox 代理,请从 Automox 控制台访问设备标签页,然后点击页面顶部的添加设备链接。您将看到一个操作系统选择弹窗。选择 Windows,然后下载代理程序。
一旦代理程序下载完成,以管理员身份运行安装程序(.msi 文件)。按照安装向导的提示进行操作,在提示时输入来自控制台的 Automox 用户密钥。安装完成后,刷新您的 Automox 仪表板,查看新添加的端点(图 8-4)。

图 8-4:Automox 资产列表
macOS 和 Linux
在 Mac 或 Linux 计算机的终端窗口中,运行以下命令,将 yourkey 替换为您的用户密钥:
$ curl -sS "https://console.automox.com/downloadInstaller?accesskey=``yourkey``" | sudo bash
刷新您的控制台,以查看新添加的端点。
使用 Automox
现在,您已经在端点上安装了 Automox,您将能够通过一个中央控制台管理操作系统和第三方软件的补丁。在设备标签页中,您可以查看所有管理的端点,并将它们添加到组中—如果您希望按这种方式管理它们。您还可以扫描端点以识别硬件更改,并检查它们所需的最新更新,远程重启端点,或者从帐户中移除端点。通过点击一个端点,您可以查看它的硬件配置、IP 和 MAC 地址、设备类型、操作系统、CPU 和 RAM 详细信息,以及其他关键信息,如图 8-5 所示。您还可以强制立即对端点应用更新,而无需等待端点按照系统管理标签页中指定的更新策略进行更新。

图 8-5:Automox 设备详情
“系统管理”选项卡允许您创建和分配补丁策略,如果您希望安排补丁安装,这非常有用。例如,您可以决定每天下午 5 点自动安装任何重要补丁。或者,您可能希望每周六午夜强制安装所有必需的补丁,那时人们不太可能使用他们的计算机。您需要定义自己的要求,并决定哪个补丁安装时间表最适合您和您的网络。
在“报告”选项卡中,您可以生成 Automox 执行的操作报告,以保持您的终端设备最新,报告控制台中任何或所有终端设备的状态,或识别不合规的终端设备。根据网络的大小,查看此信息可能比生成这些报告更容易。
Automox 会在“软件”选项卡中提供已安装在受管理终端设备上的所有软件及其补丁级别的清单。这使您能够轻松识别需要更新的软件,并在可能的情况下进行更新。您还可以使用此列表识别您不希望出现在环境中的软件,无论是潜在的恶意软件,还是违反组织政策的特定软件,如游戏或其他软件。
最后,设置选项卡允许您创建新用户,以便其他管理员可以访问您的 Automox 控制台来管理终端设备。您还可以在此选项卡中查找并添加代理访问密钥。您应该充分利用的一项功能是双因素认证设置。通过启用双因素认证,您可以增强账户的安全性,从而使未经授权访问您的设备和补丁管理信息变得更加困难(在第十一章中有进一步讨论)。
概述
保持系统最新对于确保网络安全至关重要。无论您选择使用操作系统内置的防病毒和补丁选项,还是像 Automox 这样的托管补丁解决方案,都应定期安排更新和病毒扫描;否则,您将使网络面临各种对手和不必要的风险。
第九章:# 备份你的数据

拥有一个可靠、明确定义并且实施到位的备份策略,是任何网络防御恶意或意外数据丢失的最佳方式之一。无论是你误删了一个重要文件夹,还是有攻击者在你的网络内部执行了勒索病毒,或是自然灾害摧毁了你的设备,备份都能将你从灾难中拯救出来。
本章介绍了各种备份注意事项,包括不同的备份类型、创建备份计划、现场和异地备份的价值、备份内容以及备份存储选项。最后,我们将展示如何在网络中实施不同的解决方案。
备份类型
在实施备份计划时,你应该考虑三种备份类型:完全备份、增量备份和差异备份。
完全备份
-
完全备份包含了你希望从特定主机或位置(称为备份集)备份的所有内容的完整副本。例如,你可能决定定期创建你电脑中用户配置文件的所有内容的备份副本。或者,你可能想要备份整个磁盘或卷,包括操作系统文件。以上任一选项都是可行的,都可以视为不同的备份集。
-
完全备份提供了从备份集中快速、简便地恢复所有文件的方式。由于所有数据都包含在一个备份中,恢复过程将比其他备份选项更快。然而,完全备份需要更多的存储空间,尤其是当你保存多个备份时,而且创建的时间也最长。
差异备份
-
差异备份仅包含自上次完全备份以来发生变化的数据副本,因此比完全备份更适合频繁使用。如果你决定每月进行一次完全备份,那么每周进行一次差异备份是一个好主意。建议定期创建完全备份,以便保持差异备份的大小可控(而不是在备份集创建一个完全备份之后,再仅从那个点开始创建差异备份)。
-
差异备份占用大量存储空间,因为第一次备份包含了自上次完全备份以来所有修改的文件副本,接下来的差异备份则包含了所有这些数据,加上第一次和第二次差异备份之间所有额外修改的文件。如果没有在某个时点进行完全备份,差异备份会随着时间的推移变得越来越大。此外,如果某一个或多个差异备份不完整,你将无法从部分差异备份和数据的完全备份中恢复完整数据。
增量备份
-
增量备份会创建自上次备份任何类型以来发生变化的所有数据的副本,无论是之前的全量备份、差异备份还是增量备份。这种备份方式占用的空间最少,并且创建所需的时间也最短。如果你每个月进行一次全量备份,每周进行一次差异备份,那么你最好每天进行增量备份,以确保对数据的任何更改都会被捕捉到。
-
增量备份的一个难点是,恢复所有文件跨多个备份可能会非常困难,因为每个备份都必须单独打开,并从所需的备份点恢复特定的文件。这意味着需要使用所有可用的恢复点来完成全面恢复,而差异备份只需要最近的差异备份和最近的全量备份就能完成完整的恢复。
制定备份计划
如果备份没有定期进行,那它几乎没有什么价值。你最关键的数据可能每天都在变化,因此,如果一个文档的备份已经两个月没有更新,当它损坏或永久丢失时,旧的备份就没有任何帮助了。因此,决定备份应该多久进行一次是至关重要的。你的备份策略将是高度个性化的,并且与特定的情况和需求相关,尽管有一些最佳实践可以遵循。
通常最好比起差异备份或增量备份,较少频繁地进行全量备份,因为全量备份占用的空间和时间最多。进行差异备份或增量备份可以更频繁地备份修改过的数据,并且由于时间限制,增量备份和差异备份比全量备份更不容易失败。作为一般规则,每月进行一次主系统或关键数据的全量备份是一个不错的起点,之后你可以根据需要调整备份策略。
根据你选择的备份软件,你可能能够使用这些特定的调度选项中的部分、全部或没有任何选项。例如,一些软件从技术上讲具备所有这些功能,并允许你从不同的时间点恢复数据,但差异备份/增量备份/全量备份和恢复选项不会直接显示给你。大多数操作系统都自带一个集成的备份解决方案(稍后讨论)。根据你的需求,内置的选项可能就足够了。否则,你可以考虑各种付费解决方案。
现场和异地备份
根据你选择备份的数据的重要性,除了本地备份之外,保留异地备份可能是一个不错的主意。 本地备份保存在与你的原始数据相同的物理位置,比如你的家或办公室。异地备份则保存在与你的主要位置不同的地方。将备份存储在多个位置可以提供数据冗余;如果你的本地备份和原始数据被销毁,异地备份可能是你唯一的恢复选项。通常,异地备份会存储在离线状态,不与网络连接,理想情况下存放在类似防火保险箱的地方。或者,你也可以选择使用云解决方案,但这会带来自己的安全风险。
拥有异地备份可能会带来额外的管理开销。在大多数情况下,你会先在本地创建备份,要么使用备份应用程序,要么将本地备份完整复制出来,然后将该备份物理移出现场。这应该与本地备份一样,按定期的时间表进行,因为它能为你提供更多的应急选项。
备份内容和存储方案选择
一开始选择你想要备份的内容可能会是一个挑战。你需要能够从之前的检查点恢复整个设备,还是只需要恢复特定的文件?如果你不需要恢复整个操作系统,最好确定哪些文件和文件夹是关键的,或者在恢复时会有用。考虑一下,在数据丢失后,你能在多长时间内没有这些数据,直到它真正开始影响你、你的用户或你的业务。恢复备份数据所需的时间完全取决于你需要恢复的数据量。
确定备份策略时,另一个需要考虑的因素是你有多少存储空间可以用来存储备份。你可以选择在设备本身上创建文件备份,但如果设备丢失、被盗、损坏或无法使用,这样做就没什么用处。更好的选择是使用外部硬盘驱动器,它可以从任何本地电脑商店购买,并且有各种容量可供选择,适合你的需求。这是一个便宜且简便的选择,可以让你创建本地备份并轻松将其存储在异地。最后,你还可以购买专用的备份存储设备,如网络附加存储(NAS)设备。NAS 连接到你的网络,具有高存储容量,通常还包括像磁盘冗余和自动化等附加功能。它提供的性能和可靠性通常高于单独的外部硬盘驱动器,但通常更昂贵并且需要一些管理。
无论你选择哪种存储解决方案,它应该与你计划备份的内容相匹配。对设备进行完整磁盘备份会占用大量空间,因为计算机的内存通常为 1TB 或更大。如果你只打算备份关键的个人文件,那么你所需的备份存储空间会较小。你可能会从外部硬盘开始,随着需求的增加,逐步升级存储方案。你选择的解决方案将主要取决于操作系统、终端是物理设备还是虚拟设备,以及你希望保留多少数据在备份集中。
如果你想保持自己的备份,大多数操作系统都有内建的备份解决方案,其中一些功能比其他的更为完整。
31: 使用 Windows 备份
要访问 Windows 的内建备份解决方案,请打开 Windows 设置▸更新与安全▸备份。你需要将一个驱动器连接到计算机上,用来存储备份数据。连接后,点击 添加驱动器 并选择它,如 图 9-1 所示。请注意,在 Windows 11 中,Windows 备份位于 Windows 设置▸帐户▸Windows 备份 下,且设置是按用户进行的。你可以在 Windows 11 中使用 Windows 备份将文件、应用程序和偏好同步到 OneDrive,但不再提供将本地驱动器备份到外部或网络驱动器的选项。

图 9-1:Windows 备份到外部驱动器
当你选择了驱动器后,“自动备份我的文件”选项将会开启。这将会保持用户配置文件文件夹(C:\Users<username>)中更为关键数据的多个副本,例如 Documents、Desktop 和 Downloads 文件夹,以及 AppData 文件夹中的应用程序设置。你可以通过点击“更多选项”来选择要包含在备份中的文件夹。
Windows 备份基本上是一个完整备份加增量备份的策略。它会首先对你选择的文件进行完整备份,然后默认每小时保存这些文件的每个新版本或修改,永远保持(或者直到你的备份驱动器空间耗尽)。这样,你可以在备份时间线的任何时间点查看并恢复文件。这个方案有一些限制,包括无法将备份保存到网络位置,也不能进行完整的系统映像备份。
32: 使用 Windows 备份与还原
如前一个项目中所讨论的,Windows 备份非常适合备份特定的文件和文件夹,但不适合进行完整的系统备份。幸运的是,自 Windows 7 以来,所有版本的 Windows 都包括备份和恢复,这对于创建完整的系统备份非常有用,包括可以完全恢复系统的系统映像(例如,如果系统因勒索软件而被破坏)。它还可以将备份保存到外部或网络驱动器,但不会保留文件的旧版本或文件历史记录。
在 Windows 10 中,你可以通过进入Windows 设置▸更新与安全▸备份▸转到备份与恢复(Windows 7)来访问备份和恢复功能。在 Windows 11 中,备份和恢复功能位于控制面板▸系统与安全▸备份与恢复(Windows 7)。你将看到如图 9-2 所示的屏幕。

图 9-2:Windows 备份和恢复窗口
在左侧,你可以选择创建系统映像或系统修复光盘。如果由于硬件或操作系统问题导致计算机无法访问,你可以使用这些工具之一来恢复计算机到当前已知的良好配置,所有文件都会保持在当前状态。
-
- 点击右侧的设置备份按钮,以创建一个定期的个人文件和系统文件备份计划。
-
- 连接外部驱动器并点击刷新以选择它作为备份位置,或者点击保存到网络,指定网络位置和必要的用户名及密码(如果有);然后点击下一步。
此时,Windows 会询问你希望包含在备份中的内容。默认情况下,你可以让 Windows 选择要包含的内容,这将是你在C:\Users<用户名>中的个人文件和文件夹。
-
- 选择让我选择单选按钮,然后点击下一步。
-
-
选择要备份的内容。
-
a. 启用或禁用新用户文件的备份(假设将在此计算机上创建新的用户账户)。
-
b. 包括或排除任何个人库,例如文档或图片,以及像桌面和下载文件夹这样的位置。
-
c. 选择计算机上驱动器中的任何文件夹。
-
d. 如果你希望定期备份整个系统,请确保选中包含设备系统映像的复选框。当你对设置感到满意时,点击下一步。
-
-
- 此时,你可以选择此备份运行的计划,可以是每日、每周或每月。
-
- 点击保存设置并运行备份以进行首次完整的数据备份。
现在,您的文件夹已经定期备份到外部或网络驱动器,适用于您的 Windows 系统。
33:使用 macOS Time Machine
Apple 设备内置了用于备份数据的解决方案,称为Time Machine,可以通过系统设置▸Time Machine(图 9-3)进行访问。

图 9-3:macOS Time Machine
Time Machine 可以将您的数据备份到直接连接到计算机的外部驱动器或网络附加存储。该网络存储可以是 Apple Airport Time Capsule(专为 Time Machine 备份设计)、连接到 Apple Airport Extreme 基站的驱动器、已共享为 Time Machine 备份目标的其他 Mac,或者支持通过 SMB 协议进行 Time Machine 备份的专用 NAS 设备。如果您的网络中已有这些设备,建议使用该解决方案。如果没有可用的设备,最简单和最便宜的备份 Mac 解决方案是使用外部驱动器,而不是网络位置。通常,当您将高容量硬盘插入 Apple 设备时,系统会提示您是否希望将该硬盘用作 Time Machine 备份。或者,您可以使用图 9-3 中所示的“选择备份磁盘”选项选择特定的备份磁盘。
Time Machine 不提供调度备份的选项;它将在预定的时间自动备份数据。Time Machine 会保留 24 小时的快照,进行每日备份一个月,并进行每周备份,直到备份驱动器的空间用尽。一旦空间耗尽,Time Machine 会删除最旧的备份集,以便腾出空间来存储最近的数据版本。勾选自动备份以允许 Time Machine 执行此操作。
选择您要备份的数据的选项有些有限。默认情况下,Time Machine 会备份整个设备,包括系统文件、应用程序、账户、偏好设置、电子邮件、音乐、照片、电影和文档。点击选项,可以通过图 9-4 所示的对话框排除其中的任何内容。

图 9-4:Time Machine 备份选项
总体而言,Time Machine 是一个强大的解决方案,用于备份和恢复您的 Apple 设备。
34: 使用 Linux duplicity
在 Ubuntu 中,有多种实用工具可用于创建文件备份。最简单易用的是duplicity,它是一个命令行工具,可以将完整和增量备份档案创建到本地存储、外部硬盘或网络位置。使用以下命令在您的 Ubuntu 设备上安装 duplicity:
$ `sudo apt install duplicity`
一旦命令完成,使用-h选项执行 duplicity,显示其帮助文件并确认安装成功:
$ `duplicity -h`
Usage:
duplicity [full|incremental] [options] source_dir target_url
duplicity [restore] [options] source_url target_dir
duplicity verify [options] source_url target_dir
duplicity collection-status [options] target_url
duplicity list-current-files [options] target_url
duplicity cleanup [options] target_url
duplicity remove-older-than time [options] target_url
duplicity remove-all-but-n-full count [options] target_url
duplicity remove-all-inc-of-but-n-full count [options] target_url
duplicity replicate source_url target_url
`--snip--`
阅读输出内容,熟悉可用的选项和配置。在接下来的部分,我们将讨论一些最常用的功能。
使用 duplicity 创建本地备份
以下示例使用 duplicity 创建用户主目录的初始完整备份,并将输出保存到本地系统的/tmp/目录:
$ `duplicity /home/``user` `file:///tmp/`
Last full backup date: none
GnuPG passphrase for decryption:
Retype passphrase for decryption to confirm:
--------------[ Backup Statistics ]--------------
StartTime 1634779305.32
EndTime 1634779305.94
ElapsedTime 0.62 (0.62 seconds)
SourceFiles 139
SourceFileSize 5793461 (5.53 MB)
NewFiles 139
NewFileSize 5793461 (5.53 MB)
DeletedFiles 0
ChangedFiles 0
ChangedFileSize 0 (0 bytes)
ChangedDeltaSize 0 (0 bytes)
DeltaEntries 139
RawDeltaSize 5465781 (5.21 MB)
TotalDestinationSizeChange 660694 (645 KB)
Errors 0
-------------------------------------------------
请注意,目标目录(备份档案将被保存的地方)必须具有file://前缀。/tmp/ 目录是备份的临时存放位置;一旦备份完成,您应将备份文件移至其他地方,或保存到其他位置。第一次运行此命令时,duplicity 会对源文件或文件夹进行完整备份。之后再次执行相同命令时,将创建源数据的增量备份。该命令输出统计信息,如列表中所示,包括备份操作的开始和结束时间、包含的文件数量以及备份档案的总大小。使用 duplicity 创建的备份必须用密码短语进行保护。
要创建另一个完整备份,请指定full选项,如下所示:
$ `duplicity full /home/``user` `file:///tmp/`
这样做将强制 duplicity 创建完整的备份,而不是增量备份。
使用 duplicity 创建网络备份
将备份保存到网络位置比保存到本地文件夹更为理想,原因有几点。将备份保存到本地存在风险,因为如果丧失对端点的访问或它变得不可用,你将无法从其他位置恢复备份。此外,如果对手获得了系统的访问权限,他们也可以访问你的(加密的)备份。因此,将备份保存到远程位置(如文件服务器)更为安全。这可以通过 duplicity 内置的 rsync 功能实现。以下命令假设你已按照 第一章的说明创建 SSH 密钥并使用 SSH 密钥认证,而不是密码认证。如果不是,请返回并完成此步骤。SSH 密钥认证需要使用在本地和远程端点之间共享的公钥/私钥对,使得它们能够进行加密安全通信,相较于使用密码或口令认证,它提供了更高的安全性。
$ `duplicity /home/``user` `rsync://``user@server_ip//path/to/folder/`
一旦你决定了要备份的文件和文件夹,以及备份位置,就可以使用 Crontab 安排 duplicity 定期备份你的文件,Crontab 是 Linux 内置的一个作业管理工具,详细信息请参阅 第 27 项 和 第 122 页:
$ `sudo crontab -e`
`--snip--`
# m h dom mon dow command
`0 0 * * 1 duplicity /home/``user` `rsync://``user@server_ip//path/to/folder/`
`0 2 1 * * duplicity full /home/``user` `rsync://``user@server_ip//path/to/folder/`
Crontab 应用程序的 -e 选项表示你将编辑 cron 文件和由 cron 维护的计划任务。此示例中 Crontab 中显示的命令安排 duplicity 每天午夜运行,创建增量备份,并在每月的第一天凌晨 2 点强制创建全备份。
恢复 duplicity 备份
使用命令行恢复通过 duplicity 创建的备份:
$ `duplicity restore file:///tmp/ /home/``user/backup_folder_name/`
输入 restore 命令并指定源路径和目标路径,可以将备份集中的所有文件恢复到指定位置。
如果需要,还可以使用各种选项从备份集中恢复特定的文件和文件夹。以下是一个示例:
$ duplicity `-t 3D --file-to-restore /home/user/Documents/test.txt \`
` file:///tmp/ /home/user/Documents/restored_file`
在此命令中,我们调用 duplicity,告诉它从三天前的备份中恢复 test.txt 文件(在 --file-to-restore 参数后面指定),该备份位于本地系统的 /tmp/ 文件夹中,并将恢复后的文件保存到 /home/user/Documents/ 文件夹中。有关恢复文件和可用选项的更多信息,请查看 duplicity 的手册页。
其他 duplicity 注意事项
duplicity 工具还有许多其他强大的选项。你可能希望将某些文件或文件夹排除在备份之外;例如,在创建用户数据的备份时,通常会希望排除系统文件夹。使用 --exclude 参数可以排除文件和文件夹:
$ `duplicity --exclude /proc --exclude /mnt / file:///tmp/`
当备份完成后,使用verify参数,并交换源和目标位置,通过原始备份命令确认它们已成功创建:
$ `duplicity verify file:///tmp/ /home/``user``/`
Local and Remote metadata are synchronized, no sync needed.
`--snip--`
Verify complete: 325 files compared, 0 differences found.
如果输出没有显示错误,说明备份成功。
有时你可能想要删除较旧的备份,可能是因为它们不再需要,或者为了为新的备份腾出空间。首先,使用collection-status参数查看备份集中的可用备份:
$ `duplicity collection-status file:///tmp/`
`--snip--`
Collection Status
-----------------
Connecting with backend: BackendWrapper
Archive dir: /home/user/.cache/duplicity/c2731c0788339744944161fd8afb74dd
Found 1 secondary backup chain.
Secondary chain 1 of 1:
-------------------------
Chain start time: Wed Oct 20 19:53:09 2022
Chain end time: Wed Oct 29 20:11:39 2022
Number of contained backup sets: 2
Total number of contained volumes: 2
Type of backup set: Time: Num volumes:
Full Wed Oct 20 19:53:09 2022 1
Incremental Wed Oct 29 20:11:39 2022 1
-------------------------
Found primary backup chain with matching signature chain:
-------------------------
Chain start time: Wed Oct 20 20:11:53 2022
Chain end time: Wed Oct 20 20:11:53 2022
Number of contained backup sets: 1
Total number of contained volumes: 1
Type of backup set: Time: Num volumes:
Full Wed Oct 20 20:11:53 2022 1
-------------------------
No orphaned or incomplete backup sets found.
一旦你知道备份集中的备份数量以及它们的年龄,你可以根据年龄删除较旧的备份:
$ `duplicity remove-older-than 3D file:///tmp/`
3D表示超过三天的备份。
你也可以删除除了所需数量的完整备份之外的所有备份:
$ `duplicity remove-all-but-n-full 1 file:///tmp/`
这里的1表示使用 duplicity 删除备份集中除最近期完整备份外的所有备份。阅读 duplicity 的手册页面,熟悉创建、恢复或删除备份的可用选项。
Cloud Backup Solutions
尽管像 Google Drive 和 Dropbox 这样的云服务并不是真正的备份,它们能够在云端保留你本地数据的副本(类似于异地备份),在其他系统上保留第三副本,并维护每个文件的版本历史——并且这些操作都是一致且定期进行的。这些服务中的大多数还提供一定量的免费存储空间,因此你可以先试用它们,如果觉得合适,再升级到付费计划。
Google Drive 和 Dropbox 通常是为文件共享和在线协作设计的,而不是用于备份数据。使用专门针对数据备份的服务,尽管不是免费的,通常会提供更多的功能、细致的控制和更低成本的存储。Backblaze 和 Carbonite 是两个可靠的云备份服务,它们会在本地加密你的数据,并通过计算机上的客户端应用程序自动备份。Backblaze 会备份你的文件,而 Carbonite 则能够备份你整个计算机。一般来说,选择那些能在静止和传输过程中加密数据的服务。Carbonite 和 Backblaze 目前都支持 Mac、Windows 和 Linux。
Backblaze
如果你需要一个简单的、无需关注的备份解决方案,Backblaze 是一个不错的选择。下载并安装后,它会立即开始将你的文件备份到 Backblaze 的云服务器,并且会持续进行,除非你设置为停止。虚拟机文件和文件夹是唯一会自动排除的文件,尽管你可以将它们从排除列表中移除。你不仅能够备份计算机内部硬盘,还能备份任何连接的外部硬盘。Backblaze 会保留你文件的所有版本,最长达 30 天,且可以通过支付额外费用将其延长至一年或更长时间。你可以通过应用程序(如图 9-5 所示)、网页界面、移动应用,或者通过让 Backblaze 将你的文件邮寄到你手中的 USB 驱动器来恢复你的文件。

图 9-5:Backblaze 图形用户界面
Backblaze 提供的安全功能值得考虑。你的文件首先由应用程序进行加密,通过 SSL(加密传输)传输到云端,然后存储在 Backblaze 服务器上,且始终处于加密状态。更棒的是,你可以配置自己的解密密钥,这样 Backblaze 自身无法解密你的数据,这为任何可能获取你加密数据的攻击者增加了额外的复杂性。你还可以启用双因素认证,除了密码、解密密钥和电子邮件地址外,任何想访问你的数据的人,包括你自己,都需要一个一次性密码。结合这些功能,任何第三方试图访问你的数据时,都将面临多重防护。此外,Backblaze 是市场上最便宜的云备份解决方案之一。
Carbonite
如果你需要一个备份提供商,能够在发生灾难性故障时恢复整个计算机,Carbonite 是一个可能的解决方案。在极端情况下,比如遭遇勒索病毒,拥有能够将你的计算机恢复到操作系统设置和配置的能力,以及恢复你的关键文件是很有益的,因为你可能会发现整个操作系统被破坏或无法使用。Carbonite 提供多个不同价格等级的计划,你可以根据具体需求选择合适的保障级别。与 Backblaze 一样,Carbonite 会对所有备份的数据进行本地加密,数据通过 SSL 传输到云端,并在 Carbonite 服务器上进行加密。根据你选择的计划,它可以备份外部硬盘,并提供(在某些情况下)无限量的云存储。Carbonite 还会无限期保存你备份的文件,并且不会删除超过 30 天的文件版本。
下载并安装应用程序后(如图 9-6 所示),它会自动开始上传第一次备份的数据。你可以指定哪些文件包含在内或排除在外。

图 9-6:Carbonite GUI
与 Backblaze 类似,Carbonite 会在后台运行,持续备份你的数据。当你想从备份中恢复某个文件时,可以通过应用程序来进行恢复。没有可用的网页界面或移动应用程序。
虚拟机快照
虚拟机提供了物理计算机无法比拟的许多优点。它们能够共享硬件(处理器和内存),启动或重启非常快速,并且可以根据特定用途创建只包含所需资源的虚拟机。虚拟机最棒的地方之一就是能够创建快照。
虚拟机快照是某一时刻虚拟机的副本。快照通常包括与虚拟机相关的所有信息,包括快照拍摄时的电源状态(开、关或暂停/挂起)、虚拟内存的内容以及虚拟硬盘的内容。
每当你对虚拟机进行重大更改时,最好在修改之前创建该虚拟机的快照,以防修改会导致虚拟机损坏。拥有在做出修改之前的快照,可以让你将虚拟机恢复到已知良好的配置状态,就好像这些修改从未发生过一样。这就像是现实生活中的撤销按钮。
所有主要的虚拟机软件(如 VMware、VirtualBox 和 Hyper-V)都能够创建它们管理的虚拟机的快照。图 9-7 显示了 VMware 快照管理器的示例。

图 9-7:VMware 快照管理器
在快照管理器中,你可以使用“拍摄快照”按钮创建一个新的快照,转到特定的快照(即将虚拟机恢复到某个特定快照的时间点),删除或克隆快照,或者启用 AutoProtect,这是一种按预定计划创建快照的功能,允许你从多个时间点恢复快照。大多数虚拟化平台都支持快照功能,但设置和选项可能会有所不同。
虽然快照从字面意义上讲不是备份,但它们在恢复虚拟机工作配置时非常有用。你不应该仅仅依赖快照来进行备份,但将其作为备份策略的一部分通常是非常方便的。一个明智的解决方案是将所有虚拟机文件包含在你的常规备份策略中。
测试和恢复备份
一旦你制定了备份策略,并且你的最重要数据已经定期在本地和远程备份,接下来就要定期测试这些备份。如果你丢失了数据,并试图从备份中恢复,却发现备份已损坏,那么你的备份策略就毫无价值了。
要在 Windows 上恢复文件,请打开备份和恢复菜单。点击恢复我的文件或恢复所有用户的文件。你可以通过使用“浏览文件”或“浏览文件夹”选项查看备份的内容。你也可以通过此菜单搜索备份的内容。
要在 Mac 上使用 Time Machine 恢复文件,请浏览您想要恢复文件的文件夹,如“文档”或“下载”文件夹。打开 Time Machine,然后使用箭头和时间线浏览可用的本地快照和备份。选择您要恢复的一个或多个项目,然后点击恢复。这可以包括文件、文件夹或整个磁盘。恢复的项目将返回到计算机上的原始位置。
要使用 Carbonite、Backblaze 或任何其他解决方案恢复文件,请打开网页门户或应用程序 GUI。然后,找到您要恢复的文件或文件夹,并按照提供的说明操作。
当您完成首次完整备份时,随机测试一些文件或文件夹进行恢复。值得尝试选择一些较大的文件进行测试,因为文件越大,备份中途失败的概率就越高。如果恢复一个数据样本并且一切正常,请设置提醒,分别在一周后和一个月后再次进行相同的操作。如果所有测试恢复都顺利进行,您可以选择以后多久测试一次备份。建议在一到六个月之间进行测试。
完成这些步骤后,您的备份策略应足够完整和稳健,可以应对几乎所有的数据丢失事件或灾难。
总结
本章讨论的解决方案适用于大多数情况,但并不能保证完全符合您的需求。在寻找备份解决方案时,请确保所选择的备份方案适用于您的操作系统,能够创建包含您想要备份的数据(而且只有这些数据)的备份,并且能够进行您想要创建的备份类型。它还应能够按照预定计划自动创建备份,或持续创建数据备份。最后,请确保一旦备份完成,您能够在合理的时间内恢复数据,并且对恢复数据的完整性充满信心。
第十章:# 使用检测和报警监控你的网络

网络监控提供了对网络活动的实时可视化,使你能够领先于潜在的威胁,并(理想情况下)在对方进行任何破坏性行为之前将其阻止。监控你的网络是一个巨大的工作,因此警报通常是调查的有用起点。如果没有有意义的警报,网络监控就像是在大海捞针——试图在一个非常大的数据集内识别恶意活动。
你的防火墙、代理、杀毒软件和其他解决方案应该至少运行一个月,确保它们正常工作后,再开始尝试主动监控你的主机和网络流量,确保它们正确运作。到目前为止,一切相对是被动的;设置完成后,除非需要更新或更改配置,否则无需你进一步操作。
由于其本质,主动监控和报警可能需要相当多的时间和精力——不仅仅是实施,还包括维护,尤其是当网络扩展时,这一点尤为明显。你不仅需要定期检查网络监控软件是否已识别出任何威胁或异常行为,还需要调查这些行为,并可能需要采取措施缓解已识别的活动。根据网络的规模,监控它可能需要一个或多个人全职工作。
本章将为你提供必要的知识和工具,以便成功地监控你的网络并提醒你可疑行为。我们将讨论如何、何时以及在哪里在你的网络中实现网络流量接入点(TAP)和交换机端口分析仪(SPAN),以实现网络流量的捕获、监控和分析。最后,我们将使用 Security Onion(一套免费的网络安全监控工具)构建一个网络监控设备,并讨论如何最好地利用其内置功能。
网络监控方法
你可以使用几种方法来监控和捕获网络流量,以进行实时或事后分析和报警。你选择的方法主要取决于网络的硬件,因为每个设备的功能不同。我们将在以下章节中讨论两种最常见的方法。
网络流量接入点
在没有交换机的小型网络中,你可以安装一个网络流量接入点(TAP)来监控通过它的数据。TAP 是一个内联设备,安装在网络中的两个节点之间;它成为现有传输介质(如以太网电缆)的延伸,位于这两个设备之间。在图 10-1 中,TAP 位于防火墙和路由器之间。

图 10-1:网络 TAP 的放置
在这种配置中,所有经过路由器与防火墙之间的流量都将由 TAP 发送到监控设备,并在其中存储以供分析。
在放置 TAP 时,要考虑你实际想要看到和调查的内容。在像图 10-1 中所示的配置中,你将捕获到所有经过终端设备与防火墙之间的流量(即网络的边界)。监控主要的出口点让你调查像数据外泄这样的事件,即攻击者试图通过将数据发送到网络外部来窃取你的数据。然而,使用这种配置,你将无法看到终端设备之间的流量,因为这些流量由无线路由器处理,永远不会到达 TAP。
如果你将 TAP 放置在防火墙之后(而不是放在互联网一侧),你将看不到任何来自互联网试图访问被防火墙阻止的内部网络的流量。如果 TAP 放在防火墙前面,你将看不到防火墙阻止的出站流量;安全监控系统也将失去防火墙的保护,成为进入网络的一个容易途径。根据你对这些场景的舒适度来决定 TAP 的放置位置。在大多数情况下,最好将 TAP 放在防火墙之后(网络内部),并查看防火墙日志,找出 TAP 未能看到的流量。
TAP 是一种内联设备。需要注意的是,如果 TAP 无法使用或脱机——如果它的任何网络端口出现故障——整个网络将失去对互联网的访问。你的终端设备仍然应该能够通过路由器相互通信,但流量将不再通过 TAP。
有几款 TAP 设备价格合理。其中最简单的一种是Dualcomm ETAP。这种 TAP 的一个可能配置是,将防火墙(如图 10-1 所示)连接到 A 端口,将 B 端口连接到无线路由器,并将一根独立的电缆连接到你的网络安全监控设备的监控端口(在下一节中讨论)。这种配置允许流量像没有 TAP 一样流经网络,只不过它会被网络安全监控系统截取、监控和分析。
交换机端口分析仪
网络 TAP 的替代方案是交换机提供的交换机端口分析(SPAN)或镜像端口(可互换术语)功能。SPAN 与 TAP 的功能相同;它将所有通过源端口的数据镜像(或复制)到交换机上的目标 SPAN 端口。你的网络安全监控系统然后连接到 SPAN 端口,捕获网络流量以进行分析和警报。在大多数现代交换机中,可以创建多个源端口的 SPAN 配置,这样你就可以从交换机上的任何端口捕获数据。
小型网络中的 SPAN 配置可能如下图所示图 10-2,其中防火墙或其他系统为终端提供 IP 地址。每个主机通过以太网连接到交换机的一个端口,然后网络安全监控设备连接到交换机上配置的 SPAN 端口。与 TAP 不同,如果交换机上的端口发生故障,网络的其余部分仍然可以继续运行,但如果交换机因电源故障而完全停机,整个网络将与之一起停机。

图 10-2:带有交换机和 SPAN 端口的小型网络
与 TAP 配置不同,在交换机上设置 SPAN 后,你不仅可以捕获和分析计算机间的流量,还可以捕获进出数据。然而,你仍然会遇到布局问题;当交换机位于防火墙的内部(这应该是这样)时,你的安全监控系统将无法看到被防火墙阻止的流量。
35: 配置 SPAN 端口
要在受管交换机上配置 SPAN 端口,如我们在第二章中使用的 Netgear 交换机,请按照以下步骤操作:
-
1. 使用管理员凭证登录交换机。
-
2. 选择系统▸监控▸镜像。
-
3. 在出现的端口镜像配置表中,点击你希望捕获网络流量的源端口进行选择。已选择的端口会有一个勾选标记。
-
4. 在目标端口下拉框中,输入作为 SPAN 端口的端口,用于连接到你的安全监控系统。
-
5. 最后,在镜像下拉菜单中,选择启用▸应用。
无论你选择设置 TAP 还是带有 SPAN 端口的交换机,都需要一个能够聚合收集数据的网络监控解决方案。目前,适用于小型网络的最佳解决方案是 Security Onion,它包含了用于捕获和聚合网络数据的各种组件,并使你能够快速分析这些数据。
Security Onion
Security Onion 是一个开源平台,用于威胁狩猎、网络安全监控和日志管理。它是一个操作系统,类似于 Ubuntu,其中包括我们将用来监控网络中安全和配置问题的多个开源工具。
Security Onion 的工具包括 suricata,一个入侵检测系统,以及 zeek,一个用于分析网络流量以识别异常行为的软件框架。Grafana 是一组可视化和仪表板,用于监控 Security Onion 系统的健康状况,osquery 收集关于网络中端点及其运行操作系统的数据进行分析。Wazuh 与 osquery 类似;它是一个基于代理的工具,从端点收集可分析的数据,用于主动端点检测和响应(在发生安全事件时)。最后,Strelka 是一个实时文件扫描工具,分析网络流量并扫描任何经过网络的文件;它有助于识别恶意软件或数据外泄。
在接下来的章节中,我们将讨论如何使用 Security Onion 及其内置工具来创建你的网络安全监控系统。我们将探讨如何利用这些工具开始监控网络,并在问题发生时进行分类和调查。你可以选择购买或自行构建 Security Onion 设备。Security Onion Solutions 提供了预配置的设备,开箱即用。
36: 构建 Security Onion 系统
要构建一个 Security Onion 系统,你需要一台至少配备两个网络接口的设备:一个管理接口和一个捕获接口(连接到 TAP 或 SPAN)。我们将使用一台 Intel NUC(小型计算单元),它具有两个以太网端口,具有高度的可定制性,并且根据你的预算和需求提供不同的价格选择。以下是 Security Onion 文档中详细列出的最低硬件规格:
-
• 12GB 的 RAM
-
• 四个 CPU 核心
-
• 200GB 的存储空间
-
• 两个网络接口
另一个需要考虑的因素是你需要多少存储空间。作为参考,具有 2TB 内部存储空间的 NUC 可能能够存储约三周的数据,具体取决于你的网络中设备数量、用户数量和网络流量的多少。超过这个时间后,数据将进入滚动周期,旧数据会被删除,以腾出空间存储新数据。为了增强网络中的事件响应能力,保存更多数据会更有利。如果你发现网络中有一个入侵者已经存在了 12 个月,但你只有一个月的数据,那么你将永远无法确定根本原因,这将使得驱逐他们并防止问题再次发生变得困难。
一旦你有了 NUC(或类似设备),就可以开始安装 Security Onion。在这一阶段,最好将计划用于管理的网络端口(不是用于捕获网络流量的端口)连接到你的网络,以便设置其配置。无论你使用哪一个网络端口来管理和捕获流量都没有关系。此设备需要一个静态 IP 地址,虽然你可以在设备本身上进行配置,但最好在路由器或负责 IP 地址租用的设备上(如你的无线路由器或 pfSense 设备)配置静态地址。只连接 NUC 上的管理端口(仅此端口)将使得在安装和配置其余软件时更容易识别。完成此过程后,你可以独立配置捕获端口。现在应该配置管理接口的静态 IP 地址,因为我们将安装的某些代理有基于该地址的要求和依赖关系,因此稍后更改它可能会造成一些问题。
安装 Security Onion
你可以从 ISO 文件安装 Security Onion(直接从 Security Onion Solutions 网站 securityonionsolutions.com/software/ 获取),或手动使用 CentOS 7 作为基础操作系统,然后像安装其他 Linux 应用程序一样安装 Security Onion 包(请注意,Security Onion 仅支持 CentOS 7 操作系统)。使用 ISO 文件是创建 Security Onion 系统更简单和快速的方法,而手动安装则需要更多的操作。不过,手动安装可以让你在磁盘分区等方面有更多的控制。如果你对这一点感兴趣,可以选择手动安装方法。如果没有,使用 ISO 文件进行安装即可。
从 ISO 文件安装 Security Onion
首先从 Security Onion Solutions 下载最新的 ISO 文件,并按照第一章中“创建物理 Linux 系统”的步骤,从 ISO 文件创建可启动的 USB 驱动器。将可启动的 USB 驱动器插入你的 NUC,启动 NUC,你将看到 Security Onion 安装向导。按照以下步骤完成安装:
-
1. 向导将提示你安装 Security Onion,这将清除所有数据和分区。输入yes并按 ENTER 键接受并开始安装过程。
-
2. 提示时输入管理员用户名;然后按 ENTER 键。
-
3. 为用户输入一个强密码短语;然后按 ENTER 键。
-
4. 重复输入密码短语以确认;然后按 ENTER 键开始安装。
-
一旦安装完成,计算机将重新启动。使用你新创建的凭证登录,Security Onion 设置向导将弹出。按 ENTER 继续。
-
使用箭头键,选择安装以运行标准的 Security Onion 安装;然后按 ENTER。
在此时,完成 Security Onion 安装的过程在 ISO 文件安装和手动安装两种方式下是相同的。跳转到第 157 页中的“完成 Security Onion 安装”部分。
手动安装 Security Onion
你可以通过在 NUC 上安装 CentOS 7 并在其上安装 Security Onion 的包和工具,完全从零开始安装 Security Onion。为此,按照以下步骤操作:
-
从
www.centos.org/下载最新的 CentOS 7 ISO(正确的格式是 x86_64)。 -
按照第一章中“创建物理 Linux 系统”部分的步骤,从 ISO 文件创建一个可引导的 USB 驱动器。
-
将可引导的 USB 插入你的 NUC 并从 USB 启动。你将看到几个选项;选择测试此介质并安装 CentOS 7。
-
在此时,将出现图形化安装向导。选择你需要的语言并点击继续。
-
设置正确的时区和键盘布局。
-
在“软件选择”下,建议选择带 GUI 的服务器,以便于管理。
-
在系统▸安装目标下,选择你计划安装 Security Onion 的内部磁盘,然后选择我将配置分区。点击完成继续进入分区向导。分区定义了硬盘存储如何在系统的用户和应用程序之间划分。
-
选择LVM 分区并创建以下分区:
-
a. /boot:CentOS 将从此分区启动;此分区应至少有 500MB 的可用空间。
-
b. /boot/efi:启动分区的一部分;应至少为 500MB。
-
c. /:文件系统的根目录;应为 300GB。
-
d. /tmp:用于临时文件;应为 2GB。
-
e. swap:用于交换文件;应为 8GB。
-
f. /home:存放所有用户文件的空间;应为 40GB。
-
g. /nsm:存放所有安全工具和捕获的数据;应分配剩余的驱动器空间。
-
-
点击完成▸接受更改以将更改写入磁盘。
-
点击开始安装以安装操作系统。
-
在接下来的屏幕上,设置你的 root 密码并创建一个非 root 的管理员账户。如果你想通过 SSH 连接到该系统,确保你的管理员账户具有强密码。
-
安装完成后,重启计算机并移除安装 USB。然后,启动进入你的 CentOS 操作系统。
-
接受许可信息。
-
14. 你可能需要打开网络卡以启用网络。点击网络和主机名,将网络按钮切换为开启,然后点击完成。
-
15. 点击完成配置。
安装了 CentOS 后,接下来安装 Security Onion。首先,通过 SSH 连接到服务器或直接登录。将目录切换到在初始设置过程中创建的 /nsm 分区:
$ `cd /nsm`
使用 sudo yum install 安装 Git(一个软件管理应用),然后使用 git clone 下载 Security Onion:
$ `sudo yum install git -y`
$ `sudo git clone \`
` https://github.com/Security-Onion-Solutions/securityonion`
(Ubuntu 基于 Debian Linux,并使用 apt 工具来管理软件包,而 CentOS 基于 Red Hat Linux,并使用 yum。)
导航到新创建的 securityonion 目录,并运行设置脚本:
$ `cd /nsm/securityonion/`
$ `sudo bash so-setup-network`
运行此脚本将启动一个交互式安装向导,指导你完成 Security Onion 服务器的初始设置和配置。
完成 Security Onion 安装
基本的操作系统配置完成后,接下来你将开始安装和配置用于监控和分析网络流量的工具。Zeek 是一个安全监控平台,它能帮助你更高效地分析网络流量,并自动对网络中的可疑活动发出警报。它通过使用包含可疑或恶意活动、软件和网络流量信息的规则集来实现这一点,比如你将在此使用的 ETOPEN 规则集。
无论你是如何安装 Security Onion,都请按照以下步骤完成安装过程:
-
1. 按下 ENTER 键继续跳过欢迎界面(并进入后续所有界面)。
-
2. 在安装类型页面,使用箭头键导航到 STANDALONE,然后按空格键选择该选项。
-
3. 如果你使用的是 Security Onion ISO 镜像,在下一页面选择标准,表示此机器可以连接互联网。
-
4. 如果你执行了 Security Onion 的手动安装,在下一页面键入同意以接受 Elastic 许可证。
-
5. 在下一页面,为简便起见,保留默认主机名,或者根据需要更改主机名(在有多台服务器的大型安装中,修改主机名会更有利)。如果系统提示更改主机名,请选择继续。
-
6. 在下一页面,输入此计算机的简短描述或留空。
-
7. 在网络卡配置页面,如图 10-3 所示,选择带有 Link UP 的接口作为管理接口。此时它应该是唯一连接到网络的接口。

图 10-3:网络接口卡设置向导
-
8. 按下空格键设置监控接口。
在管理界面页面,你可能会收到有关使用 DHCP 的提示性错误;只要你已经为该设备配置了静态地址,可以忽略此消息。
-
9. 在被询问这台计算机如何连接到互联网时,选择Direct。
-
10. 在操作系统补丁计划页面选择Automatic,以保持操作系统自动更新。
-
11. 指定你的家庭网络地址范围,在第一章中可以找到该范围。如果你的网络使用的是 10.0.0.0/8 地址范围,在框中保留该地址并删除其他两个子网。如果你的网络使用的是 192.168.0.0/16 地址范围,保留该地址并删除其他两个,依此类推。
-
12. 当被询问安装哪种类型的管理工具时,选择BASIC。
-
13. 选择ZEEK作为生成元数据的工具。
-
14. 选择ETOPEN作为生成警报的 IDS 规则集。
注意:ETOPEN 是一个开源规则集,会定期更新新出现的威胁和警报。ETPRO 和 TALOS 与 ETOPEN 类似,但它们需要订阅。对于小型网络,ETOPEN 已足够。
-
15. 向导会询问你要安装 Security Onion 工具套件中的哪些组件。选择Osquery、Wazuh和Strelka。
-
16. 如果被询问是否保留默认的 Docker IP 范围,选择Yes。
-
17. 输入你的电子邮件地址作为 Security Onion 管理员。
-
18. 输入并重新输入你的账户密码。
-
19. 在被询问如何访问 Web 界面时,选择IP。
-
20. 为soremote用户账户设置一个强密码(用于执行一些管理操作)。
-
21. 选择BASIC以使用推荐的设置安装网络安全监控组件。
-
22. 输入2作为 Zeek 和 Suricata 进程的数量。
进程的数量决定了系统能够处理的网络流量大小。对于小型网络,两个进程应该足够;如果需要,稍后可以更改此设置。
-
23. 如果被询问是否配置 NTP 服务器,选择Yes。网络时间协议(NTP)用于保持端点时间同步。最好保持你的监控服务器与时间服务器同步,以防止时间漂移,这可能会导致排查警报时出现问题。浏览
www.ntppool.org/并选择你所在区域的 NTP 服务器,保持 Security Onion 服务器时间同步。 -
24. 在被询问时选择NODEBASIC。
-
25. 按下 ENTER 键运行so-allow,在系统提示时正确配置防火墙,允许访问所有正在安装的工具。
当被询问是否允许某个 IP 地址访问你的网络监控系统时,你可以选择只允许单个计算机或设备访问 Security Onion Web 界面,或者允许网络中的任何主机访问。出于安全考虑,你只允许单个 IP 地址访问。
-
26. 输入你计划使用的 IP 地址;然后按 ENTER 键。
-
- 最后,通过按 TAB 选择Yes,然后按 ENTER 完成设置向导并提交更改,以接受你刚刚创建的配置。
注意,Security Onion 和其一些工具(如 Zeek)可以在集群配置中运行,其中代理安装在多个系统上以增强数据收集和处理能力。在小型网络中,单独的系统已足够。在拥有多个网络段和交换机的大型网络中,集群配置可能更为合理。
安装结束时,屏幕将显示访问 Security Onion Web 界面的 URL;请记下这个网址(应该是http://<your_server_ip>/)。系统将重启。重启后,你可以通过该 URL 使用之前输入的电子邮件地址和密码进行登录。为了测试 Security Onion 的配置,运行以下命令:
$ `sudo so-status`
该命令列出了 Security Onion 正在运行的工具及其状态,如果一切正常,状态应显示为 OK。
如果有任何服务未启动,稍等几分钟后再次运行状态命令。如果它们仍然无法启动,可以尝试使用以下命令手动启动服务:
$ `sudo so-servicename-stop`
$ `sudo so-servicename-start`
$ `sudo so-servicename-restart`
如果你仍然无法启动服务,请重启计算机。如果一切方法都失败,重新安装 Security Onion。
一旦能够访问 Security Onion 控制台,你将看到左侧菜单列出了你可以使用的所有工具(请参见图 10-4)。

图 10-4:Security Onion 工具
此时,点击Kibana,浏览器将打开一个新标签页。由于你尚未在设备上连接捕获端口,应该会看到极少的记录。
将此端口连接到之前配置的 SPAN 或 TAP。完成后,几分钟后刷新页面,查看 Kibana 是否已显示新获取的数据。
37: 安装 Wazuh
Security Onion 的附加工具帮助你理解网络中的情况,并采取行动进行调查、缓解和修复问题。其中一个工具包是 Wazuh。
Wazuh 是一个开源的端点检测和响应(EDR)平台,用于监控终端设备的恶意活动,在 Security Onion 控制台中提醒你,并提供阻止网络流量、停止恶意进程以及隔离恶意文件的响应能力。
使用像 Wazuh 这样的代理可能会引起争议。在大型网络中,通常由于网络上活动繁多,尤其是跨所有系统添加新内容可能导致稳定性问题,或者在带宽等有限资源方面产生/加剧挑战。对于小型网络来说,这通常不是问题,因为容量不会在那么多设备、用户或进程之间共享,而且通常没有那么多的解决方案争夺资源。
安装 Wazuh 不会对您小型网络的日常操作产生重大影响。相反,您从额外的监控和安全提升中获得的价值,远远超过使用多个代理可能带来的任何负面后果。最终,是否在您网络中的一个、部分或所有终端上安装这些代理由您决定。覆盖和网络监控越完整,您的网络安全性可能就越高。
本节提供了在 Windows、macOS 和 Linux 上安装 Wazuh 代理的说明。
在 Windows 上安装 Wazuh
要在您的 Windows 终端上安装 Wazuh 代理,请按照以下步骤操作:
-
1. 登录到您的 Security Onion 控制台,并在左侧菜单中点击下载。
-
2. 点击MSI 安装程序代理选项以下载正确的安装程序;然后运行下载的可执行文件。
-
3. 接受许可协议并点击安装。
-
4. 安装完成后,勾选运行代理配置界面复选框,然后点击完成。
-
5. 要将此新系统添加到您的 Security Onion 中,请通过 SSH 登录到 Security Onion 并运行
manage_agents脚本。按照提示操作,按A添加代理,按L列出代理以确认添加是否成功,按E提取新代理的认证密钥:$ `sudo docker exec -it so-wazuh /var/ossec/bin/manage_agents` `--snip--` Choose your action: A,E,L,R or Q: `A` - Adding a new agent (use '\q' to return to the main menu). Please provide the following: ❶ * A name for the new agent: `Test` * The IP Address of the new agent: `192.168.1.50` Confirm adding it?(y/n): `y` Agent added with ID 002. `--snip--` Choose your action: A,E,L,R or Q: `L` Available agents: ID: 001, Name: securityonion, IP: 192.168.1.49 ❷ ID: 002, Name: Test, IP: 192.168.1.50 ** Press ENTER to return to the main menu. `--snip--` Choose your action: A,E,L,R or Q: `E` Available agents: ID: 001, Name: securityonion, IP: 192.168.1.49 ID: 002, Name: Test, IP: 192.168.1.50 Provide the ID of the agent to extract the key (or '\q' to quit): `002` Agent key information for '002' is: ❸ MDAyIFJvcnkgMTkyLjE2OC4xL . . . ** Press ENTER to return to the main menu. `--snip--` Choose your action: A,E,L,R or Q: `Q` manage_agents: Exiting.添加代理时,您需要提供名称和 IP 地址 ❶。名称使用正在添加的计算机的主机名。运行
hostname命令以查找名称:$ `hostname` Test查找您的 IP 地址(参见项目 8 中的第一章)或查阅您维护的资产列表或网络图。列出代理时,确认是否存在该名称和 IP 地址的代理 ❷。使用代理的 ID 号码获取其认证密钥 ❸。按回车键返回主菜单,并使用
Q选项退出。 -
6. 在您的 Windows 计算机上打开Wazuh 代理管理器(参见图 10-5),输入您的 Security Onion 系统的 IP 地址和代理认证密钥,然后点击保存。
![Wazuh 代理管理窗口截图,显示包括当前 Wazuh 版本、代理及状态等信息。信息下方的文本框允许您输入管理器 IP 地址和认证密钥。下面有保存或刷新按钮。]()
图 10-5:Wazuh 代理配置
-
点击管理▸启动以启动代理。
-
每次你添加代理或对 Security Onion 或与其通信的系统进行更改时,运行
so-allow脚本以启用设备之间的通信(否则,Security Onion 上的主机防火墙将会阻止它)。你应该在终端中进行此操作,登录到通过 SSH 访问的 Security Onion 系统:$ `sudo so-allow` -
当系统提示时,输入
w以添加一个 Wazuh 代理的防火墙规则;然后输入代理的 IP 地址。
Wazuh 现在将管理这台 PC。对于网络中你希望以这种方式管理的所有其他设备(如计算机、笔记本、虚拟机等),重复此过程。系统事件日志将开始显示在你的 Kibana 仪表盘中,因此预计会看到新的数据和警报出现在 Security Onion 中。
在 macOS 上安装 Wazuh
要在你的 macOS 端点上安装 Wazuh 代理,请按照以下步骤操作:
-
登录到你的 Security Onion 控制台,点击下载,并下载 macOS 包。
-
运行安装向导在你的 Mac 上进行安装。
-
一旦完成,登录到你的 Security Onion 系统并运行
sudo so-allow,允许你的 Mac 通过防火墙访问(此操作必须在代理注册之前完成,否则代理无法连接到管理服务器)。 -
按照提示,选择 Wazuh 注册服务,输入
r并输入你的端点的 IP 地址。 -
现在,将代理注册到 Security Onion 服务器:
$ `sudo /Library/Ossec/bin/agent-auth -m` `security_onion_IP`
接下来,你需要将 Security Onion 的 IP 地址添加到 Mac 上的代理配置文件中,这样代理才能与 Security Onion 服务器进行通信。
-
打开/Library/Ossec/etc/ossec.conf 文件并使用文本编辑器进行编辑。
-
找到以下行并将
MANAGER_IP更改为你的 Security Onion 服务器的 IP 地址:<client> <server> <address>`MANAGER_IP`</address> -
重启 Wazuh 代理:
$ `sudo /Library/Ossec/bin/ossec-control restart` -
确认代理已成功配置,可以通过在 Security Onion 服务器上列出代理来验证;运行manage_agents脚本并在提示时输入
L来进行操作:$ `sudo docker exec -it so-wazuh /var/ossec/bin/manage_agents` `--snip--` Choose your action: A,E,L,R or Q: `L` Available agents: ID: 001, Name: securityonion, IP: 192.168.1.49 ID: 002, Name: Computer1, IP: 192.168.1.50 ID: 003, Name: MacBook-Pro.local, IP: 192.168.1.51 ** Press ENTER to return to the main menu. `--snip--` Choose your action: A,E,L,R or Q: `Q` manage_agents: Exiting.
如果你看到 Mac 的主机名和 IP 地址,说明代理已处于活动状态。按回车键返回主菜单,使用Q选项退出。
在 Linux 上安装 Wazuh
要在你的 Linux 端点上安装 Wazuh 代理,请按照以下步骤操作:
-
登录到你的 Security Onion 控制台,点击下载,并下载相关包。对于 Ubuntu,应该是 DEB 包(对于 CentOS 和 Fedora,则是 RPM 包)。
你可以直接从你的 Ubuntu 系统下载包,或者你可以将包下载到 Windows 或 Mac 计算机并将其传输到 Ubuntu 系统:
$ `rsync -ruhP wazuh-agent.deb` `user@linux_ip``:/home/``user`从包文件(如.deb文件)直接安装包时,使用 dpkg 工具,而不是 APT 包管理器(dpkg 是 Debian 包管理器,使用方式与 APT 类似)。
-
要安装 Wazuh 代理,运行以下命令:
$ `sudo dpkg -i wazuh-agent_``3.13.1-1``_amd64.deb`你的包版本号可能不同。
-
接下来,通过 SSH 登录到你的 Security Onion 系统,并运行
sudo so-allow以允许你的 Linux 系统通过防火墙访问。 -
按照提示,选择 Wazuh 注册服务并输入你端点的 IP 地址,使用
r键。 -
注册 Linux 代理并将其连接到 Wazuh 管理服务器(即 Security Onion 服务器):
$ `sudo /var/ossec/bin/agent-auth -m` `security_onion_IP` -
然后,修改你 Linux 系统上的配置文件,允许它与管理服务器进行通信,方法是将 ossec.conf 文件中的
MANAGER_IP占位符更改为 Security Onion 服务器的 IP 地址:$ `sudo nano /var/ossec/etc/ossec.conf` `--snip--` <client> <server> <address>`security_onion_IP`</address> `--snip--` -
重启 Wazuh 代理以开始将数据发送到 Security Onion,使用以下命令:
$ `sudo systemctl restart wazuh-agent` -
最后,通过列出 Security Onion 服务器上的代理来确认代理是否已成功配置;运行
manage_agents脚本并在提示时输入L来执行操作:$ `sudo docker exec -it so-wazuh /var/ossec/bin/manage_agents` `--snip--` Choose your action: A,E,L,R or Q: `L` Available agents: ID: 001, Name: securityonion, IP: 192.168.1.49 ID: 002, Name: Computer1, IP: 192.168.1.50 ID: 003, Name: MacBook-Pro.local, IP: 192.168.1.51 ID: 004, Name: Linux1, IP: 192.168.1.52 ** Press ENTER to return to the main menu. `--snip--` Choose your action: A,E,L,R or Q: `Q` manage_agents: Exiting. -
如果你看到 Linux 计算机的主机名和 IP 地址,代理应该是激活状态。按 ENTER 返回主菜单,然后输入
Q退出。
现在,你可以使用 Wazuh 管理网络中所有类型的计算机。
38: 安装 osquery
osquery 提供了更强的网络可见性。它收集端点数据,如操作系统详情、已安装的软件、命令行历史记录以及正在运行的进程详情;然后你可以查询这些数据,识别可疑活动或未遵循安全策略或配置的设备。与 Wazuh 配合使用时,这些工具为你的网络中的系统提供了详细的视图,展示每个系统正在做什么,合法的还是非法的。一旦安装完成,osquery 使用一个名为 Fleet 的用户界面来显示和管理你监控的端点的详细信息。
在 Windows 上安装 osquery
要在你的 Windows 端点上安装 osquery 代理,请按照以下步骤操作:
-
登录到你的 Security Onion 控制台,点击下载,并下载适用于 Windows 的 osquery 包(MSI 文件)。
-
在 Windows 系统上执行此文件并完成安装向导。
一旦 osquery 安装完成,它将处于后台运行,不会显示用户界面。
-
接下来,通过 SSH 登录到你的 Security Onion 系统,并运行
sudo so-allow以允许你的计算机和 osquery 通过防火墙访问。按提示输入o(代表 osquery)和你的 Windows 系统的 IP 地址。 -
要查看和管理使用 osquery 的系统,登录到你的 Security Onion 控制台。在左侧菜单中,点击Fleet链接以打开 Fleet 管理仪表盘。
当你在端点上安装 osquery,并且运行so-allow来启用 osquery 代理与 Security Onion 服务器之间的通信时,你的管理主机应该会以卡片形式出现在此处;通信开始可能需要几分钟时间。
在 macOS 上安装 osquery
要在您的 macOS 终端上安装 osquery 代理,请按照以下步骤操作:
-
1. 登录到您的 Security Onion 控制台,点击 下载,并下载适用于 Mac 的 osquery 包(PKG 文件)。
-
2. 在您的 Security Onion 服务器上运行
sudo so-allow,并将您的 Mac 添加到 osquery 允许的代理列表中。提示时输入o(代表 osquery)和您的 Mac 的 IP 地址。 -
3. 执行您下载的文件,并在您的 Mac 上完成安装向导。
-
4. 登录到 Fleet Manager Dashboard,点击 添加新主机 来查找您的 Fleet Secret。
-
5. 使用任何文本编辑器,将您的 Fleet Secret 添加到 /etc/so-launcher/secret 文件中。
-
6. 更新 /etc/so-launcher/launcher.flags,使主机名值为
security_onion_IP``:8090,根目录值为/var/so-launcher/``security_onion_IP``-8090:autoupdate hostname 192.168.1.200:8090 root_directory /var/so-launcher/192.168.1.200-8090 osqueryd_path /usr/local/so-launcher/bin/osqueryd enroll_secret_path /etc/so-launcher/secret update_channel stable root_pem /etc/so-launcher/roots.pem -
7. 将 Security Onion 服务器上 /etc/ssl/certs/intca.crt 文件的内容复制到 Mac 上的 /etc/so-launcher/roots.pem 文件中。
几分钟后,您的 Mac 应该会作为一张新卡片出现在 Fleet Manager Dashboard 中。
在 Linux 上安装 osquery
要在您的 Linux 终端上安装 osquery 代理,请按照以下步骤操作:
-
1. 登录到您的 Security Onion 控制台,点击 下载,并下载适用于 Linux 的 osquery 包(Ubuntu 的 DEB 文件,CentOS 的 RPM 文件,等等)。
-
2. 在您的 Security Onion 服务器上运行
sudo so-allow,将您的 Linux 系统添加到 osquery 允许的代理列表中。提示时输入o(代表 osquery)和您的 Linux 系统的 IP 地址。 -
3. 在您的 Linux 系统上安装下载的文件;以下是使用 dpkg 在 Ubuntu 上安装的示例:
$ `sudo dpkg -i deb-launcher.deb`
您的 Linux 系统应该会自动显示为 Fleet Manager 仪表板中的一张新卡片。
网络安全监控速成课程
现在,您已经安装了必要的硬件和软件来监控您的网络是否存在可疑和恶意活动。您需要能够识别问题,发生事件时作出响应,并保持网络、用户和数据的安全。在本节中,我们将介绍如何配置并使用 osquery、Wazuh 和 Security Onion 警报仪表板的基本知识。
使用 osquery
如果您熟悉 关系型数据库 和 结构化查询语言(SQL),那么使用 osquery 对您来说会相对容易。如果不熟悉,下面是一些基础知识。您可以在 Fleet Manager Dashboard 中查看 osquery 管理的网络中设备的所有数据。要进入仪表板,请登录到您的 Security Onion 控制台,网址为 https://<security_onion_IP>/,并在左侧管理员菜单中点击 Fleet。
数据存储在一系列数据表中,每个表包含两个或更多列(也称为元组),其中包含诸如主机名、IP 地址、MAC 地址、运行时间、最后关机时间等信息,每一行都代表一个特定实体,如计算机或笔记本电脑,或更为具体的内容,如设备上的特定用户账户。例如,users表类似于表 10-1。
| 表 10-1:osquery 用户表 |
|---|
| UID |
| --- |
| 0 |
用户名列的第一行数据涉及设备上的testuser账户。每个表都与数据库中其他一个或多个表有关(数据库中有超过 200 个表)。这些表及其关系使你能够执行关于每个管理设备的详细信息和状态的强大查询。
我们可以使用一种叫做 SQL 的查询语言来对这些数据提问,它是一种用于访问和操作数据库的高级语言。一个 SQL 查询如下所示:
`SELECT c1,c2 FROM tablename`
在这个查询中,大写的命令 SELECT 和 FROM 表示你要执行的操作——在这种情况下,要求从名为 tablename 的表中提取第 1 列和第 2 列的数据,分别由 c1 和 c2 参数表示。
实际上,这个查询的格式如下:
`SELECT username FROM users`
`SELECT * FROM users`
第一个命令返回(显示给运行查询的用户)users 表中存在的所有用户名,而不包括其他列。第二个命令返回 users 表中的所有列和所有行(*)。
注意:有多种 SQL 命令可用于以不同方式检索数据;详情请参见 SQL 备忘单 www.sqltutorial.org/sql-cheat-sheet/。也可以查看 osquery.io/ 上的 osquery 文档,了解所有可用表及其数据的列表。
Fleet 在你的 Fleet 控制面板中存储了大量查询。点击页面左侧的查询菜单(见图 10-6)。

图 10-6:Fleet Manager 中存储的 SQL 查询
在此菜单中,您可以滚动浏览可用的查询,或使用页面顶部的搜索栏搜索特定的查询。找到您想要执行的查询后,点击选择它,然后点击右侧的编辑/运行查询按钮。在执行查询之前,您需要选择要查询的设备。选择目标设备后,再点击运行。查询完成后,Fleet 会在屏幕底部显示查询结果;您可以使用提供的列过滤器对结果进行筛选。
运行哪些查询由您决定,取决于您的网络中最关注的问题或不合规的示例。然而,以下是一些不错的起点:
users 用于识别应该存在或不应该存在于特定终端上的用户帐户
browser_plugins 显示设备上的所有浏览器插件;如果用户安装了潜在恶意的浏览器插件,这个功能会很有用
chrome_extension 如前所述,专门查找 Chrome 插件
crontab 标识在 Linux 系统上执行可疑或恶意活动的计划任务
disk_free_space_pct 标识磁盘空间不足的设备
installed_applications 标识设备上安装的恶意或潜在不必要的应用程序
Fleet 中的主机仪表板以卡片形式显示每个管理设备的详细信息(见图 10-7)。

图 10-7: Fleet 主机仪表板视图
在这里,您可以查看此主机的主机名、操作系统、osquery 版本、处理器详情、内存大小、运行时间、MAC 地址和 IP 地址。点击右上角的蓝色查询按钮(堆叠的圆柱体图标)可以轻松查询此设备。
花些时间熟悉可用的查询,并进行在线研究,寻找其他潜在有用的查询。尝试查看一些已保存的查询,并编辑或复制它们,以获得您需要的查询。
使用 Wazuh
我们在项目 35 中安装了 Wazuh 代理,并将在本节中进行配置。Wazuh 允许我们查看 Security Onion 中的日志和警报,我们将在下一节中进行探讨。
主要的 Wazuh 配置文件位于 Security Onion 系统的/opt/so/conf/wazuh/ossec.conf路径下。此配置文件的每个部分是独立的,并且通过如下的行来标识:
<!-- Files/directories to ignore -->
您可以修改此文件中的设置以改变 Wazuh 的行为,例如,如果 Wazuh 因为错误的正向检测而阻止您执行某些无害的操作,可以进行调整。请检查此文件以了解 Wazuh 监控的类型。
以下片段显示的部分指定了包含已知或预计为恶意的文件列表的文件,这些文件是基于识别出的对手行为,并接着是预计包含木马(病毒的一种)的文件,以及需要审计的各种漏洞文件和文件夹:
--snip--
<rootkit_files>/var/ossec/etc/shared/rootkit_files.txt</rootkit_files>
<rootkit_trojans>/var/ossec/etc/shared/rootkit_trojans.txt</rootkit_trojans>
<system_audit>/var/ossec/etc/shared/system_audit_rcl.txt</system_audit>
<system_audit>/var/ossec/etc/shared/system_audit_ssh.txt</system_audit>
<system_audit>/var/ossec/etc/shared/cis_rhel7_linux_rcl.txt</system_audit>
--snip--
这些文件中的每一个都包含 Wazuh 将监控的内容。如果代理在设备上检测到与 rootkit_files.txt 文件中的行为或设置匹配的文件或配置,它将采取行动修复该威胁。如果你不希望它采取该行动,可以删除或注释掉配置文件中的该行,使用 #。
当你更新 Wazuh,作为你持续更新和修补 Security Onion 及其他系统的一部分时,配置文件如 rootkit_files.txt 也可能会收到更新。这确保了随着新威胁的识别和妥协指标的公开发布,你的网络保持受到保护。为了避免丢失你对这些文件所做的任何更改,考虑创建新的自定义配置文件(例如 my_custom_trojans.txt)并在 ossec.conf 文件中添加对该文件的引用,如下所示:
--snip--
<rootkit_files>/var/ossec/etc/shared/rootkit_files.txt</rootkit_files>
<rootkit_trojans>/var/ossec/etc/shared/rootkit_trojans.txt</rootkit_trojans>
<rootkit_trojans>/var/ossec/etc/shared/my_custom_trojans.txt</rootkit_trojans>
--snip--
将文件添加到 ossec.conf 文件中,将导致 Wazuh 参考这些文件进行配置和设置,除此之外,它还会参考默认的配置文件。使用自定义文件是添加你可能拥有的自定义配置的好方法。
如果你希望 Wazuh 忽略已安装的端点上的某个目录或多个目录,可以在相关部分添加该信息。你还可以告诉代理忽略特定文件或文件类型,排除某些设备的主动响应(如果你希望代理永远不阻止可能影响网络的特定设备的活动),并设置其他各种选项。熟悉这些配置文件,以便根据你的环境进行定制。
将 Security Onion 作为 SIEM 工具使用
除了提供其他有用功能外,Security Onion 还充当安全信息和事件管理(SIEM)工具。市场上有几种 SIEM 可供选择,包括 Splunk、SolarWinds 和 ManageEngine,所有这些都是商业解决方案,并且价格非常昂贵。而 Security Onion 则是开源且免费的。
SIEM(安全信息和事件管理系统)旨在从网络中的设备汇总数据,并充当日志和其他数据的中央存储库。实现像 Security Onion 这样的 SIEM 可以将日志集中管理,使得攻击者更难通过删除单一系统中的日志来掩盖自己的踪迹。它还使你可以在一个位置查询日志和其他系统数据,这样你就不必逐一检查每个系统或设备,从而简化了过程。然后,Security Onion 分析这些数据,并警告你可能的恶意活动。图 10-8 显示了通过登录 Security Onion 控制台并点击左侧菜单中的 Alerts 选项找到的警报列表。

图 10-8:Security Onion 警报
当你点击一个警报时,会显示一个上下文菜单,提供过滤选项;你可以包含、排除、仅显示或按你选择的警报分组。你还可以深入查看某个警报,显示你过滤的时间范围内该警报的每个实例。通过展开这些警报中的任何一个,你可以查看所有信息,包括元数据(见图 10-9),如警报的时间戳、网络流量的源 IP 和目标 IP 地址、与警报相关的完整消息、导致规则或警报触发的实际解码网络数据、规则本身,通常还有一个参考,帮助你了解更多关于该警报的信息,包括潜在的修复步骤或其他解决方案。

图 10-9:Security Onion 警报元数据
实际上,警报仪表板将显示许多不同类别和类型的活动;你几乎总是会看到需要进一步调查的警报。让我们讨论几个警报,帮助你入门。
| 表 10-2:环境中可能存在的不需要的软件示例 |
|---|
| 规则名称 |
| --- |
| ET INFO [eSentire] 可能的 Kali Linux 更新 |
| ET USER_AGENTS Steam HTTP Client User-Agent |
| ET POLICY curl User-Agent 出站 |
| ET POLICY Dropbox.com 使用的外部文件备份 |
| ET SCAN 观察到的可能的 Nmap User-Agent |
| ET TFTP 出站 TFTP 读取请求 |
| ET P2P eMule KAD 网络连接请求 |
表 10-2 展示了几个可能存在漏洞、可能导致或用于恶意活动,或本不该在你的网络中的软件示例。例如,Kali Linux 通常用于渗透测试,但攻击者也可以用它来入侵你的网络。如果你收到这个警报,调查它,识别责任系统,并将其从网络中移除。Security Onion 提供了你需要的所有信息来完成此操作。你可以选择拿到警报中的源 IP 地址并添加防火墙规则(在你的主机以及边界防火墙上)来阻止与该地址的所有进出流量,这是一种缓解策略的示例。
查看表 10-2 中的其他警报,已经识别出一些软件,可能不允许在网络中使用或不必要。Steam 是一个游戏客户端。Curl 是一个用于从服务器传输数据的工具,也可以用来从网络中提取数据或下载恶意软件。Dropbox 是一个云存储解决方案,同样可以用来提取或窃取数据。Nmap 是一个网络映射工具,攻击者可以用它来识别潜在的目标和网络中的漏洞。简单文件传输协议(TFPT)是一个用于传输文件的易受攻击的协议,而 eMule 是一个通常用于文件共享的点对点应用程序。
通常来说,如果你不使用某个工具或应用程序,你应该卸载或以其他方式移除它,以防止攻击者利用它,进而增强网络的安全性。例如,如果你不使用 curl,追踪负责此警报的客户端,使用主机名、源和目标 IP 地址,或警报中的其他元数据,卸载或移除该有问题的软件。如果你使用 Dropbox,可以安全地忽略此警报。否则,请调查并将其从你的网络中移除。对所有与软件相关的警报都要执行此操作。
然后,使用相同的过程调查和修复所有与潜在恶意软件活动相关的警报;表 10-3 展示了一个示例。深入分析每个警报,识别与警报相关的设备,查看与警报背后的规则相关的参考,找出并解决根本原因。如果遇到困难,互联网搜索通常是解决很多问题的最佳工具。
| 表 10-3:Security Onion 中可能的恶意软件警报 |
|---|
| 规则名称 |
| --- |
| ET JA3 Hash - [Abuse.ch] 可能的广告软件 |
| ET JA3 Hash - 可能的恶意软件 - Neutrino |
| ET INFO 打包可执行文件下载 |
| ET INFO EXE IsDebuggerPresent(用于恶意软件反调试) |
| ET EXPLOIT 可能的 OpenSSL HeartBleed 大心跳响应(客户端初始化漏洞 服务器) |
| ET EXPLOIT 可能的 OpenSSL HeartBleed 大心跳响应(服务器初始化漏洞 客户端) |
其他值得关注的警报是与账户登录或注销操作以及权限提升相关的警报,例如成功执行的 sudo 提升为 ROOT,如表 10-4 所示。
| 表 10-4:Security Onion 中的成功与失败登录警报 |
|---|
| 规则名称 |
| --- |
| Windows 登录成功 |
| PAM: 登录会话已关闭。 |
| PAM: 登录会话已打开。 |
| 成功执行 sudo 提升为 ROOT。 |
| 登录失败 - 未知用户或密码错误 |
虽然成功的登录尝试会提醒您某些账户可能已被入侵,但失败的登录尝试则可能提醒您有攻击者试图入侵。无论是哪种情况,都需要调查这些警报,以确定其是否为合法活动。例如,如果您看到某个账户在 Linux 系统上提升到 root 权限,请确认是您还是网络中的其他受信用户。如果不是您或网络中的其他管理员,则应更改密码,并调查同一时间段内发生的任何相关活动。
总结
Security Onion 的警报为您提供了识别和追踪可疑活动的起点;在保护您的网络时,利用这些警报。使用您手头的所有工具,因为您可以确定对手也在使用相同的工具。仅仅通过增加网络活动的可见性,就可以更好地保护您的网络。借助本章中描述的说明和工具,您很快就会发现大量潜在的活动需要调查和修复。预计这项调查活动将是持续进行的,并尽量跟上 Security Onion 中的警报,随着您的网络不断发展和演变。
第十一章:# 网络中用户安全管理的技巧

负责一个包含多个用户的网络是具有挑战性的。你无法合理地期望管理网络中其他用户的活动,尤其是当他们使用自己的设备时。然而,你可以采用一些策略来减少与多个用户相关的风险。
本章讨论了强密码短语与密码、密码管理器、多重身份验证以及隐私保护浏览器插件的价值。它应该能提供你与用户进行有关安全性讨论所需的信息。
密码
拥有强密码并为每个网站使用不同的凭证是保持在线安全的最佳第一步。密码短语和密码管理器使得攻击者更难猜到你的密码,同时也让你更容易管理它们。密码短语由多个单词组成,例如libertyextremecluecustodyjerky。你可以通过添加大写字母、数字和特殊字符使其更难猜测,但一般来说,最好是拥有既容易记住又较长的密码短语,而不是那些复杂却不易记住的密码。通常密码安全的规则依然适用。不要使用个人可识别信息,比如生日、宠物或亲戚的名字,或你曾就读的学校。避免包括与当前月份、季节或你工作的公司相关的词汇。基本上,要避免从容易猜测的元素构建密码短语。
密码短语比密码更长,这使它们在防范攻击者使用的暴力破解攻击时更具韧性。在暴力破解攻击中,攻击者尝试所有可能的字符组合,直到找到正确的密码。他们可以通过程序化方式进行操作,每秒钟可以进行数百万次(甚至数十亿次)密码猜测。密码越短,密钥空间(字符类型的数量——字母、数字和符号——越小),破解所需的时间就越短。例如,一个由小写字母和数字组成的八字符密码,在今天的计算硬件上破解需要不到两个小时。增加一个字符将使破解时间增加到超过两天,每增加一个字符,破解密码的时间呈指数级增长——一个 30 字符的密码短语在今天的计算能力下几乎无法破解。
注意:务必更改您账户和设备的默认密码。像路由器和交换机等设备的默认密码(如用户名:admin,密码:admin)是广为人知并且有文档记录的,因此如果您没有更改这些密码,您就为攻击者渗透您的网络打开了大门。即使它们不太为人所知,也很容易猜测。
密码管理器
使用密码管理器(也叫密码保险库或保险箱)来安全存储您的密码。密码管理器可以存储数百个独特的密码短语,您只需一个主密码即可访问。这种做法避免了将密码写下来的诱惑,因为这从来不是一个好主意。市面上有多个密码管理器可供选择,如 1Password (1password.com/) 或 LastPass (www.lastpass.com/)。
传达密码管理器价值的最佳方式是讨论凭证填充,这是一种攻击,利用了大多数人仍然在多个服务中使用相同密码的事实。当攻击者在数据泄露期间或之后获取密码和电子邮件地址的列表时,他们会尝试在多个知名网站和服务上使用这些凭证登录,通常会成功,因为相当一部分密码和电子邮件地址的组合在其他网站上也被重复使用。用户可以通过为每个账户使用不同的密码短语,并将这些密码短语存储在密码管理器中,来防止凭证填充攻击。
密码泄露检测
免费服务 Have I Been Pwned (haveibeenpwned.com/) 让您输入电子邮件地址,并立即了解它是否在任何数据泄露或突破中被识别。图 11-1 显示了一个被攻击的电子邮件账户的报告示例。

图 11-1:被攻击的电子邮件账户报告示例
此服务还提供持续的更新和监控;如果您的电子邮件地址在未来的数据泄露中被识别,您可以选择接收通知以更改您的密码。
多因素认证
一旦你创建了强密码短语,就应该在所有提供此功能的账户和服务上实施多因素认证(有时称为双因素认证,2FA,或MFA)。虽然单因素认证通常只需要两个因素的组合——你的电子邮件地址或用户名加上密码短语——但 MFA 需要两个或更多的认证因素。通常,第一个因素是你知道的东西,第二个因素是你拥有的东西,如硬件或软件令牌,或是你具备的东西,如指纹或其他生物识别信息。通过要求第二个或第三个认证因素,攻击者在试图访问你的账户和系统时将面临成倍增加的困难。添加第二个因素可能会给你或你的用户带来一些小麻烦,但你的安全性将大大增强。
最常见的 MFA 解决方案之一是使用短信作为第二因素,向用户发送包含代码或一次性密码的短信;用户随后使用该代码登录账户或执行某些类型的交易,特别是当这些操作来自新的或未知的设备或位置时。无论手机型号或服务提供商如何,每个人都能接收短信,且短信通常免费或便宜,几乎是即时的,并且如果你没有主动尝试登录,它会提醒你有可疑活动。主要缺点是短信并不是一种安全的技术,攻击者相对容易获得某人的电话号码和短信内容。
接下来是软件解决方案,包括 Google Authenticator、Authy、Microsoft Authenticator,甚至像 1Password 这样的密码保险库,它们提供 MFA 令牌。通常,你需要将应用程序下载到智能手机上,并扫描或输入来自服务提供商(例如银行或社交媒体)提供的代码来设置应用。当你想登录时,你将查看应用程序中的认证令牌,并将其与密码短语一起使用。这些令牌每 60 秒更换一次。这是相比 SMS 作为第二因素的一项重要改进,因为攻击者需要物理访问并解锁你的移动设备才能获取令牌。滚动令牌也意味着访问窗口非常短暂,不像 SMS 那样可能有几分钟的访问时间。这些软件令牌是许多用户最方便且最安全的 MFA 选项。
最后,还有硬件令牌,如 Yubikey 和 Google Titan Key。如果该令牌未插入电脑,您将无法访问加密或受保护的数据。硬件令牌被认为是多因素认证(MFA)解决方案中最强大的,因为丢失硬件令牌意味着您无法访问数据。它们提供与软件令牌相同或更好的保护,因为攻击者需要物理访问权限,但它们也是最不方便的;大多数人随身携带手机,但在需要时,可能会将硬件令牌忘在家里。此外,硬件令牌无法被钓鱼攻击;虽然短信和其他类似的 MFA 令牌可能通过社交工程和钓鱼攻击被潜在受害者提取,但攻击者无法远程访问您的硬件令牌。
浏览器插件
所有主要的互联网浏览器,如 Google Chrome、Mozilla Firefox 和 Microsoft Edge,都提供了多个浏览器插件或附加组件,用于屏蔽广告和追踪器(有关追踪器的更多信息,请参见第七章),并且通常用于提高用户隐私。这些提到的插件已经过审核,且被确认是合法的,或者是由知名和可信的来源创建和维护的。浏览器插件旨在为标准浏览器提供附加功能,用户可以从广泛的插件中选择,以改善他们的浏览体验。与用户讨论这些浏览器附加组件的优缺点,有助于他们做出明智的决策,选择哪些插件使用,哪些插件避免使用。
Adblock Plus
Adblock Plus 移除网站上的“不可接受”或干扰性的广告。要安装此插件,请访问adblockplus.org/en/download,并下载适合您的浏览器或设备的版本。安装完成后,进入插件的设置页面(如图 11-2 所示),选择阻止额外的追踪、阻止社交媒体图标追踪和不允许可接受广告。您还可以选择将特定网站列入白名单。

图 11-2:Adblock Plus 设置
额外追踪包括一些方法,比如网站收集您的浏览习惯。阻止社交媒体图标追踪可以防止您在访问的网站上被社交媒体按钮追踪。最后,不允许可接受广告会移除网站上的所有广告(至少尽可能多的广告)。所有这些都会带来一个更清洁、更快速的网页浏览体验。
Ghostery
与 Adblock Plus 类似,Ghostery 的使命是通过移除许多网站上的用户追踪功能来改善用户隐私。要安装 Ghostery,请浏览到www.ghostery.com/并注册一个账户。下载并安装适用于你的浏览器的插件;安装后,插件会直接启用,但你可以从插件菜单中修改设置,如图 11-3 所示。

图 11-3:Ghostery 设置
如果你想手动允许或禁用特定网站,并暂停或恢复 Ghostery,你可以通过此菜单进行操作。
HTTPS Everywhere
HTTPS是继不安全的 HTTP 协议之后的安全互联网协议。HTTPS 使用 SSL/TLS 来保护你浏览互联网时的网络流量。使用加密可以保护你的流量,使得对手无法拦截和解密它。不幸的是,并非所有网站都为其用户提供加密服务。这时,像 HTTPS Everywhere 这样的插件就派上了用场;它为你提供了加密层,无论你在浏览器中做什么,都能保持安全。
要安装此插件,请浏览到www.eff.org/https-everywhere/并下载和安装它。从这里,选项非常简单:开或关(如图 11-4 所示)。

图 11-4:HTTPS Everywhere 设置
安装并运行此插件后,你可以放心,因为你的所有浏览器流量都在加密保护中。
物联网考虑事项
我们在第二章中详细讨论了像 Google Home 和 Amazon Alexa 这样的物联网设备,以及如何通过网络分段方法来减轻智能设备带来的风险。然而,仍然存在与始终开启的摄像头和/或麦克风设备相关的风险,需要加以考虑。
无论是笔记本电脑、台式计算机、游戏主机,还是智能家居设备,许多现代终端都内置了麦克风或摄像头(或两者)。对于一个有决心的对手,这些设备可以用来监视你和你周围的人。因此,在可能的情况下,最好投资那些配备物理关闭开关或按钮的智能家居设备,用以关闭这些功能。如果无法做到这一点,考虑使用摄像头盖(许多在线商店有售,价格便宜),甚至可以用一块不透明的胶带遮住你的网络摄像头,避免使用时暴露。这样做是保护你隐私的最佳方法之一。
除了遮挡摄像头外,还要考虑智能家居设备的放置和使用位置。以智能音响为例,你可以选择仅在公共区域使用它们,避免放置在卧室或私人办公室等私人区域。考虑可能在麦克风范围内进行的活动和对话,并据此放置设备。
附加资源
本书介绍了网络安全的基本知识,并理想地帮助你更深入地思考你的网络和用户的安全,并实施解决方案来保护你的隐私。然而,关于这些话题还有许多资源可以进一步探讨,这些内容超出了本书的范围。我想提到的第一个资源是chrissanders.org/。Chris 撰写了多本书籍和在线课程,涵盖了网络安全监控、入侵检测、以及我们在第十章中简要讨论过的 ELK 栈的高级使用等主题。如果你想深入了解这些话题,这里是一个很好的起点。
另一个对于任何对网络安全、数字取证或事件响应感兴趣的人的精彩资源是dfir.training/。这个网站包含了大量与工具、培训课程(包括免费和商业课程)、实践材料以及其他资源相关的信息,可以帮助你增加知识储备并提升你的安全成熟度。
最后,SANS 是一个专注于网络安全的研究和培训组织。在www.sans.org/网站上,你可以找到更多关于他们培训课程的信息,同时也有许多关于网络和终端安全的工具与技术的资源和研究论文,包括防御性和进攻性视角的内容。
总结
最终,你的在线隐私和安全可以根据个人需求得到充分保护。为了在互联网上保持安全,往往需要在隐私、安全性或两者之间做出妥协,以换取便利。稍微牺牲一点便利性,你将获得更好的整体上网体验,并享有更高的安全性和隐私保护,无论是个人的还是与用户共享的。确保安全的好处远远超过实施这些解决方案所带来的不便。






浙公网安备 33010602011771号