本页目录
- 1. 简介
- 1.1. 起点 1.1.1. 网络设计与互联网连接 1.1.2. 路由 1.1.3. 网络分段 1.1.4. 物理服务器与虚拟机监控程序(虚拟机) 1.1.5. 从零起步
- 2. 网络设计 2.1.1. VLAN 2.1.2 子网 2.1.4. 路由
- 3. 构建网络基础设施
- 3.1. 下载并安装 pfSense 3.1.1. 最低硬件要求 3.1.2. 获取 pfSense 安装镜像 3.1.3. 准备安装介质 3.2.1. Web 界面 3.2.2. 定义 VLAN 与子网
- 3.3 pfSense 中的防火墙配置 3.3.1. 默认防火墙规则
- 3.4. pfSense 服务 3.4.1. DHCP 3.5.1. 准备工作 3.5.2. VLAN 配置
- 4.1. 最低硬件要求
- 4.2. 获取 Proxmox 安装镜像
- 4.3. 准备安装介质 4.3.1. Linux 4.3.2. MacOS 4.3.3. Windows
- 4.4. Proxmox VE 安装过程 4.4.1. 启动 4.4.2. 最终用户许可协议(EULA) 4.4.3. 分区 4.4.4. 位置与时区选择 4.4.5. 管理员密码与电子邮件地址 4.4.6. 管理网络配置 4.4.7. 完成安装
- 4.5. Proxmox 配置流程 4.5.2. 存储 4.5.3. VLAN 4.5.4. 虚拟机与容器(VM & CT)安装来源
- 4.6. Proxmox 备份 4.6.1. 备份目标与任务
- 5. 面向互联网的服务
- 5.1. 流量路由 5.1.1. 选择 VPS 提供商 5.1.2. 自定义(VPS) 5.1.3. 配置 pfSense
- 5.2. 安装 ISPConfig 5.2.1. 下载容器模板 5.2.2. 创建容器
- 5.2.3. Perfect Server 自动化 ISPConfig 3 安装
- 5.3. 网站与邮件域名 5.3.1. A 与 CNAME 记录简要说明 5.3.2. MX 记录简要说明 5.3.3. SPF、DKIM 与 DMARC 简要说明 5.3.4. 查询 DNS 记录
- 6. 内部服务
- 6.1. Samba 域控制器 6.1.1. 创建容器 6.1.2. 准备与检查 6.1.3. 安装与配置 Samba 6.1.4. 配置 NTP 6.1.5. 测试新的 Active Directory 域控制器 6.1.6. 将 Samba 域控制器加入现有 Active Directory
- 6.2. 文件服务器 6.2.1. 创建虚拟机 6.2.2. 配置 Debian 6.2.3. 安装并配置 Samba 文件服务器 6.2.4. 设置共享
- 7. 管理用户与计算机
- 7.1. 管理用 Windows 虚拟机 7.1.1. 获取安装介质 7.1.2. VirtIO 驱动 7.1.3. 创建虚拟机 7.1.4. 安装 Windows 11 Pro 7.1.5. 远程服务器管理工具(RSAT) 7.1.6. 加入域 7.1.7. 使用远程服务器管理工具(RSAT)
- 8. 文件共享
- 9. 连接工作站
- 9.1. 概述
- 9.2. 防火墙规则
- 10. 结论
- 1.1.1. 网络设计与互联网连接
- 1.1.2. 路由
- 1.1.3. 网络分段
- 1.1.4. 物理服务器与虚拟机监控程序(虚拟机)
- 1.1.5. 从零起步
- 2.1.1. VLAN
- 2.1.2 子网
- 2.1.4. 路由
- 3.1.1. 最低硬件要求
- 3.1.2. 获取 pfSense 安装镜像
- 3.1.3. 准备安装介质
- 3.2.1. Web 界面
- 3.2.2. 定义 VLAN 与子网
- 3.3.1. 默认防火墙规则
- 3.4.1. DHCP
- 3.5.1. 准备工作
- 3.5.2. VLAN 配置
- 4.3.1. Linux
- 4.3.2. MacOS
- 4.3.3. Windows
- 4.4.1. 启动
- 4.4.2. 最终用户许可协议(EULA)
- 4.4.3. 分区
- 4.4.4. 位置与时区选择
- 4.4.5. 管理员密码与电子邮件地址
- 4.4.6. 管理网络配置
- 4.4.7. 完成安装
- 4.5.2. 存储
- 4.5.3. VLAN
- 4.5.4. 虚拟机与容器(VM & CT)安装来源
- 4.6.1. 备份目标与任务
- 5.1.1. 选择 VPS 提供商
- 5.1.2. 自定义(VPS)
- 5.1.3. 配置 pfSense
- 5.2.1. 下载容器模板
- 5.2.2. 创建容器
- 5.3.1. A 与 CNAME 记录简要说明
- 5.3.2. MX 记录简要说明
- 5.3.3. SPF、DKIM 与 DMARC 简要说明
- 5.3.4. 查询 DNS 记录
- 6.1.1. 创建容器
- 6.1.2. 准备与检查
- 6.1.3. 安装与配置 Samba
- 6.1.4. 配置 NTP
- 6.1.5. 测试新的 Active Directory 域控制器
- 6.1.6. 将 Samba 域控制器加入现有 Active Directory
- 6.2.1. 创建虚拟机
- 6.2.2. 配置 Debian
- 6.2.3. 安装并配置 Samba 文件服务器
- 6.2.4. 设置共享
- 7.1.1. 获取安装介质
- 7.1.2. VirtIO 驱动
- 7.1.3. 创建虚拟机
- 7.1.4. 安装 Windows 11 Pro
- 7.1.5. 远程服务器管理工具(RSAT)
- 7.1.6. 加入域
- 7.1.7. 使用远程服务器管理工具(RSAT)
你好!在文章开头,我想先分享一段简短的个人经历。
我踏入 IT 世界的旅程始于 1999 年。当时我刚满 21 岁,从学校毕业不久,站在了人生的十字路口。我曾学习管理、经济与法律,但这些已无法激起我内心的兴趣,而 IT 的魅力却深深吸引了我。从早年摆弄 C64 家用电脑、IBM XT(兼容机)以及任何带键盘的设备开始,我就知道自己找到了热爱的事业。
多年来,我的技能通过自学不断提升。我从安装工程师逐步成长为身兼多职的网络与系统管理员,所有知识都来自实践过程中不断的试错。
我经历中的一个关键时刻,发生在为一家保险公司执行首个项目期间。经过反复思考最佳方案,我决定在自己阁楼办公室里搭建客户的网络。我成功配置了服务器和工作站,结果令人满意;最终我只用了一次现场实施就完成了部署。
不出所料,多年来我的方法基本没有改变。我全身心地理解组织的目标,并将其与最合适的 IT 方案相匹配。撰写方案、获得管理层批准、构建 IT 基础设施,最终交付项目——这一方法论经受住了时间的考验。
我的成长不仅来自实践经验,也来自书籍、文档,尤其是互联网所给予的无价支持。最重要的是,是开源社区在我前行的路上帮助了我,也激发了我回馈社区的想法。本着这种精神,我选择将网络搭建的基础要素记录下来,希望本文能帮助那些独自探索、想要开启自己 IT 之旅的人。我希望它能为读者提供灵感与实用的见解。
如有任何问题,欢迎在评论区留言,或在 HowtoForge.com 论坛上发起讨论帖。此致,Bouke
1. 简介
在本文中,我们将深入探讨如何搭建一个经济实惠的自托管环境,适用于家庭实验室、家庭办公室以及中小型企业。我们秉持“精简”理念,力求以最小的投入和成本,在合理的时间范围内驾驭复杂性。
凭借在中小型企业(SME)中多年的实践经验,我们强调在可行时优先集成开源方案。同时也要认识到,我们也会评估闭源替代方案,最终决策以最符合业务需求、实践经验和技术偏好为准。
尽管作者热衷于开源方案,但我们承认,在某些情况下闭源方案可能更为合适。其核心理念强调应将公司利益置于个人偏好之上,并强化技术决策须与更广泛的业务需求相一致的必要性。
自托管环境与传统本地部署(on-premise)类似,通常给人初期成本高昂的印象。虽然存在混合本地部署的配置,但自托管方式若倾向于混合架构,也能实现成本效益。
此外,我们还会简要探讨其他选择,例如迁移到 Microsoft、Google 等 SaaS 提供商,并仔细权衡其利弊与成本。无论是选择完全独立的自托管方案,还是混合形式,它都带来了自由与控制力,但同时也需要对安全性、维护和备份等因素进行审慎考量。
1.1. 起点
现在,让我们深入自托管环境的具体细节。我们需要设计一套 IT 环境。关键在于确保 IT 架构与业务目标一致,并能有效支撑需求。要做到这一点,我们必须充分了解组织的方方面面。
在引入方案时,不能仅停留在技术规格和业务需求上。我们还必须考虑组织内部人员的偏好与需求。把握恰当的平衡至关重要,因为让用户接受方案既重要又具有挑战性。
在接下来的章节中,我们将深入探讨自托管环境设计的具体细节。我们会关注高性价比方案、精简的实施过程,并紧盯组织真正的需求。让我们开始设计一个省钱又高效的 IT 环境吧!
1.1.1. 网络设计与互联网连接
我们的设计从整个架构的骨干——网络开始。它涵盖从互联网连接、防火墙/路由器到物理交换机及其配置的一切,包括 VLAN 的设置。我们将深入那些让自托管环境保持连通与安全的核心要素。让我们逐一拆解每个组件,以便在第 2 章中构建稳健高效的网络设计。
1.1.2. 路由
接下来,我们来看一个关键环节——通往互联网的路由(进出方向)。这涉及深入探讨一个或多个固定 IPv4 地址的复杂性,并讨论指针记录(PTR)。我们探讨多种方案,例如(路由)子网,可由 ISP 提供,也可通过 GRE 单独建立。我们还将研究在 Linux 下使用 iptables 转发流量。
面对挑战时,例如互联网连接受限,ISP 可能不提供多个 IPv4 地址或无法设置所需的 DNS 指针记录,我们将探索变通方案。甚至可能出现无法建立 GRE 隧道的情况。我们可能需要考虑替代方案,例如通过某个可用的 VPN 提供商获取固定 IPv4 地址。让我们在这些路由考量中寻找出路,确保自托管环境能高效地与更广阔的数字世界通信。
1.1.3. 网络分段
转变焦点,让我们深入探讨网络分段这一关键领域,并强调 DMZ(非军事区,Demilitarized Zone)的重要性。本质上,可将 DMZ 视为一种特殊的 VLAN,但它在管理入站(及出站)流量、强化安全措施方面发挥着关键作用。
网络分段很重要!网络分段是将网络划分为不同的网段或 VLAN,每个网段服务于特定用途。这种做法不只是为了便于管理;它更是一项提升安全性、效率和整体网络性能的战略举措。
关于 DMZ 的特别说明
现在,让我们聚焦 DMZ——一个肩负特殊使命的 VLAN。该区域充当内部网络与外部世界之间的缓冲地带,提供额外一层防御。它是需要公网可访问性的服务(如 Web 和邮件服务器)的首选之地。通过隔离这些服务,我们降低了因直接暴露于内部网络而带来的潜在风险。
当我们深入网络分段的复杂性以及 DMZ 的关键作用时,我们不仅在创建结构,更是在强化自托管环境的安全态势。让我们探索这一战略设计如何在第 2 章中有效守护我们的数字疆域。
1.1.4. 物理服务器与虚拟机监控程序(虚拟机)
我们还需要邀请一台服务器加入我们的阵营。仅运行单一操作系统的物理服务器效率低下,且缺乏动态 IT 环境所需的灵活性。在本文中,我们假定服务器配备了虚拟机监控程序(hypervisor),而这一角色的流行选择是 Proxmox。
虚拟机监控程序让我们能够在单台物理服务器上创建并无缝管理多个虚拟机。尤其是 Proxmox,作为一款强大的开源虚拟机监控程序脱颖而出,它优化了资源利用率,并使相互独立的操作系统得以和谐共存。本质上,它为服务器基础设施的效率和灵活性带来了革命性改变。
1.1.5. 从零起步
在我们的旅程中,我们从基础起步,依托一台被亲切命名为 Scrappy 的可靠计算机。Scrappy 是我们专用的 19 英寸节点,配备 Intel i3-4170 CPU、24GB 内存、一块 500GB M.2 SSD,以及 3 块 500GB 2.5 英寸 SATA SSD。这台不起眼的“硬件小钢炮”将承担我们虚拟机的 Proxmox 虚拟机监控程序角色。用这台朴素的服务器,我们想说明服务器环境并不仅仅依赖原始算力。
在网络方面,我们选择开源的稳健方案,采用多功能的 pfSense 软件进行路由和防火墙管理。值得指出的是,使用 OPNsense 也能达到相同效果。我们在物理交换机上的 VLAN 配置,受到了 HP ProCurve 交换机设计的启发。除了改造一台 HP 交换机,也可以考虑其他性价比高的替代产品,例如 ZyXEL 或 TP-Link 的交换机。后者中,TP-Link Omada 是一个值得推荐的选择,尤其是配合 Omada 控制器进行集中管理时。你可以将 Omada 控制器作为硬件控制器(OC200 或 OC300)购买,或者以软件包形式获取 Omada 软件,安装在 Linux 虚拟机等平台上。
这些硬件选择构成了我们自托管环境的基础,表明即便从朴素的起点出发,我们也能构建稳健而灵活的 IT 基础设施。
2. 网络设计
既然引言已经结束,是时候开启激动人心的网络设计之旅了!
2.1. VLAN 与子网
在进行网络设计之前,我们需要先了解“我们的”网络中“存在”着什么?可能有服务器、存储、工作站、打印机、访客设备(手机、平板甚至电视)、太阳能逆变器,当然还有交换机和接入点。一旦完成盘点,就可以对节点进行分类。我们的思路是用逻辑 VLAN 和子网来规划布局。
基于盘点结果,布局大致如下。
2.1.1. VLAN
在此网络设计中,主要区别在于将关键组件分离,包括网络设备、虚拟机监控程序、服务器虚拟机、外围设备(如打印机)、工作站以及面向互联网的服务。
对于一台或多台远程桌面服务器(以前称为终端服务器),显然建立独立的 VLAN 至关重要。这一决定源于这样的考量:远程桌面服务器不应仅被归类为传统服务器,而应视为一种专用工作站。虽然它发挥着服务器的作用,但将其直接置于办公局域网(Office LAN)中可能并非最恰当的做法,这就凸显了对独立 VLAN 的需求。
此外,域控制器的战略部署也值得仔细考量。将域控制器放在通用服务器 VLAN 中,可能使其面临安全漏洞的风险。为增强安全措施,建议为域控制器分配一个专用 VLAN。这种方式只开放最必要的端口,从而最小化攻击面,有助于构建更稳健、更安全的网络基础设施。
为进一步增强安全性,可以探索为可写域控制器和只读域控制器分别创建不同 VLAN 的思路。这种分段可确保对其他服务器和客户端的暴露被精细控制,从而巩固网络整体的安全态势。
理解 VLAN 编号与子网背后的逻辑至关重要。虽然将管理 VLAN 集中在一起较为实用,但子网却有意为之各不相同。对于管理 VLAN,识别 VLAN 很直观;通过观察第三个(以及第二个)八位组,即可判断其 VLAN 位置,从而区分管理 VLAN 1 或管理 VLAN 2。
同样的逻辑方法也延伸到其他 VLAN 的第三个八位组,使整个网络呈现出系统化且易于解读的结构。
2.1.2 子网
在上一段中,我们简要提及了子网。
如果这一段无法立即完全理解,也没关系。只需使用下文推荐的 IP 计算器,必要时再回过头复习理论即可。理解本主题的要点就足够了,借助 IP 计算器和常识就足以顺利推进!
子网需要精心计算和合理设计,每个子网定义一个特定的 IP 范围。例如,办公局域网(Office LAN)的地址范围是 10.10.32.0 到 10.10.32.255,采用 /24 的 CIDR 掩码(相当于子网掩码 255.255.255.0),最多可容纳 254 台主机,构成一个结构化的子网。为应对潜在的增长,可考虑将 IP 范围扩展到 10.10.32.0 - 10.10.35.255,并使用 /22 的 CIDR 掩码(即子网掩码 255.255.252.0),以确保能适应组织不断变化的需求。
理解如何计算子网对网络设计至关重要。该过程涉及确定每个子网的大小,而这对于 IP 地址管理必不可少。
公式
计算子网大小的公式为:子网大小 = 2^(32 - CIDR)。其中,CIDR(无类别域间路由,Classless Inter-Domain Routing)表示用于指定子网大小的记法。
例如,若 CIDR 记法为 /24,则计算如下:子网大小 = 2^(32 - 24) = 2^8 = 256 个地址。这意味着该子网可容纳 256 台主机。
我们需要注意以下几点:主机地址:256 - 2 = 254 台主机
- 减去 2 是为了扣除网络地址和广播地址!
因此,当我们说 /24 子网可容纳 254 台主机时,这是一种简化的说法,表示共有 256 个地址可用,但其中两个被保留用作网络地址和广播地址。这对网络新手起初可能令人困惑,但这是 IP 寻址中的标准做法。
另一个要考虑的变量是计数从“零”开始:0-255 表示 256。
要探索其他可能性……
- 重新计算 /23:子网大小 = 2^(32 - 23) = 2^9 = 512 个地址。
- 重新计算 /22:子网大小 = 2^(32 - 22) = 2^10 = 1024 个地址。
- 重新计算 /21:子网大小 = 2^(32 - 21) = 2^11 = 2048 个地址。
此外,考虑更小的 CIDR 记法如 /29:子网大小 = 2^(32 - 29) = 2^3 = 8 个地址。这意味着该子网可容纳 8 台主机。
关于 CIDR /29,需要注意:由于网络地址和广播地址,至少有 2 个 IP 不可用。此外,还需为路由器保留 1 个 IP,因此实际上仅有 5 个可用节点。
请注意,CIDR 值越小,子网越大,可提供的地址越多,但也可能从整体网络空间中占用更多 IP 地址。使用 IP 计算器(例如 jodies.de 提供的那款)可以加速这些计算,便于高效地进行网络规划。
后者在考虑 DMZ 时很重要。有人会主张将多个 DMZ 的子网保持得尽可能小,以增强安全性。一种明智的做法是:在不同的 DMZ 中按逻辑隔离不同服务,从而进一步增强安全性。这增加了一层隔离,将潜在风险降至最低,并把任何安全泄露限制在特定的网段内。
关于二进制计算的说明
在幕后,子网计算涉及二进制运算。让我们分解 /24 CIDR 记法的示例:
CIDR 记法:/24
二进制表示:11111111.11111111.11111111.00000000
二进制表示中连续的 1 表示网络部分,而连续的 0 表示可用的主机地址。子网大小由统计 0 的个数来确定。在 /24 子网中,有 8 个 0,即 2^8,等于 256 个地址。
理解这一二进制层面,有助于洞察子网划分的基础机制。虽然它对日常计算并非必需,但能让人更深入地理解 CIDR 记法如何在二进制位(bits)层面影响子网大小。如果读者希望深入二进制的细微之处,这些知识能加深对网络原理的理解。
正如前面提到的 IP 计算器,使用子网速查表(cheat sheet)也能提供帮助。请查看 Jeremy Stretch 的知名网站 packetlife.net 上的 IPv4 子网划分速查表 [PDF]!
2.1.3 厘清 VLAN
在探索 VLAN 的旅程中继续前行,我们深入 VLAN 配置这一领域。VLAN(虚拟局域网,Virtual Local Area Networks)是进行网络逻辑分段的关键工具,可同时提升组织性与安全性。要有效驾驭 VLAN 的复杂性,打好关键概念的基础十分重要,其中包括 VLAN 中继(trunking)。
如果这一段无法立即完全理解,也没关系。在下一章中我们会将理论付诸实践!理解本主题的要点就足够了。毕竟,实践出真知!一时无法掌握如何将理论应用于实践是正常的。后续章节会提供更多带有实际示例的讲解。
理解 IEEE 802.1Q
VLAN 在 IEEE 802.1Q 标准框架下运行,该协议旨在将 VLAN 信息无缝嵌入以太网帧中。这种标记机制使交换机和路由器能够识别每个数据包的 VLAN 归属,从而确保网络内流量的精确路由与转发。
标记(Tagged)与未标记(Untagged)VLAN
标记 VLAN:在标记 VLAN 的配置中,每个以太网帧都携带以标签形式存在的附加信息,明确标识其 VLAN 归属。这种方法在交换机与路由器之间不可或缺,使设备能够识别并处理来自不同 VLAN 的流量。
未标记 VLAN:相反,未标记 VLAN 不在以太网帧中附加额外信息。这种配置适用于将终端设备(如工作站或打印机)连接到与特定 VLAN 关联的交换机端口时。
VLAN 中继
VLAN 中继是一个关键概念,尤其在多个 VLAN 共用同一条物理链路时尤为重要。中继(trunk)是一种专用的网络链路,被配置为能妥善处理多个 VLAN 的流量,从而促进交换机与路由器之间的高效通信。
配置概览
路由器/防火墙配置:VLAN 需要在路由器/防火墙上进行配置,以实现 VLAN 间通信。每个 VLAN 都会分配一个 IP 子网,并配合建立的路由规则来管控 VLAN 之间的流量。
交换机配置:连接到 VLAN 内设备的交换机端口可指定为标记或未标记。相比之下,中继端口被配置为承载多个 VLAN 的标记帧,从而提升网络的灵活性和可扩展性。
虚拟机监控程序配置:在虚拟化领域,虚拟机监控程序必须了解 VLAN 配置,尤其是在管理多个虚拟机时。虚拟网络接口会被分配到特定的 VLAN,这与物理网络中观察到的标记原则相呼应。
通过厘清 IEEE 802.1Q 的复杂性、深入标记与未标记 VLAN 之间的细微差别,并理解 VLAN 中继的重要性,我们为构建组织良好且安全的网络基础设施奠定了坚实基础。这些基础知识为我们全面网络设计之旅中的后续配置步骤做好了铺垫。
2.1.4. 路由
在网络设计的探索中,路由占据核心地位,呈现出两种不同策略:“单臂路由”(router-on-a-stick)方法和三层路由。此外,我们采用以防火墙为中心的方法,通过防火墙规则来编排 VLAN 之间的流量。
单臂路由 vs. 三层路由
2.1.4.1. 单臂路由 该策略使用路由器上的一个物理接口为多个 VLAN 服务。路由器处理 VLAN 间流量,并基于内部 VLAN 标签做出路由决策。虽然实用,但也可能带来潜在的瓶颈,因为所有流量都汇聚到单一链路上。
2.1.4.2. 三层路由 在此,三层交换机负责 VLAN 间路由。每个 VLAN 都有一个专用的三层接口,促进流量的并行处理。这能最小化瓶颈并提升整体网络效率。
2.1.4.3. 以防火墙为中心的方法
我们的网络设计强调以防火墙为中心的方法。防火墙规则细致地管控 VLAN 之间的流量,确保所有数据都经过防火墙。这不仅提供了对通信的精细控制,还能在网络边界审视和过滤流量,从而增强安全性。
在后续章节中,我们将深入配置环节,说明这些路由策略与以防火墙为中心的原则如何协同作用,以加固网络的结构与安全态势。
3. 构建网络基础设施
在这个激动人心的阶段,我们撸起袖子,开始真正动手构建网络。
启动网络构建
我们已到达理论转化为实际基础设施的节点。这标志着开始组装构成网络骨干的各个要素。
- 3.1. 下载并安装 pfSense 我们的首要任务之一是部署 pfSense——一款强大的路由与防火墙开源软件。我们将引导你完成下载和安装过程,确保顺利搭建。
- 3.2. pfSense 基础设置与 VLAN 集成 部署好 pfSense 后,我们进入基础设置阶段。这包括为 pfSense 配置必要的基本信息,并集成虚拟局域网(VLAN)。此外,我们还将实施关键的防火墙规则来管控 VLAN 间的流量,加强安全措施。
- 3.3. 交换机配置与 VLAN 部署 现在,注意力转向交换机。我们将深入在交换机上设置 VLAN,使其与预设的网络结构保持一致。这一关键步骤确保 VLAN 所定义的逻辑分段能无缝延伸到整个网络。
通过这些步骤的推进,你正在为一个有韧性、安全且组织良好的网络打下基础。随着每个组件各就各位,理论章节中构思的精密设计将变为现实。准备好见证你的网络蓝图成真吧!
3.1. 下载并安装 pfSense
我们将下载并安装 pfSense。
3.1.1. 最低硬件要求
当思考最低硬件要求这一问题时,请放心,pfSense 软件防火墙发行版即便在低配硬件上也能高效运行。具体细节请参考专用页面:pfSense 最低要求。然而,真正关键的是硬件规模指导(Hardware Sizing Guidance),它提供了为实现所需吞吐量而定的硬件先决条件方面的见解。
在本章中,我们将使用一台 PC Engines APU3,配备 AMD GX-412TC CPU 和 4GB 内存。存储为单块 250GB M.2 SSD。虽然通常使用 16GB M.2 SSD,但这台 APU 此前曾作为运行 Debian 的 Linux 节点使用。
值得注意的是,APU 主板没有视频接口,因此必须通过串口连接。这一独特特性使该主板非常适合用于演示安装过程。
3.1.2. 获取 pfSense 安装镜像
要获取 pfSense 安装镜像,请访问官方下载地址:pfSense 下载页面。
下载页面提供友好的界面,用于选择和下载合适的镜像。请根据架构(AMD64 - 64 位;Netgate ADI)、安装程序类型(USB 内存盘安装程序;DVD 镜像(ISO)安装程序)、控制台偏好(Serial 串口;VGA)进行选择,并挑选一个镜像站点进行下载。

对于 APU 系统主板,建议选择配置为 Serial(串口)控制台的 AMD64(64 位)USB 内存盘安装程序。但如果硬件带有显卡,则 VGA 选项更合适,可获更常规的体验。
3.1.3. 准备安装介质
在启动安装过程之前,确保安装介质已就绪是至关重要的一步。
3.1.3.1. 解压 Gzip 镜像
pfSense 安装镜像以 Gzip 压缩形式提供,下面介绍如何根据你的操作系统进行解压。
Linux 或 Mac:在终端中使用 `gzip -d` 或 `gunzip` 命令。
gzip -d pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img.gz
Windows:对于 Windows 用户,7-Zip 等工具十分理想,因为它们支持 GZip 压缩。只需使用 7-Zip 解压安装镜像即可。
3.1.3.2. 将镜像写入 USB 内存盘
解压后,你需要将镜像写入 USB 内存盘,以便在目标系统上安装。这一关键步骤确保你的安装介质准备就绪,并为顺利的安装过程奠定基础。
将安装镜像写入 USB 内存盘
3.1.3.2.1. 在 Linux 下写入镜像
以下是在 Linux 计算机上将镜像安装到 USB 内存盘的方法。1. 打开终端(例如 `xterm` 或 `xfce4-terminal`)。2. 在终端中执行 `sudo su` 或 `su -` 成为 root。
sudo su
3. 进入下载目录,创建一个文件夹(pfSense),将镜像移入该文件夹,并 cd 进入该文件夹
cd Downloads/
mkdir pfSense
mv pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img.gz pfSense/.
cd pfSense/
4. 解压镜像
gzip -d pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img.gz
使用 `ls` 命令验证结果。
ls -lahsi
接下来,你需要确定 USB 内存盘的正确设备名称,在本例中为 /dev/sdb。
fdisk -l
输出大致如下。
[..] Disk /dev/sdb: 7,2 GiB, 7736072192 bytes, 15109516 sectors Disk model: DataTraveler 3.0 Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x90909090 Device Boot Start End Sectors Size Id Type /dev/sdb1 1 66584 66584 32,5M ef EFI (FAT-12/16/32) /dev/sdb2 * 66585 2047848 1981264 967,4M a5 FreeBSD /dev/sdb3 2047849 2178920 131072 64M b W95 FAT32
最后,使用 `dd` 命令将镜像写入 USB 内存盘(将 “sdX” 替换为你的具体设备名称)。
关于 `dd` 命令的警告!务必格外小心,避免覆盖时误选错误的设备。此类失误可能导致严重的数据丢失,或使计算机无法启动。在执行 `dd` 命令前,务必反复确认目标设备。这一步的谨慎操作对防止意外后果至关重要。
dd if=pfSense-CE-memstick-serial-2.7.2-RELEASE-amd64.img of=/dev/sdX status=progress ;sync
`dd` 命令可能需要一些时间才能完成,请耐心等待。完成后,你的 USB 内存盘即可用于 pfSense 安装过程。
输出大致如下。
40735232 bytes (41 MB, 39 MiB) copied, 5 s, 8,1 MB/s
[..] 1112005120 bytes (1,1 GB, 1,0 GiB) copied, 257 s, 4,3 MB/s 2178921+0 records in 2178921+0 records out 1115607552 bytes (1,1 GB, 1,0 GiB) copied, 273,834 s, 4,1 MB/s
3.1.3.2.2. 在 Windows 下写入镜像
Windows 计算机上的过程与 Linux 系统有所不同。
Win32 Disk Imager 是 Netgate 文档中记录的工具之一,你可以在 Netgate 文档的“将安装镜像写入闪存介质”(Writing an Installation Image to Flash Media)中找到该过程的详细说明。
3.1.3.3. pfSense 安装过程
现在,让我们进入安装过程(是时候启动并成为 root 了)!将 USB 内存盘插入即将充当防火墙的那台计算机。在开机前,建议先确认进入启动菜单所需按的按键。这一步对能够从 USB 内存盘启动至关重要。
对于没有视频接口的 APU,必须通过串口控制台连接来操作。在 Linux 下可以使用 screen 命令;或者也可以使用 PuTTY,它支持多种平台。为简便起见,我们将使用 PuTTY 引导你完成过程。无论是否有显卡,这种方法都类似,只是显示上略有差异。
我们特意选择了串口控制台安装,希望以此消除此类安装的门槛。通过演示该过程,你会发现它并不复杂。缺点是需要一根合适的串口线。PC Engines 提供了一个简单的解决方案,即 USB 转 DB9F 线缆。PC Engines 甚至还提供了原理图 [PDF] 和驱动程序。
本次演示所用的笔记本没有串口。让我们引入一款 Tripp Lite Keyspan USB 转串口适配器(USA-19H)。这个方便的适配器弥补了缺口,使我们的安装过程能顺利建立串口连接。现在,让这位“技术超级英雄”加入,继续我们的安装魔法吧!
要在 Linux 下使用 `screen` 命令连接 APU,需执行 `screen /dev/ttyUSB0 115200`。不过,本次演示我们将选择 PuTTY。
`/dev/ttyUSB0` 的重要性在于它是 Linux 笔记本上的设备名称。在 Windows 中,你可以前往设备管理器(Device Management)找到串口设备。设备名称可能不是 `/dev/ttyUSB0`,而是类似 `COM3:` 这样的形式。无论哪种情况,与 APU 建立连接都至关重要。
除了端口,了解速率也至关重要。此处的速率设置为 115200 波特(baud)。让我们将这些要素无缝融入安装之旅吧!
- 打开终端。
- 成为 root(执行 `sudo su` 或 `su -`)。
- 将 USB 串口适配器连接到计算机和 APU。
- 插入 USB 内存盘。
- 启动 PuTTY。
- 将连接类型设置为 serial(串口),在 Serial Line(串口线路)文本框中填入设备名称,最后将 Speed(速率)设置为 115200。
- 点击 [Open](打开)按钮。
- 插入电源线为 APU 开机。
- 在启动过程中按
(连续敲击 键,直到出现启动菜单)。 - 选择启动设备(输入对应的数字)。以下是启动菜单的样子。第一个选项是 USB 内存盘,第二个选项是 250GB M.2 SATA SSD。

SeaBIOS(版本 rel-1.16.0.1-0-g77603a32)
现在按 F10 键进入启动菜单
选择启动设备:
1. USB MSC 驱动器 Kingston DataTraveler 3.0 2. AHCI/0:Samsung SSD 850 EVO mSATA 250GB ATA-9 硬盘(232 GiBytes) 3. Payload [setup] 4. Payload [memtest]
如果你的硬件带有显卡,VGA 选项会更方便。只需插入 USB 内存盘、开机,然后连续敲击启动键即可。其余过程类似,只是显示上略有差异。
pfSense 将自动启动。

选择控制台类型。输入 “xterm” 并按回车继续。

接受版权与发行声明以进入下一步。按回车继续。

在欢迎界面按回车以开始安装过程。

按回车键选择 Auto(ZFS)。如果你使用的是 eMMC(或类似选项),请选择 Auto(UFS)。

直接按回车继续。安装程序将自动重新分区并覆盖 M.2 SSD。

按回车继续。注意:可考虑增大交换分区(Swap)大小,以应对可能出现的内存耗尽问题。

你会注意到只有一个设备。直接按回车确认 “No Redundancy”(无冗余)选项。

按空格键选择设备。然后按回车继续。

按 TAB 键选择 “YES”(是)。然后按回车继续。

安装程序将继续。请稍候。

按回车重启。

一旦看到 “All buffers synced.”(所有缓冲区已同步)这一行,即可移除 USB 内存盘。

恭喜!pfSense 已成功从内部存储启动。我们现在即将根据网络设计来配置 pfSense。

初次启动时,系统可能会提示你配置 VLAN,以及 WAN 和 LAN 接口。
pfSense 将通过控制台显示以下信息:
- 未找到默认接口——正在运行接口分配选项。[..]
- 有效接口如下:[..]
- 是否需要先设置 VLAN?如果不使用 VLAN,或仅用于可选接口,通常在此处回答 no(否),并在需要时稍后通过 WebConfigurator 配置 VLAN。[..]
- 是否现在设置 VLAN [y|n]?输入 n 并按回车即可。
- [..] 输入 WAN 接口名称,或输入 ‘a’ 进行自动检测。只需输入所需 WAN 接口的名称并按回车。
- 输入 LAN 接口名称,或输入 ‘a’ 进行自动检测。只需输入所需 LAN 接口的名称并按回车。
- 如果还有更多接口,系统会要求设置 Optional 1(可选 1)接口。若如此,直接按回车跳过即可。
- 接口将分配如下:[..] 是否继续 [y|n]?输入 y 并按回车。
输入 LAN 接口名称,或输入 ‘a’ 进行自动检测。
只需输入所需 WAN 接口的名称并按回车。
最终结果应类似于下一张截图。
3.2. 配置 pfSense

既然 pfSense 已成功安装,我们就可以使用 webConfigurator 配置路由器/防火墙了。webConfigurator 可通过 443 端口访问,使用防火墙的默认 IPv4 地址 192.168.1.1 即可打开。
请注意:webConfigurator 有多种可互换的称呼,例如 “WUI”、“WebUI”、“WebGUI”,或简称为 “Web Interface”(Web 界面)。
3.2.1. Web 界面
确保你的计算机已连接到防火墙的 LAN 端口(通常标识为第二个网络接口)。如果一切正常,你的计算机会获得一个 IPv4 地址。现在,打开网页浏览器并访问 https://192.168.1.1 以打开 WebUI。
3.2.1.1. pfSense 设置向导
初始界面看起来可能有点谨慎,但别担心——就当它是一个友好的提醒。由于使用的是自签名证书,请点击 Advanced(高级),然后放心地选择 Proceed to 192.168.1.1 (unsafe)(继续访问 192.168.1.1(不安全))以继续。
对于 Firefox 用户,过程同样顺畅。只需点击 Advanced...(高级),然后选择 “Accept the Risk and Continue”(接受风险并继续)即可放心继续。

现在,是登录的时候了。用户名输入 “admin”,密码输入 “pfsense”。然后点击 “Sign in”(登录)以访问 WebUI。

暂时可以放心忽略关于密码的警告信息。点击 “Next”(下一步)继续 pfSense 设置向导。

确保准确无误的时间和日期设置至关重要。你可以接受默认时间源,或根据需要添加更多。然后设置时区并点击 “Next”(下一步)。

接下来是 WAN 接口的配置。你需要根据互联网连接或防火墙所连网络,从 Static(静态)、DHCP、PPPoE、PPTP 等选项中选择。相应地选择合适的选项,设置好后点击 “Next”(下一步)。
在本例中,我们选择 DHCP 选项,将防火墙通过某个交换机端口连接到实验室网络。而实验室网络又连接到另一台防火墙,后者再接入互联网。

接下来,我们需要决定如何处理 RFC1918 网络和 bogons(虚假地址)。为保持安全,建议保持两个选项都勾选,以确保来自这些网络的流量被阻断。但如果 WAN 接口连接的是 RFC1918 网络,可以考虑取消勾选第一个框。做出选择后,点击 “Next”(下一步)继续。

我们将输入主管理 VLAN 的默认网关 IPv4 地址 “172.21.1.1” 来配置 LAN 接口。将子网掩码设为 24,然后点击 “Next”(下一步)继续。

系统会要求设置 WebGUI 的密码。只需按照屏幕提示操作即可。

我们已接近 pfSense 设置向导的尾声。只需点击 “Reload”(重新加载)以应用新更改并重新加载 pfSense。

重新加载完成后,向导应自动重定向。但在某些情况下,这种重定向可能无法按预期工作。

仔细查看后发现,网卡 IPv4 地址并未刷新。此问题归因于所用 Linux 笔记本上的 NetworkManager,而非 pfSense 的问题。

将网线拔下,等待几秒后重新插回笔记本,IPv4 地址似乎就成功刷新了。

在浏览器地址栏输入正确的 URL “https://172.21.1.1” 后按回车键。然后输入用户名 “admin” 和之前设置的密码。最后点击 “Sign in”(登录)以访问 WebUI。

登录后,你会看到一些需要接受的提示信息。点击 “Accept”(接受),然后点击 “Close”(关闭)继续。


恭喜!pfSense 设置向导到此结束。我们将继续进行一些自定义设置。

3.2.1.2. 自定义设置
仪表板
pfSense 仪表板功能齐全,但可以通过添加各种小部件(widget)来增强。如果愿意,你可以点击右上角的 “X” 移除“服务与支持”(Services And Support)小部件。
考虑添加如 “Gateways”(网关)、“Interface Statistics”(接口统计)、“Traffic Graphs”(流量图)等实用小部件来丰富仪表板。虽然还有更多有益的小部件,但我们留给管理员自行探索,决定哪些符合其偏好。

主题与顶部导航
有些人可能更喜欢深色模式主题。可通过菜单选项 “System”(系统)> “General Setup”(通用设置)选择主题。向下滚动到 “webConfigurator”,在可用选项中滚动选择所需主题。选择 “pfSense-dark” 将得到深色背景。

此外,注意 “Top Navigation”(顶部导航)选项。选择 “Fixed”(固定)可确保导航菜单始终停留在页面顶部。向下滚动并点击 “Save”(保存)以存储并应用更改。
要刷新仪表板并欣赏改进的外观,只需点击左上角的 pfSense 标志即可。享受更新后的界面吧!
在 pfSense webConfigurator 中探索众多自定义选项,以获得个性化体验。可以考虑使用图片小部件(Picture widgets)添加一张赏心悦目的图片来美化界面。不过创意或许该留到以后,因为还有工作要做。
花点时间探索菜单选项;熟悉导航是很有价值的一步。随着我们深入后续配置,理解菜单将带来帮助。

让我们进入下一节,了解 VLAN 与子网。
3.2.2. 定义 VLAN 与子网
还记得我们的网络设计吗?我们额外增加了一列用于默认网关。
在我们的网络设计中,每个网络都有自己的指定默认网关。默认网关是网络流量进出中央节点,确保不同网络之间的高效通信。这种个性化的设置增强了网络的组织性与功能性。
我们将依据网络设计来添加 VLAN 和子网。
3.2.2.1. 接口
让我们从为 VLAN 选择接口开始。导航到 “Interfaces”(接口)> “Assignment”(分配)以查看可用接口。
LAN 接口当前关联的是 igb1。因此,我们将使用 igb1 来配置 VLAN。

3.2.2.2. VLAN
在 “Interfaces”(接口)> “Assignment”(分配)下选择 “VLANs”,然后点击 “Add”(添加)以创建 VLAN。

选择适当的父接口,此处为 “igb1”。将 VLAN Tag(标签)输入为 “2”,VLAN Priority(优先级)留空。
请特别注意 Description(描述)字段,建议使用清晰的格式。例如,可使用 “L1_0002_MNG2”,其中 “L1” 表示 “LAN 1”,“0002” 表示 VLAN 编号,“MNG2” 表示 “Management LAN 2”(管理 LAN 2)。这种结构化方式有助于轻松识别和管理网络。
最后点击 “Save”(保存)以保存更改。

导航到 “Interface”(接口)> “Assignments”(分配)下的 “Interface Assignments”(接口分配),将新 VLAN 分配给一个接口。在 “Available network ports”(可用网络端口)部分选择该 VLAN 并点击 “Add”(添加)。然后保存并应用设置。

勾选复选框以启用接口。请特别注意 Description(描述)字段,建议使用清晰的格式。例如,可使用 “L1_0002_MNG2”。

配置选项出现后,按以下步骤操作。

- 勾选复选框以启用接口。
- 请特别注意 Description(描述)字段,建议使用清晰的格式。例如,可使用 “L1_0002_MNG2”。
- 将 “IPv4 Configuration Type”(IPv4 配置类型)选择为 “Static IPv4”(静态 IPv4)。
- 在 IPv4 Address(IPv4 地址)标签旁的文本框中,将默认网关 IPv4 输入为 “172.22.2.1”。
- 在 IPv4 地址右侧选择 “24”,这表示 CIDR 格式的子网掩码。
- 最后向下滚动,然后保存并应用更改。

结果大致如下。

将 LAN 和 WAN 接口也重命名是个好习惯。
只需点击 “LAN”,将接口描述改为 “L1_0001_MNG1”。接下来对 WAN 接口做类似操作,将描述改为 “W1_0001_ISP1”。这样可保持一致的概览。
别忘了保存并应用每一次更改。

以下是创建 VLAN 和接口的流程总结:
- 创建 VLAN:导航到 “Interfaces”(接口)> “Assignments”(分配)。点击 “VLANs” 选项卡。点击 “Add”(添加)以定义新 VLAN。选择父接口(如 igb1),输入 VLAN Tag(标签),并填写清晰的描述。
- 在接口中体现 VLAN:进入 “Interfaces”(接口)> “Assignments”(分配)。点击 “Interface Assignments”(接口分配)。从 “Available network ports”(可用网络端口)列表中选择该 VLAN 并点击 “Add”(添加)。保存并应用设置。
- 配置接口选项:在 “Interfaces”(接口)部分,会出现一个新接口(如 OPT2)。点击该接口(如 OPT2)。勾选复选框以启用接口。设置清晰的描述,例如 “L1_00016_SRVS”(用于服务器)。将 “IPv4 Configuration Type”(IPv4 配置类型)选择为 “Static IPv4”(静态 IPv4)。输入默认网关 IPv4 地址(如 10.10.16.1)。选择 CIDR 格式的子网掩码(如 /24)。向下滚动,然后保存并应用更改。
- 对其他 VLAN 和接口重复操作:对每个 VLAN 及对应接口重复整个过程。保持描述清晰一致,以便更好地组织。
创建 VLAN:
- 导航至“接口” > “分配”。
- 点击“VLAN”选项卡。
- 点击“添加”以定义一个新的 VLAN。
- 选择父接口(例如 igb1),输入 VLAN 标签(Tag),并提供清晰的描述。
在接口中表达该 VLAN:
- 进入“接口” > “分配”。
- 点击“接口分配”。
- 从“可用网络端口”列表中选择该 VLAN,然后点击“添加”。
- 保存并应用设置。
配置接口选项:
- 在“接口”部分,将出现一个新接口(例如 OPT2)。
- 点击该接口(例如 OPT2)。
- 勾选复选框以启用该接口。
- 设置一个清晰的描述,例如“L1_00016_SRVS(用于服务器)”。
- 选择“静态 IPv4”作为“IPv4 配置类型”。
- 输入默认网关的 IPv4 地址(例如 10.10.16.1)。
- 选择 CIDR 格式的子网掩码(例如 /24)。
- 向下滚动,然后保存并应用更改。
对其余 VLAN 和接口重复上述操作:
- 针对每个 VLAN 及其对应的接口重复整个流程。
- 始终保持描述清晰一致,以便更好地组织管理。
按照上述步骤,你可以有条不紊地创建 VLAN、将其映射到接口,并配置必要的设置。如果你需要针对特定 VLAN 或接口的详细说明,欢迎随时提出!
VLAN 概览将类似于下表。
接口分配将类似于以下截图。

“接口”仪表板小部件汇总出的概览类似于下表。
我们将在下一节继续配置 pfSense。
3.3 pfSense 中的防火墙配置
在 pfSense 中,接口的默认防火墙策略是拒绝所有入站流量。这意味着除非配置了特定的防火墙规则来放行流量,否则所有发往接口的入站连接都将被阻止。
创建防火墙规则时,本质上是在指定某个接口上允许或拒绝哪些流量。规则按从上到下的顺序处理,系统会应用第一条匹配该流量条件的规则。如果没有任何规则匹配,则应用规则集末尾的默认拒绝规则。
务必根据自身的网络需求合理配置防火墙规则,以确保流量按预期流动,同时保持网络的安全性。
3.3.1. 默认防火墙规则
我们来建立一套可在所有接口上通用应用的标准防火墙规则。某些类型的流量本质上是被允许的,我们的目标是制定高效且有效的防火墙规则。为此,我们将首先定义 IP 别名和端口(Port)别名。这种策略性方法能提升防火墙规则配置的清晰度和优化程度。
3.3.1.1. IP 别名
我们将创建以下 IPv4 别名:
- 名称:IP_Private_NETs 描述:RFC1918 私有网络地址分配
- 类型:网络
- 网络或 FQDN:10.0.0.0 /8 描述:A 类
- 网络或 FQDN:172.16.0.0 /12 描述:B 类
- 网络或 FQDN:192.168.0.0 /16 描述:C 类
首先导航至“防火墙” > “别名”,然后点击“添加”(在“IP”选项卡中)。
填写详细信息。要添加多个网络,点击“添加网络”。这将新增一行。
保存并应用更改。最终结果将类似于以下截图。

3.3.1.2. 端口别名
我们将创建以下端口别名:
- 名称:Port_Core_Services_TCP
- 描述:核心服务,TCP
- 类型:端口
- 端口:53 描述:基于 TCP 的 DNS
- 名称:Ports_Core_Services_UDP
- 描述:核心服务,TCP
- 类型:端口
- 端口:53 描述:基于 UDP 的 DNS
- 端口:123 描述:NTP
首先导航至“防火墙” > “别名”,然后在“端口”选项卡中点击“添加”。
填写详细信息。要添加多个端口,点击“添加端口”。这将新增一行。
保存并应用更改。
最终结果将类似于以下截图。



3.3.1.3. 添加防火墙规则(浮动)
防火墙规则既可以应用于特定接口,也可以作为浮动(floating)规则实现。前者适用于指定接口上的入站流量(在 pfSense 文档中称为“in”或入站),而后者可在任意接口上强制执行。必须认识到浮动规则优先于常规接口规则。此外值得注意的是,浮动规则的用途很广泛,并不限于入站流量;通过选择“out”可将其配置为出站流量,选择“any”则可配置为双向流量。使用浮动规则时需谨慎,因为其行为对所有人来说未必一目了然。
我们来为 ICMP 建立一条浮动规则。这样做是为了优雅地允许各主机跨 VLAN 互通 ping 请求——当然,除非是某个神秘实体在敲网络的门。绝不允许大坏黑客进入!
首先导航至“防火墙” > “规则”。接着点击“浮动”。现在可以点击“添加”来创建规则。无需担心向上或向下箭头。这是第一条规则。如果还有更多规则,则可以通过上下拖动特定规则来移动它们。
我们将构建如下规则:
- 动作:放行(Pass)
- 快速(Quick):勾选复选框
- 接口:选择所有本地接口(即除“Any”和 WAN 之外的所有接口)。按住 SHIFT 键可选择一段连续的接口;按住 CTRL 键可单独选择或取消选择某个接口。
- 方向:入站(in)。我们将关注进入接口的流量。
- 地址族:IPv4
- 协议:ICMP
- ICMP 子类型:按住 CTRL 键同时选择“Echo request”和“Traceroute”。
- 源:地址别名;IP_Private_NETs
- 目标:地址别名;IP_Private_NETs
- 描述:允许跨 VLAN 的 ICMP(私有网络)
保存并应用更改。
这将生成如下浮动规则。

鉴于浮动规则的特殊性质,并考虑到许多防火墙配置可能并不需要它们,我们将继续使用常规接口规则。如果你觉得浮动规则很有意思,可以在文档中了解更多详情:浮动规则文档(Floating Rules Documentation)。
3.3.1.4. 添加防火墙规则(接口)
还记得我们之前创建的 IP 和端口别名吗?现在我们将它们整合进接口规则中。虽然我们也可以构建浮动规则,但我们选择了接口规则,以保持更简单的配置,尽管这种方式需要多花一点功夫。不过,其优势在于可以轻松地在各接口间复制防火墙规则,从而抵消额外的工作量。
我们导航至“防火墙” > “规则”。目前,我们先不动管理接口,从“L1_0032_OFF1”开始。这种方式符合用户视角,侧重于办公局域网(Office LAN)专用的规则。
首先点击“添加”(带向上或向下箭头的按钮均可)。
规则 1:
- 动作:放行(Pass)
- 接口:L1_0032_OFF1
- 地址族:IPv4
- 协议:TCP
- 源:L1_0032_OFF1 子网
- 目标:本防火墙(自身)
- 目标端口范围:(其他);Port_Core_Services_TCP
- 描述:允许核心服务 TCP
请保存并应用更改。
现在,点击带向下箭头的“添加”按钮。
规则 2:
- 动作:放行(Pass)
- 接口:L1_0032_OFF1
- 地址族:IPv4
- 协议:UDP
- 源:L1_0032_OFF1 子网
- 目标:本防火墙(自身)
- 目标端口范围:(其他);Port_Core_Services_UDP
- 描述:允许核心服务 UDP
请保存并应用更改。
这两条规则允许来自办公局域网的特定 TCP 和 UDP 流量在进入接口后被放行。目标即防火墙本身,它充当 DNS 和 NTP 服务器的角色。
你可能会注意到,这里缺少针对 DHCP 和出站流量的规则。DHCP 流量无需规则,因为 pfSense 默认会处理。只有当我们要允许从接口到互联网的流量时,才需要创建出站规则。
规则 3:
- 动作:拒绝(Reject)
- 接口:L1_0032_OFF1
- 地址族:IPv4
- 协议:任意
- 源:地址或别名;IP_Private_NETs
- 目标:选择“地址或别名”,目标地址:IP_Private_NETs
- 描述:防止泄漏
- 选择“地址或别名”
- 目标地址:IP_Private_NETs
现在,点击带向下箭头的“添加”按钮。
规则 4:
- 动作:放行(Pass)
- 接口:L1_0032_OFF1
- 地址族:IPv4
- 协议:任意
- 源:地址或别名;IP_Private_NETs
- 目标:勾选“反转匹配”复选框,选择“地址或别名”,目标地址:IP_Private_NETs
- 描述:允许任意出站流量
- 勾选“反转匹配”复选框
- 选择“地址或别名”
- 目标地址:IP_Private_NETs
我们或许想添加一个分隔符来使规则更清晰。
点击“分隔符(Separator)”。接着输入如下描述:“默认防火墙规则”。点击绿色色球。然后点击“保存”。最后,将新分隔符拖动到规则集顶部并点击保存。
最终外观应类似于下方截图,请特别注意规则集末尾表示反向规则的感叹号。


3.3.1.4. 复制防火墙规则
要将此防火墙规则集复制到其他接口,请勾选左上角的复选框,然后点击“复制”。

务必勾选“转换接口定义”选项,然后点击“粘贴”并应用更改。

请注意,分隔符目前无法被复制(此功能尚不支持)。请为该接口创建“默认防火墙规则”分隔符,以完成这些步骤。
对其余以“L1_”开头的接口重复这些步骤。
虽然我们暂时保留这条出站流量规则,但建议将其替换为仅允许服务器必要出站流量的一组规则。
在这种情况下,一种被广泛推荐的做法是在防火墙规则集顶部建立“例外(Exceptions)”分隔符,并将出站规则置于其正下方。这种做法提供了一种结构化的方式来管理例外,使在必要时查找和修改规则更加容易。要达到预期效果,只需禁用末尾的出站规则,即可确保流量平衡且受控。
有关管理防火墙规则的更多详情,请参阅 Netgate 文档。可深入查阅该链接,这是 pfSense 配置中至关重要的一环。
在下一节,我们将简要了解 pfSense 防火墙的一些重要服务,例如 DHCP 和 DNS。
3.4. pfSense 服务
DHCP 和 DNS 对网络功能至关重要,它们为 IP 地址的分配以及域名到 IP 地址的转换提供了自动化与组织管理。
3.4.1. DHCP
DHCP(动态主机配置协议,Dynamic Host Configuration Protocol)是一种网络协议,可自动为网络中的设备分配 IP 地址及其他网络配置信息。在 pfSense 中,DHCP 服务有助于动态管理和分发 IP 地址,使设备无需手动配置即可更轻松地接入网络。
就本文而言,了解如何启用和配置 DHCP 非常重要。
启用并配置 DHCP 的步骤。
- 导航至“服务” > “DHCP 服务器”。
- 勾选“在(所选接口)上启用 DHCP 服务器”复选框,以激活该接口的 DHCP 服务。
- 配置 DHCP 设置,包括要分配的 IP 地址范围、租约时间,以及所需的额外选项。
- 保存并应用更改,使 DHCP 服务生效。
这些步骤将帮助你有效地在 pfSense 中配置 DHCP。
对于办公网络(L1_0032_OFF1),其配置应如下所示。
- 导航至“服务” > “DHCP 服务器”。
- 勾选“在(所选接口)上启用 DHCP 服务器”复选框,以激活该接口的 DHCP 服务。
- 配置 DHCP 设置:地址池范围:(从)10.10.32.101(到)10.10.32.200;NTP 服务器 1:10.10.32.1
- 保存并应用更改,使 DHCP 服务生效。
- 地址池范围:(从)10.10.32.101(到)10.10.32.200
- NTP 服务器 1:10.10.32.1
需要注意的是,ISC DHCP 已达到生命周期终点(EOL),并将在 pfSense 的未来版本中被移除。建议管理员切换到 Kea DHCP。切换只需点击几下即可完成:“系统” > “高级” > “网络”:勾选“Kea DHCP”,然后点击“保存”。

3.4.2. DNS
DNS(域名系统,Domain Name System)是一套将人类可读的域名(例如 www.ict-diensten.com)转换为计算机在网络中相互识别所使用的 IP 地址的系统。在 pfSense 中,DNS 服务确保高效且准确的域名解析,从而促成设备之间使用域名而非 IP 地址进行无缝通信。
就本文而言,了解如何向 pfSense 的 DNS 服务器添加主机覆盖(Host Overrides)和域覆盖(Domain Overrides)非常重要。
添加主机覆盖和域覆盖的步骤:
- 导航至“服务” > “DNS 解析器”。
- 在“主机覆盖”或“域覆盖”部分下,点击“添加”以新增一条记录。
- 输入必要信息,包括主机名、域名以及对应的 IP 地址。
- 保存并应用更改以更新 DNS 设置。
这些步骤将帮助你在 pfSense 中有效地配置 DNS 服务。
假设你有一台名为 mail.gigabitjes.nl 的邮件服务器,其 A 记录中的公网 IPv4 为 123.123.123.101。然而在局域网内部,这台服务器使用的 IPv4 地址是 172.31.252.101。在这种情况下,从局域网引用其公网 IPv4 并不现实。将主机覆盖设置为私有 IPv4 是一种实用的解决方案。该主机覆盖将类似于以下截图。

在下一节,我们将简要了解交换机上的 VLAN 配置。我们将在交换机接口与 pfSense 的 Web 界面之间切换,以完成所需的防火墙规则。
3.5. 交换机配置
在我们的网络中,网络交换机在支撑交换机、接入点、服务器和工作站等多种设备方面发挥着关键作用。
为了实现高效的网络设计,必须建立结构化的网络连接方案,以避免交换机的菊花链连接以及潜在的瓶颈。在此方案中,我们指定一台核心交换机作为中心节点。所有其他交换机都连接到这台核心交换机,充当接入交换机。从核心交换机到接入交换机的连接称为下行链路(downlink),而从接入交换机到核心交换机的连接称为上行链路(uplink)。这种分层配置确保了网络基础设施井然有序且具备可扩展性。
我们将先为交换机分配一个 IPv4 地址,并将 VLAN 纳入交换机的 VLAN 配置中。
3.5.1. 准备工作
在配置我们的(第一台)交换机之前,需要从管理 VLAN [L1_0001_MNG1] 为其分配一个 IPv4 地址。
首先,我将一台 HP 1810-24g 交换机的 24 号端口连接到 pfSense 防火墙的 LAN 接口。随后,我将笔记本电脑连接到 23 号端口。我给笔记本电脑分配了一个静态 IPv4 地址 192.168.2.123,子网掩码为 255.255.255.0 [/24]。采取这一步是为了修改交换机的默认 IPv4 地址。
此后,我将交换机的 IPv4 地址改为 172.21.1.11,子网掩码为 255.255.255.0 [/24]。默认网关 IPv4 设置为 172.21.1.1。
为确保 IPv4 设置准确无误,我短暂地拔下了笔记本电脑的网络电缆。由于我使用的是 Linux,在保持 DHCP 设置的同时,还能设置一个属于交换机最初使用的 192.168.2.0/24 网段内的静态 IPv4 地址。

默认设置与更新后的设置如下图所示。


为防止 DHCP 冲突,我在 pfSense 防火墙中调整了 L1_0001_MNG1 的 DHCP 地址池,将范围从 172.21.1.201 改为 172.21.1.230。为此,我导航至“服务” > “DHCP 服务器” > “L1_0001_MNG1”,并在“主地址池”部分修改了范围。此外,我注意到 NTP 服务器 1 尚未设置。尽管可选,我还是将其设置为 172.21.1.1。最后,我保存并应用了更改。
3.5.2. VLAN 配置
我们已准备好对交换机实施所需的更改。重点将放在 VLAN 上。
3.5.2.1. 网络概览
将使用如下概览。
在开始前,我们需要确定哪些 VLAN 将配置在哪些端口上。这台特定的 HP 交换机拥有 24 个千兆以太网端口(端口 1–24)和两个 SFP+ 插槽(端口 25–26)。我们的端口配置如下。你会注意到,核心交换机同时也将充当接入交换机。
3.5.2.2. VLAN 配置
我们继续在 HP 1810-24g 交换机上进行 VLAN 配置。ZyXEL 和 TP-Link 等其它交换机将在本文的后续修订版本中补充进来。
通过访问交换机的 IPv4 地址进入其 Web 管理界面。登录后,我们就可以开始添加 VLAN。
在这台 HP 交换机上,直接进入“VLAN” > “VLAN 配置”。创建 VLAN 很简单:勾选“创建 VLAN”旁的复选框,输入 VLAN ID,然后点击“应用”。

对其余 VLAN 重复此过程。

请注意,VLAN 名称最初并未设置。勾选复选框以激活相应的文本框,填写“VLAN 名称”列,然后点击“应用”即可完成。

现在,点击“参与-/标记(Participation-/Tagging)”。

选择 VLAN 并定义标记(tagging)。初始界面如下图所示。

将 VLAN 从 1 改为 32,并开始将该 VLAN 标记到相应端口。端口 01–12 设为非标记(untagged),端口 20–26 设为标记(tagged)。点击“应用”。

交换机可能会显示一条关于管理 VLAN 的警告,这是正常的。请忽略该警告,因为我们的笔记本电脑并未连接到 01–12 范围内的某个端口。
172.21.1.11 says Management port is not configured. Configuring untagged membership on non-management VLAN may disrupt the web connectivity. Do you wish to continue? Cancel OK
可能还会出现另一条警告,提示某个端口不能同时属于两个非标记 VLAN。
172.21.1.11 says Ports - 1,2,3,4,5,6,7,8,9,10,11,12 can have only one untagged VLAN membership. If the port is already untagged VLAN member in one VLAN and any other new VLAN is selected for untagged membership, then the port will be excluded from previously untagged VLAN if any). Do you wish to continue? Cancel OK
继续更改 VLAN 36 的参与(participation)设置。
如下方截图所示,你会看到端口 13 和 14 是非标记的。这使我们可以将设备连接到端口 13 或 14 中的任意一个,适合接入两台打印机。

接下来,更改其余 VLAN 的参与设置。注意,VLAN 252 和 253 只需以标记方式添加到端口 19–26。
恭喜!至此,我们已初步完成网络的搭建。待我们的虚拟化主机(hypervisor)启动并运行后,还将进行额外的调整。让我们快速进入下一章,开始构建 Proxmox 虚拟化主机!
4. 构建服务器基础设施
本章介绍 Proxmox 虚拟环境(VE)的安装与配置流程。
4.1. 最低硬件要求
有关生产环境和评估环境的最低硬件建议,请参阅 Proxmox 官方网站。
就测试用途而言,要求并不高:
- CPU:64 位(Intel EMT64 或 AMD64),支持 Intel VT/AMD-V 的 CPU/主板(用于 KVM 完全虚拟化支持)
- 至少 1 GB 内存
- 硬盘
- 一块网卡(NIC)
生产环境的要求同样合理;更多详情请参阅“硬件要求”部分。
4.2. 获取 Proxmox 安装镜像
Proxmox 安装镜像可在 Proxmox 官方网站获取。获取 Proxmox 虚拟环境 ISO 非常简单。下一步是将该 ISO 镜像写入 U 盘(USB 闪存盘)。
4.3. 准备安装介质
有关准备安装介质的推荐步骤,请参阅 Proxmox Wiki 页面和 Proxmox 官方网站。请查阅“准备安装介质”部分。注意该过程与 pfSense 类似,主要区别在于 Proxmox 仅以 ISO 格式提供。
4.3.1. Linux
在 Linux 下,推荐的方法是使用 `dd` 命令:
dd bs=1M conv=fdatasync if=./proxmox-ve_*.iso of=/dev/sdX
确切细节请参阅 Proxmox 网站上的“准备介质”部分。
我们并未采用推荐方法,而是使用了 Ventoy。Ventoy 并未列入 Proxmox 的文档中。尽管 Proxmox 文档未提及,但它成功地被使用;不过必须采用 Ventoy 的 CI 版本,如 issue 2657 所述。
4.3.2. MacOS
在 MacOS 下,使用 hdiutil 命令。
hdiutil convert proxmox-ve_*.iso -format UDRW -o proxmox-ve_*.dmg
确切细节请参阅 Proxmox 网站上的“准备介质”部分。
4.3.3. Windows
在 Windows 下,建议使用 Rufus 的 DD 模式。
《Proxmox 管理指南》提示:在弹出提示时选择“DD 模式”,并避免下载其他版本的 GRUB。来源:Proxmox 管理指南,“准备介质”部分。
4.4. Proxmox VE 安装过程
Proxmox VE 的安装过程简单直接,比 pfSense 更轻量。
4.4.1. 启动
使用准备好的安装介质启动计算机。选择“安装 Proxmox VE(图形界面)”以开始安装。
注意:在启动过程中,如果程序在国家/地区检测时卡住,请拔下网线,重新启动,再次选择“安装 Proxmox VE(图形界面)”,并在显示最终用户许可协议(EULA)后再重新插上网线。
4.4.2. 最终用户许可协议(EULA)
在 EULA 处点击“I agree”(我同意)。
4.4.3. 分区
选择目标硬盘。该服务器的存储配置如下:
- /dev/sda 465.76 GiB 三星 SSD 860
- /dev/sdb 465.76 GiB 三星 SSD 860
- /dev/sdc 465.76 GiB 三星 SSD 860
- /dev/sdd 465.76 GiB CT500MX500SSD4
所选的目标硬盘是 /dev/sdd。
另一种方案是:前三个 SSD 使用“zfs(RAIDZ-1)”,后一个 SSD 使用 ext4。点击“下一步”继续。
4.4.4. 位置与时区选择
安装过程中,选择所在位置和时区。例如:
- 国家:荷兰
- 时区:Europe/Amsterdam
- 键盘布局:美国英语
点击“下一步”继续。
4.4.5. 管理密码与电子邮件地址
在 installer 提示时设置密码并提供电子邮件地址。然后点击“下一步”。
4.4.6. 管理网络配置
网络配置至关重要。选择以下选项,并确保调整主机名(FQDN)。
- 管理接口:eno1 {mac} (e1000e)
- 主机名(FQDN):pve101.lan.gigabitjes.nl
- IP 地址(CIDR):172.21.1.101
- 网关:172.21.1.1
- DNS 服务器:172.21.1.1
点击“下一步”。
请注意,我们的虚拟化主机将位于 VLAN1,这偏离了原本指定 VLAN2 的网络设计。在此阶段,选择 VLAN2 可能过于复杂,因为它需要更复杂的 VLAN 配置。
4.4.7. 完成安装
检查摘要中的各项决策,然后点击“安装”。安装完成后,系统将重启。
4.5. Proxmox 配置流程
Proxmox VE 安装完成后,配置过程随即开始。打开 Web 浏览器并访问 https://172.21.1.101:8006 。

4.5.1. 订阅与更新
Proxmox VE 订阅
建议选择 Proxmox 订阅,以获得稳定的 Proxmox 企业版软件源,从而获取可靠的软件更新、安全增强以及企业级技术支持。
Proxmox VE 无订阅软件源
对于测试和非生产用途,建议使用 Proxmox VE 无订阅软件源。它不需要订阅密钥。
本文将使用 Proxmox VE 无订阅软件源。
设置无订阅软件源的方法如下:
- 在数据中心下导航到 PVE,然后点击 Shell(命令行)。
- 使用 vi 或 nano 等文本编辑器打开 sources.list。
- 将 Proxmox VE 无订阅软件源添加到 /etc/apt/sources.list:deb http://download.proxmox.com/debian/pve bookworm pve-no-subscription。保存更改并关闭编辑器。
- 禁用 Ceph 和 Proxmox 的企业版软件源:打开 /etc/apt/sources.list.d/ceph.list 并将该软件源注释掉:#deb https://enterprise.proxmox.com/debian/ceph-quincy bookworm enterprise;打开 /etc/apt/sources.list.d/pve-enterprise.list 并将该软件源注释掉:#deb https://enterprise.proxmox.com/debian/pve bookworm pve-enterprise。保存更改并关闭编辑器。
- 检查并安装更新:apt update && apt -y upgrade
- 可选:移除订阅提示:sed -Ezi.bak "s/(Ext.Msg.show\(\{\s+title: gettext\('No valid sub)/void\(\{ \/\/\1/g" /usr/share/javascript/proxmox-widget-toolkit/proxmoxlib.js && systemctl restart pveproxy.service。关于移除订阅提示,可参考 John's Computer Service。
4.5.2. 存储
在左侧窗格展开 PVE 时,会看到本地存储。将三块 SSD 添加为虚拟机和容器的存储。

- 在第二个窗格中点击 ZFS(位于“磁盘”下)。
- 点击“创建 ZFS”,选择磁盘,命名(例如“storage”),选择 RAID 级别(例如 RAIDZ),然后点击“创建”。

现在,创建虚拟机和容器,并将其磁盘和卷存放在 ZFS 存储上。

4.5.3. VLAN
在创建虚拟机和容器(CT)之前,先整理 VLAN,以便将它们连接到正确的网络。
点击“网络”打开概览(注意其中的 Linux Bridge vmbr0)。

点击“创建”,然后选择 Linux VLAN(Linux VLAN 虚拟接口)。

输入该 VLAN 的详细信息,然后点击“创建”。
- 先填写桥接名称,然后输入 VLAN 编号(以英文句点分隔)。
- 不要填写 IPv4/CIDR。
- 为清晰起见,在注释字段中填写 VLAN 名称。
- 点击“创建”。

成功添加 VLAN 2 后,生成的配置将类似于下方截图。

对其余 VLAN 重复此过程。
点击“应用配置”以使配置生效。
一些重要注意事项:

- 一旦为 VLAN 输入 IPv4/CIDR 信息,就可能出现路由问题。这不会影响虚拟机与物理网络节点之间的流量,但会影响 PVE 与虚拟机/物理网络节点之间的流量。这可能会给故障排查带来困扰。务必警惕!
- Open vSwitch(OVS)可作为 Linux 交换的替代方案:它使用单个 Linux 桥接和 Linux VLAN。你可以考虑选择 OVS Bridge 和 OVS InstPorts。关键在于必须先移除现有的桥接。因此,如果你更倾向使用 OVS:只有在新的 OVS Bridge 至少已正确创建后,才应用更改。强烈建议事先备份 `/etc/networking/interfaces` 的副本。万一网络配置出现严重错误,你可能需要使用(物理)键盘和显示器来修复。
4.5.4. 虚拟机与容器的安装源
我们的虚拟机使用 ISO 镜像;容器(CT)使用 CT 模板。
4.5.4.1. ISO 镜像
使用安装光盘(CD/DVD)的 ISO 镜像来安装虚拟机。
点击“local (pve101)”下的“ISO 镜像”,然后通过“上传”或“从 URL 下载”来添加 ISO 镜像。

4.5.4.2. CT 模板
容器具有较高的资源利用率。创建容器需要 CT 模板。
点击“CT 模板”,然后点击“模板”以列出可用模板。下载所需的模板。

4.6. Proxmox 备份
备份不可或缺。添加备份存储,并为虚拟机和容器启用备份。
4.6.1. 备份目标与任务
一种简单的备份方法是添加 SMB/CIFS 存储位置。在数据中心下的“存储”中添加一台 NAS。详情请参阅 Proxmox VE Wiki 中关于存储的章节。

在“存储”下找到“备份”选项,并参考 Proxmox Wiki 中的“备份与还原”以获取详细说明。
添加备份目标并创建备份计划是一个简单的过程。为了增强邮件通知功能,建议使用 relayhost(中继主机)。在 Proxmox 论坛上有一篇信息丰富的教程可供参考,标题为 [教程] 让 Postfix 向外部发送通知(邮件)。配置邮件通知对于监控备份是否成功至关重要。值得注意的是,该 relayhost 可以是我们自己托管的邮件服务器——这正是我们将在下一章深入探讨的主题!
5. 面向互联网的服务
托管邮件与 Web 服务器的考量
一个需要认真考虑的重要决定是:是否要自行托管邮件和 Web 服务器。尽管存在其他方案,例如使用虚拟专用服务器(VPS)或依赖外部托管服务,但本文基于在专用硬件上自托管的假设展开。
如果你确实对运行面向互联网的服务感到不安,那么最好不要这样做。在决定如何以及在何处托管关键服务时,安全性和舒适度是最重要的考量因素!
自托管理念
在我们的网络中,既有面向互联网的服务,也有内部服务。前者包括 Web 和邮件服务器等,这些服务需要在流程早期就进行搭建和保护。这些面向互联网的服务相当于我们网络的门面,需要谨慎配置以保证可访问性并受到保护。
我们将首先专注于面向互联网的服务,把搭建邮件服务器和 Web 服务器视为有价值的练习。这种方法使我们能够在深入处理内部服务(如域控制器和文件服务器,我们倾向于不将其暴露在互联网上)之前,先实现并保护好关键服务。优先配置和保障这些对外服务的安全,是确保其可访问性并受到保护的基本实践。
随着推进,我们还将在下一章探讨内部服务,从而确保构建出全面且组织良好的网络基础设施。
5.1. 路由流量
要为我们面向互联网的服务启用路由,必须满足某些要求。在某些情况下,现有的互联网连接可能无法满足这些条件,而更换连接也不可行。在这种情况下,就需要一个变通方案。
举例来说,托管邮件服务器需要在 DNS 中建立一条有效的指针(PTR)记录。通常,这条 PTR 记录由公网 IP 的运营方(通常是互联网服务提供商,ISP)来配置。必须确保与该互联网连接相关的公网 IP 地址拥有有效的 PTR 记录。服务器的完全限定域名(FQDN)必须与对该公网 IP 执行 PTR 查询所得的结果一致。若无法达成一致,就会给邮件的成功投递带来风险。当互联网服务提供商无法配置 PTR 记录时,就必须采取变通方案。本节将详述实施此类变通方案的潜在策略。
可能的解决方案之一是引入 GRE 隧道。通用路由封装(GRE,Generic Routing Encapsulation)是一种隧道协议,旨在将各种网络层协议封装在基于 IP 网络的虚拟点对点或点对多点链路中。
选择 GRE 是有意为之。虽然它不加密端点之间的流量,但 GRE 轻量且用途广泛,非常适合用于路由邮件和 Web 流量。
我们将建立一条 GRE 隧道,以在我们的 pfSense 防火墙与一台高性价比的虚拟专用服务器(VPS)之间高效地路由流量。借助该 VPS 的公网 IPv4 地址,我们将管理入站流量。这些流量将通过 GRE 隧道传输到运行在 Proxmox 上的服务器虚拟机。
总之,我们需要配置以下组件。
- 搭建一台运行(Debian)Linux 的 VPS,包括网络与 GRE 配置。
- 在该 VPS 上建立 IPTables 防火墙规则。
- 在 pfSense 上配置 GRE 及相关规则。
- 搭建一台运行 ISPConfig 服务器的虚拟机(基于 Debian Linux),负责托管邮件和 Web 服务器。
5.1.1. 选择 VPS 提供商
要求
选择虚拟专用服务器(VPS)提供商时,关键在于挑选符合特定要求的供应商。寻找允许使用公网 IPv4 地址、允许配置指针(PTR)记录,并提供不限流量服务的提供商。
出于本文目的,我们选择了 Strato 作为 VPS 提供商。Strato 是一家声誉良好的虚拟主机公司,提供包括虚拟专用服务器(VPS)在内的一系列方案。在现有产品中,VPS LINUX MINI VC1-1 和 VC1-2 都是合适的选择。截至本文撰写时,VC1-1 的月费仅为 1 欧元。虽然这款迷你 VPS 满足上述要求,但作者选择了 VC1-2 以获得更高的灵活性,因为他还打算将该 VPS 用于各种其他服务。
可用性
VC1-1 和 VC1-2 这两款 VPS 方案在 Strato 的荷兰和德国网站上均可购买。虽然其西班牙网站也存在,但不确定是否包含迷你 VPS 类别。值得注意的是,Strato 的英国和法国网站似乎不提供任何虚拟专用服务器选项。本文作者没有使用 Ionos 的经验,但它似乎也是一个值得考虑的高性价比选择(可作为 Strato 英国的替代方案)。
Strato VPS(VC1-2)的计费信息
Strato 按季度计费,VC1-2 VPS 的首张发票金额为 6 欧元。计费周期为一年,因此年费总计为 24 欧元(不含增值税)。不收取额外安装费用。
Strato 的下单流程
在下单过程中,会创建一个客户账户。该步骤完成后,订单进入处理阶段,可能需要数小时。随后,虚拟专用服务器(VPS)被开通,处于“裸机”状态。此时可以安装操作系统。操作系统安装完成后,root 用户即可登录。Strato 强制要求使用证书进行 SSH 访问以建立安全连接,这是一项合理的安全措施。
以下是在 Linux 中为 VPS 创建 SSH 证书的方法:
1. 打开终端并输入以下命令:
ssh-keygen -t ecdsa
2. 输入保存密钥的文件名(例如“id_strato_vps”),当提示输入密码短语(passphrase)时直接按回车。3. 将生成的公钥复制到 VPS 上。这是准备过程中至关重要的一步。4. 最后,使用以下命令登录 VPS:
ssh
[email protected]
-i $HOME/.ssh/id_strato_vps
请根据需要调整服务器名称和密钥,以建立连接。
请注意:必须为该服务器设置一条与所选域名对应的 DNS A 记录。该 A 记录应指向 VPS 的公网 IPv4 地址。这能确保正确的域名解析,并允许用户通过指定域名访问你的服务器。另一个必不可少的步骤是设置指针(PTR)记录。在大多数情况下,这需要在 VPS 提供商的管理面板中完成。
5.1.2. 自定义配置(VPS)
VPS 需要进行一些特定的自定义配置。
5.1.2.1. 自定义 Strato VPS
软件包
请确保安装所需的软件包。
apt update && apt -y install \
bzip2 \
cron \
dnsutils \
fail2ban \
iproute2 \
iptables \
mc \
nano \
net-tools \
unzip \
whois
移除 Cloud-init
建议移除 Cloud-init(一个在系统启动时自动完成云实例初始化的软件包),因为在我们这个场景中没有必要使用它。
touch /etc/cloud/cloud-init.disabled
dpkg-reconfigure cloud-init
apt-get purge cloud-init
rm -rf /etc/cloud/ && rm -rf /var/lib/cloud/
虽然不是强制要求,但建议重新启动系统。
reboot
Netplan
通过 Netplan 配置网络设置,具体是在默认文件 `/etc/netplan/50-cloud-init.yaml` 中进行。该文件将被修改,以加入 GRE 隧道的配置。
network:
ethernets:
all:
dhcp4: true
dhcp6: true
match:
name: en*
version: 2
由于 Cloud-init 已被移除,任何引用 Cloud-init 的警告都可以忽略。
现在,使用以下示例添加一条 GRE 隧道:
network:
ethernets:
all:
dhcp4: true
dhcp6: true
match:
name: en*
tunnels:
gre1:
mode: gre
local: 217.nnn.nnn.27
remote: 77.nnn.nnn.155
addresses: [172.30.250.2/29]
version: 2
请务必调整 local(本地)和 remote(远端)的 IPv4 地址。此处 "local" 表示 VPS,"remote" 表示隧道的另一个连接点(例如防火墙),address 表示 GRE 隧道在 VPS 一侧的内部地址。将 172.30.250.1/29 用作隧道另一端(例如防火墙)的内部地址。
防火墙规则
为了实现流量路由,需要在 VPS 启动过程中配置特定的防火墙规则。这可以通过一个防火墙脚本来实现。请从 Github 下载 fwall.sh 脚本,并将其放置到 `/opt/scripts` 目录中。请确保该脚本具有可执行权限。
mkdir /opt
mkdir /opt/scripts
cd /opt/scripts
wget "
https://raw.githubusercontent.com/bhenstra/LiFiWall-Scripts/main/IPTables%20Forwarding%20GRE/fwall.sh
"
nano fwall.sh
chmod +x fwall.sh
至少调整 "WL_SSH"、"WL_GRE" 和 "INT_PUB" 这几个变量。这些变量都顾名思义、含义明确,在 "BEGIN SETTINGS" 与 "END SETTINGS" 代码块中,每个变量前都有简短的注释说明。
最后,将该脚本添加到 root 的 crontab 中。
crontab -e
添加以下行:
@reboot /opt/scripts/fwall.sh > /dev/null 2>&1
完成上述配置后,VPS 就已经准备好接收并有效路由流量了。
5.1.3. 配置 pfSense
我们 GRE 隧道的另一端是 pfSense 路由器/防火墙。要建立此连接,需要配置一个 GRE 接口,并将其关联到 VPS 的公网 IPv4 地址。
通过 "Interfaces"(接口)> "Assignments"(分配)下的 "GREs" 选项,添加并配置所需的 GRE 接口。
- 父接口:选择 WAN 接口(例如 W1_0001_ISP1)
- 远端地址:VPS 的公网地址
- 本地 IPv4 隧道地址:172.30.250.1
- 远端 IPv4 隧道地址:172.30.250.2
- CIDR 格式的子网:/29
- 勾选 "Add Static Route"(添加静态路由)选项
- 输入一段描述,便于管理时参考
- 保存(Save)并应用(Apply)设置。
将 GRE 隧道表示为一个接口(这样做是为了能够对其应用防火墙规则)。
- 点击 "Interfaces"(接口)> "Assignments"(分配)。
- 在 "Available network ports"(可用网络端口)中选择 GRE 隧道,点击 "Add"(添加)。
- 保存(Save)并应用(Apply)更改。
- 点击该新接口以对其进行编辑。
- 启用该接口
- 定义一个描述 "W1_0001_GRE0"
- 将 MTU 设置为 1476。
保存(Save)并应用(Apply)更改。
尽管对 WAN 接口而言并非必须,仍需为新的 GRE 隧道定义防火墙规则。首先,创建一个表示所接受流量的端口别名。
点击 "Firewall"(防火墙)> "Aliases"(别名)> "Ports"(端口)。点击 "Add"(添加)。
- 名称:Ports_Ingress_GRE_TCP
- 描述:GRE 接受的 TCP 端口
- 类型:Port(s)(端口)
- 添加以下端口,每行一个;点击 "Add Port"(添加端口)以增加一行:25 80 443 465 587 993
- 25
- 80
- 443
- 465
- 587
- 993
保存(Save)并应用(Apply)更改
点击 "Firewall"(防火墙)> "Rules"(规则)> "W1_0001_GRE0",添加一条接受 ICMP 流量的规则。点击 "Add"(添加)以创建如下规则。
- 动作:Pass(放行)
- 接口:"W1_0001_GRE0"
- 地址族:IPv4
- 协议:ICMP
- ICMP 子类型:Echo Request、Traceroute
- 源:W1_0001_GRE0 子网
- 目标:W1_0001_GRE0 子网
- 描述:允许来自 GRE0 子网的 ICMP
- Echo Request(回显请求)
- Traceroute(路由追踪)
保存(Save)并应用(Apply)更改
点击 "Firewall"(防火墙)> "NAT",我们将在下方的 NAT 规则中应用该端口别名。点击 "Add"(添加)以创建如下 NAT 规则。
- 接口:W1_0001_GRE0
- 地址族:IPv4
- 协议:TCP
- 目标:W1_0001_GRE0 地址
- 目标端口范围:起始端口:other(其他) 自定义:Ports_Ingress_GRE_TCP
- 重定向 IP:Address or Alias(地址或别名):172.31.252.103
- 重定向目标端口:Port(端口):Other(其他) 自定义:Ports_Ingress_GRE_TCP
- 描述:允许经由 GRE 的入站流量
- 起始端口:other(其他)
- 自定义:Ports_Ingress_GRE_TCP
- 端口:Other(其他)
- 自定义:Ports_Ingress_GRE_TCP
保存(Save)并应用(Apply)更改
注意:IPv4 地址 172.31.252.103 代表我们在 DMZ 中运行 ISPConfig 服务器的虚拟机。如有需要,可以自行选择其他 IPv4 地址。
5.2. 安装 ISPConfig
ISPConfig 是一个用于管理多台服务器的开源 Linux 面板,它将安装在 Proxmox 上的一个 Linux 容器中。请根据需要自定义 IPv4(例如 172.31.252.103)和 FQDN(例如 s3.gigabitjes.nl)。
5.2.1. 下载容器模板
请参考 "4.5.4.2. CT 模板" 并下载 "debian-12-standard"。此操作将耗时几秒钟。
CT 模板的默认存放位置位于 PVE 的 "local" 存储选项下的 "CT Templates"(CT 模板)中。
5.2.2. 创建容器
- 点击 "Create CT"(创建 CT)以创建一个新容器。
- 输入所需设置。常规(General)
- 输入 CT ID:103
- 输入主机名:s3
- 输入并确认所需的 root 密码
- 点击 Next(下一步)模板(Template)
- 选择模板:debian-12-standard_12.2-1_amd64.tar.zst
- 点击 Next(下一步)磁盘(Disks)
- 选择存储(在我们的示例中为 "storage")
- 设置磁盘大小(GB):例如 "200"
- 点击 Next(下一步)CPU
- 设置核心数:例如 "2"
- 点击 Next(下一步)内存(Memory)
- 设置内存大小(MiB):例如 "4096"
- 设置交换分区(swap,MiB):例如 "8192"
- 点击 Next(下一步)网络(Network)
- 保持名称和网桥(bridge)不变
- 设置 VLAN 标签(VLAN Tag):252
- 输入 IPv4/CIDR:172.31.252.103/24
- 输入网关 IPv4:172.31.252.1
- 点击 Next(下一步)DNS
- 输入 DNS 域:例如 "gigabitjes.nl"
- 输入 DNS 服务器:172.31.252.1
- 点击 Next(下一步)确认(Confirm)
- 点击 Finish(完成),复查并确认各项选项。
- 选择新容器并点击 "Console"(控制台)。
- 点击 "Start"(启动)以启动容器。
5.2.3. 完美服务器自动化 ISPConfig 3 安装
以下步骤改编自《在 Debian 10 至 Debian 12、Ubuntu 20.04 和 Ubuntu 22.04 上自动化安装完美服务器 ISPConfig 3》教程。
点击该容器(s3)并选择 "Console"(控制台)。以 root 身份登录。
5.2.3.1. 更新 apt 源
编辑 apt 的 sources.list 文件
nano /etc/sources.list
使其与以下列表一致:
deb http://deb.debian.org/debian bookworm main contrib deb http://deb.debian.org/debian bookworm-updates main contrib deb http://security.debian.org bookworm-security main contrib deb http://deb.debian.org/debian bookworm-backports main contrib
5.2.3.2. 软件包
接下来,我们将按照 5.2.3.2.2 节中的步骤,无缝地升级关键的软件包,以确保系统安全并优化整体性能。定期升级软件包至关重要,是维持系统安全性与最佳性能的必要实践。
5.2.3.2.1. 内核
容器是轻量级的,直接使用宿主机(hypervisor)的内核。因此无需为容器安装新内核。请跳过以下步骤,直接继续 5.2.3.2.2 节「升级软件包」。
如果使用虚拟机(VM),可以考虑安装最新的云内核(cloud kernel)。使用以下命令查找最新的 Linux 云内核:
apt update && apt-cache search linux-image | grep "cloud"
选择并安装最新版本。撰写本文时,最新版本为 "linux-image-6.5.0-0.deb12.4-cloud-amd64":
apt -y install linux-image-6.5.0-0.deb12.4-cloud-amd64
5.2.3.2.2. 升级软件包
apt update && apt -y upgrade
5.2.3.3. 重启容器。
reboot
5.2.3.4. 运行自动安装程序
重启后以 root 身份登录。下面的过程与原教程几乎相同。区别在于主机名和域的设置方式,以及容器无法使用配额(quota)。你会注意到安装命令中增加了 "--no-quota" 参数。
现在可以运行自动安装程序了。基本安装包含以下软件包(及其依赖项):Apache2、PHP(5.6 – 8.0 版本)、MariaDB、Postfix、Dovecot、Rspamd、BIND、Jailkit、Roundcube、PHPMyAdmin、Mailman、Webalizer、AWStats 和 GoAccess。你可以通过向安装程序传递参数,轻松选择不使用某些功能或安装额外的服务。可用的命令行选项请参阅原教程第 6 章。
可以选择使用 Apache Web 服务器的 ISPConfig(5.2.3.4.1),或者使用 Nginx Web 服务器的 ISPConfig(5.2.3.4.2)。
5.2.3.4.1. 使用 Apache Web 服务器安装 ISPConfig
现在可以带参数运行该脚本了。例如,如果你想要一个使用 Apache Web 服务器、为被动 FTP 指定端口范围并启用无人值守升级(unattended-upgrades)的常规安装,请运行:
wget -O - https://get.ispconfig.org | sh -s -- --use-ftp-ports=40110-40210 --unattended-upgrades
--no-quota
后续步骤详见 "5.2.3.4.3. 运行自动安装程序"。
5.2.3.4.2. 使用 Nginx Web 服务器安装 ISPConfig 现在可以带参数运行该脚本了。例如,如果你想要一个使用 Nginx Web 服务器、为被动 FTP 指定端口范围并启用无人值守升级的常规安装,请运行:
wget -O - https://get.ispconfig.org | sh -s -- --use-nginx --use-ftp-ports=40110-40210 --unattended-upgrades --no-quota
后续步骤详见 "5.2.3.4.3. 运行自动安装程序"。
5.2.3.4.3. 运行自动安装程序
稍等片刻,当提示是否重新配置整台服务器时,输入 'yes' 并按回车键以启动安装程序。
WARNING! This script will reconfigure your complete server! It should be run on a freshly installed server and all current configuration that you have done will most likely be lost! Type 'yes' if you really want to continue:
完成后,请记下 ISPConfig 管理员密码和 MySQL root 密码。
[INFO] Your ISPConfig admin password is: 8ZxSEWakDgSLXv [INFO] Your MySQL root password is: EhFrU3KYVLPVBbcJr2Js
5.2.3.5. 设置防火墙
通过 ISPConfig(Web)界面配置防火墙。要访问 8080 端口,可以在 VPS 和 pfSense 防火墙中同时放行该端口,或者在 pfSense 中添加主机覆盖(host override)。鉴于本文,我们选择后者。
打开 pfSense 的 Web 界面,点击 "Services"(服务)> "DNS Forwarder"(DNS 转发器)。向下滚动到 "Host Overrides"(主机覆盖),点击 Add(添加)。输入主机名(例如 "s3")、域名(例如 "gigabitjes.nl")和 IPv4 地址(例如 "172.31.252.103")。输入一段描述(例如 "Internal hosting server s3")。保存(Save)并应用更改(Apply Changes)。
输入 FQDN 或 IPv4 地址(例如 "https://s3.gigabitjes.nl:8080" 或 "https://172.31.252.103:8080")。你可以忽略 "证书不受信任" 的警告。点击「高级」并继续访问该网站。
登录 ISPConfig 界面,进入 "System"(系统)> "Firewall"(防火墙)。然后点击 "Add new firewall record"(添加新的防火墙记录)。
对于常规配置,需要开放的端口如下:
- TCP:20,21,22,25,80,443,40110:40210,110,143,465,587,993,995,53,8080,8081
- UDP:53
更多细节请参阅原教程第五章。
5.2.3.6. 延伸阅读
请参阅原教程第六、七章,了解高级选项、实用技巧(在「Finalizing」部分)以及配置邮件的重要注意事项(rDNS、SPF、DKIM)。由于存在分离 DNS(split DNS),DNS 的考量非常关键,它会影响到在我们的局域网(LAN)内托管服务器的 DNS 解析方式。
可参考 ISPConfig 3 用户手册,售价仅为 €5(不含增值税)。
5.3. 网站与邮件域名
可以使用 "Sites"(站点)选项轻松添加网站,而邮件域则可通过 "Email"(邮件)选项加入。整个过程简单直接,符合人们对托管面板所期望的直观功能。除了上一段提到的手册外,还提供优质的社区支持。
虽然 ISPConfig 支持 DNS,但本文假定域名是在 ISPConfig 之外、通过 DNS 管理器(通常是注册商或托管服务商)来管理的。
要使用此类域名,其 DNS 记录必须指向 VPS 的公网 IPv4 地址。
5.3.1. A 记录与 CNAME 记录简要说明
一个网站 A 记录示例如下:
example.com. 86400 IN A 93.184.216.34
当有人访问 "example.com" 时,会被解析到 IPv4 地址 "83.184.216.34"。只需将 "example.com." 替换为你自己的域名,并将 "93.184.216.34" 替换为你的 VPS 的 IPv4 地址即可。
除了 A 记录外,通常使用作为别名的 CNAME 记录。例如,像 "www.example.com" 这样的 FQDN 可以作为 "example.com." 的别名。如果未设置此类 CNAME 记录,可能会导致访客无法访问。
5.3.2. MX 记录简要说明
一个邮件域 MX 记录示例如下:
example.com. 300 IN MX 0 mail.example.com.
当有人向例如 [email protected] 发送邮件时,邮件服务器会尝试将信件投递到 mail.example.com。而主机 mail.example.com 自身需要一条有效的 A 记录。
将 "example.com." 替换为你的邮件域,并将 "mail.example.com." 替换为你的 VPS 的 FQDN。在本文中,即为 s3.gigabitjes.nl。
5.3.3. SPF、DKIM 与 DMARC 简要说明
垃圾邮件是一个现代问题。已有多种技术可用于缓解垃圾邮件,这些技术是必须实施的。若未能实施恰当的策略,将导致邮件投递出现问题。
要实现正常的邮件投递,需要配置多种 DNS 文本记录(TXT)。SPF 记录至关重要,必须包含 VPS 的 FQDN 或公网 IPv4 作为允许的发送方。DMARC 和 DKIM 是另外两个必不可少的协议。后者(DKIM)可以通过 ISPConfig 轻松启用。启用后,系统会为该邮件域的每封出站邮件的正文和信头附加一个数字签名。ISPConfig 会生成所需的 DNS 记录,该记录需要发布到 DNS 中(发布 DNS 记录并非自动进行)。
DMARC 建立了一项策略,告知接收方的 MX 网关如何处理那些无法依据 DKIM 或 SPF 验证的入站邮件。这可能涉及丢弃或隔离所有未通过验证的邮件。DMARC 策略发布在 DNS 中,并可以包含一个邮件地址,邮件系统可向该地址报告被拒绝的邮件。这对域名运营者很有价值,有助于监控邮件的投递情况。
细节将在以下各段简要描述。尽管阐述中存在一些冗余,但这是为了用不同的术语来解释这一略显复杂的主题,同时保持简洁。
5.3.3.1. SPF(发件人策略框架)
SPF 是一种防止发件人地址伪造的机制。它允许域名所有者指定哪些邮件服务器被授权以其域名发送电子邮件。
SPF 记录示例:
v=spf1 ip4:203.0.113.101 include :_spf.example.com -all
在此示例中,SPF 记录声明邮件可以从 IPv4 地址 203.0.113.101 发送,并包含 _spf.example.com 的 SPF 记录。-all 表示硬失败(hard fail),即如果服务器未列于 SPF 记录中,该邮件将被拒绝。
5.3.3.2. DKIM(域名密钥识别邮件):
DKIM 为电子邮件附加一个数字签名,使收件人能够验证邮件在传输过程中未被篡改,并且确实来自其声称的域。
DKIM 记录示例:
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxLXFhjjUrU4yEh28qOrSXrJAEi9YZ5zOZkx3WENrRIZ6jyBQT35gYWvDjM6TAgDgSpwCjtgmAwr6JuFTEPTXvmSUGuJrkSj9rgjrgE+HxHjYsPFJmlqlwI+ywOo5e3C5L8vJzWvl98ZAF/ZdD+XW+D/wRZKw1H7Sn5yiy2S/wIDAQAB
这是一条 DKIM 公钥。私钥用于对出站邮件进行签名,公钥则发布在 DNS 中。选择器(s=)通常用于标识某个特定发送服务所用的密钥。
5.3.3.3. DMARC(基于域的消息认证、报告和一致性):
DMARC 建立在 SPF 和 DKIM 之上,为电子邮件发送方提供了一种认证其邮件、并请求对认证失败的邮件进行报告的方式。
DMARC 记录示例:
v=DMARC1; p=quarantine; rua=mailto: [email protected] ; ruf=mailto: [email protected] ; sp=quarantine; adkim=s; aspf=s; fo=1
这条 DMARC 记录要求将认证失败的邮件隔离,并将聚合报告(aggregate)和取证报告(forensic)分别发送至 [email protected] 和 [email protected]。adkim 和 aspf 指定了 DKIM 和 SPF 的严格对齐(strict alignment)。
请记得将示例中的域名、密钥和电子邮件地址替换为你自己的真实信息。此外,DNS 记录可能需要一段时间才能传播,因此建议对配置进行测试和监控。
延伸阅读:SIDN 发布了一篇内容丰富的文章,介绍了用于保障邮件流量安全的各种协议。
5.3.4. 查询 DNS 记录
在 Linux 中,可以使用 `dig` 命令查询 DNS 记录。这非常有用,因为它能让你了解其他方是如何配置相关记录的。
例如,微软在许多文档中使用 contoso.com 这个域名。查询 contoso 域是一个有益的实践,可以借此了解 DNS 记录的样子。
5.3.4.1. 示例:查询 contoso.com 的 A 记录:
dig A contoso.com.
结果如下:
; <<>> DiG 9.19.17-1-Debian <<>> A contoso.com. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46943 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;contoso.com. IN A ;; ANSWER SECTION: contoso.com. 3394 IN A 20.112.250.133 contoso.com. 3394 IN A 20.236.44.162 contoso.com. 3394 IN A 20.231.239.246 contoso.com. 3394 IN A 20.70.246.20 contoso.com. 3394 IN A 20.76.201.171 ;; Query time: 0 msec ;; SERVER: 172.21.1.1#53(172.21.1.1) (UDP) ;; [..]
5.3.4.2. 示例:查询 www.contoso.com 的 CNAME 记录:
dig cname www.contoso.com.
结果如下:
; <<>> DiG 9.19.17-1-Debian <<>> cname www.contoso.com. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2164 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;www.contoso.com. IN CNAME ;; ANSWER SECTION: www.contoso.com. 3600 IN CNAME contoso.com. ;; Query time: 24 msec ;; SERVER: 172.21.1.1#53(172.21.1.1) (UDP) ;; [..]
5.3.4.3. 结合使用 `grep`
通过在 `dig` 命令中结合使用 `grep` 命令,我们可以轻松找到 contoso.com 的 SPF 记录。
dig TXT contoso.com | grep spf
结果如下:
contoso.com. 3030 IN TXT "v=spf1 include:spf.protection.outlook.com -all"
5.3.4.4. 使用其他工具
还有其他工具可用于对 DNS 记录进行研究。
DNSdumpster.com
其中一个例子是网站 DNSdumpster.com。DNSdumpster.com 是一个免费的域名研究工具,可以发现与某个域相关的主机。从攻击者的视角找出暴露的主机,是安全评估过程中的重要环节。
MXToolbox.com
MXToolbox.com 可用作验证 MX 记录有效性、排查邮件问题的工具。
Mail-Tester.com
与 MXToolbox.com 相关的是 Mail-Tester.com。这些工具可用于测试邮件的投递情况。用它来验证 DKIM 签名是否生效是个不错的选择。
6. 内部服务
随着我们不断推进 IT 基础设施的配置,现在将注意力转向内部服务。
支持终端用户的一个关键环节,是对计算机和用户账户进行集中管理。在围绕 Windows 构建的环境中,引入 Active Directory(活动目录)是一个合乎逻辑的选择。或者,也可以考虑 Microsoft Azure AD 和 Microsoft 365。另一种方案是部署远程监控与管理(RMM)系统,在每台计算机上安装一个代理(agent)。在某些场景下,将 Microsoft 365 与 RMM 管理结合使用可能会很有效。
这些考量需要仔细评估。不过,就本文而言,我们将搭建一台域控制器(Domain Controller),并选择以 Samba DC 的轻量方案来替代传统的 Windows Server。
6.1. Samba 域控制器
传统上,Windows Server 充当域控制器,负责用户认证、DNS 和 DHCP 服务。在较小的环境中,单个域控制器就足够了,但出于冗余考虑,最好至少部署两台。
将 Samba 配置为 Active Directory 域控制器需要在 Linux 终端上进行命令行操作。不过,日常的管理工作可以在安装了远程服务器管理工具(RSAT)的 Windows Pro 计算机上完成,从而方便地使用「Active Directory 用户和计算机」(dsa.msc)和「组策略管理控制台」(gpmc.msc)等工具。这也使得组策略的应用成为可能。
SambaWiki 文档提供了在 Debian Linux 下搭建域控制器的全面指导。它甚至在「手动维护的发行版特定软件包列表」一节中列出了需要安装的 Debian 软件包。
本文的部分内容基于 SambaWiki [wiki.samba.org] 的示例改编而来。SambaWiki 的内容采用 CC-BY 许可发布。CC-BY 要求注明修改之处。本文所做的修改,主要是将示例中的域名替换为本文所使用的域名。
请注意,Samba 并未实现 SysVol 复制(replication)。为解决这一问题,需要搭建基于 RSync 和 Unison 的双向 SysVol 复制。
6.1.1. 创建容器
创建容器的过程与 5.2.2 节所述类似。关键区别在于需要取消勾选「非特权容器」(unprivileged container)选项。
- 点击 "Create CT"(创建 CT)以新建一个容器。
- 输入所需设置。常规(General)
- 输入 CT ID:201
- 输入主机名:sdc1
- 非特权容器(Unprivileged container):取消勾选 [这一点很重要]
- 输入并确认所需的 root 密码
- 点击 Next(下一步)。注意:此处使用的是特权容器(privileged container)。容器外部的资源可被修改。如果你不喜欢这一点,最好改用虚拟机(VM)而非容器。模板(Template)
- 选择模板:debian-12-standard_12.2-1_amd64.tar.zst
- 点击 Next(下一步)磁盘(Disks)
- 选择存储(在我们的示例中为 "storage")
- 设置磁盘大小(GB):例如 "48"
- 点击 Next(下一步)CPU
- 设置核心数:例如 "4"
- 点击 Next(下一步)内存(Memory)
- 设置内存大小(MiB):例如 "8192"。注意:初始阶段应分配充足的 RAM,因为数据库重新打包(repacking)过程在配置(provisioning)期间需要大量内存。
- 设置交换分区(swap,MiB):例如 "8192"
- 点击 Next(下一步)网络(Network)
- 保持名称和网桥(bridge)不变
- 设置 VLAN 标签(VLAN Tag):16
- 输入 IPv4/CIDR:10.10.16.201/24
- 输入网关 IPv4:10.10.16.1
- 点击 Next(下一步)DNS
- 输入 DNS 域:例如 "ad.lan.gigabitjes.nl"
- 输入 DNS 服务器:10.10.16.1
- 点击 Next(下一步)确认(Confirm)
- 点击 Finish(完成),复查并确认各项选项。
- 选择新容器并点击 "Console"(控制台)。
- 点击 "Start"(启动)以启动容器。
6.1.2. 准备与检查
点击该容器(sdc1)并选择 "Console"(控制台)以访问容器。以 root 身份登录。
6.1.2.1. 更新 apt 源
编辑 apt 的 sources.list 文件
nano /etc/apt/sources.list
将其更新为与以下列表一致:
deb http://deb.debian.org/debian bookworm main contrib non-free deb http://deb.debian.org/debian bookworm-updates main contrib non-free deb http://security.debian.org bookworm-security main contrib non-free deb http://deb.debian.org/debian bookworm-backports main contrib non-free
6.1.2.2. 软件包
对于容器,无需安装新内核。跳过与内核相关的步骤,继续下一步。
如果使用虚拟机(VM),可以考虑安装最新的云内核(cloud kernel)。使用以下命令查找最新的 Linux 云内核:
apt update && apt-cache search linux-image | grep "cloud"
选择并安装最新版本。撰写本文时,最新版本为 "linux-image-6.5.0-0.deb12.4-cloud-amd64":
apt -y install linux-image-6.5.0-0.deb12.4-cloud-amd64
6.1.2.2.2.2. 升级软件包
apt update && apt -y upgrade
6.1.2.3. 屏蔽 systemd-logind
systemctl mask systemd-logind
这可以解决重启和登录缓慢的问题。在执行 reboot 命令后,如果出现关于 dbus 的错误信息,可以忽略;这样做是安全的。
6.1.2.4. 重启容器。
reboot
6.1.2.4. 验证设置
以 root 身份登录,并验证容器设置。
重启后,以 root 身份登录并验证容器的基本设置。如有错误,请通过 Proxmox Web 界面而非容器的控制台进行更正。
6.1.2.4.1. 验证主机名与网络设置
hostname && hostname -f
此处应显示主机名(例如 "sdc1")以及带后缀的完全限定域名(FQDN,例如 "sdc1.ad.lan.gigabitjes.nl")。
sdc1 sdc1.ad.lan.gigabitjes.nl
6.1.2.4.2. 验证网络设置
ip a
此处应显示 IPv4 地址和 CIDR,例如:
[..] 2: eth0@if28: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether bc:24:11:0c:56:f2 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet 10.10.16.201/24 brd 10.10.16.255 scope global eth0 valid_lft forever preferred_lft forever [..]
6.1.2.4.3. 验证默认路由
ip route show
此处应显示默认网关,例如:
default via 10.10.16.1 dev eth0 onlink 10.10.16.0/24 dev eth0 proto kernel scope link src 10.10.16.201
6.1.2.4.4. 验证 DNS
检查 resolv.conf 文件的内容:
cat /etc/resolv.conf
此处应列出搜索域(search domain)和名称服务器(nameserver):
[..] search ad.lan.gigabitjes.nl nameserver 10.10.16.1 [..]
确保 DNS 解析正常工作:
dig +short contoso.com.
此处应列出一个或多个 IPv4 地址。
20.70.246.20 20.76.201.171 20.112.250.133 20.236.44.162 20.231.239.246
请再次检查解析结果,因为这至关重要。
6.1.3. 安装与配置 Samba
后续步骤改编自《将 Samba 设置为 Active Directory 域控制器》。
6.1.3.1. 安装所需软件包
apt update && apt -t bookworm-backports -y install acl attr samba winbind libpam-winbind libnss-winbind krb5-config krb5-user dnsutils python3-setproctitle net-tools smbclient
在软件包配置过程中,当提示输入与 Kerberos 相关的详细信息时,按回车键(Enter)即可。在配置(provisioning)Samba AD 之后,Kerberos 配置文件将被覆盖。
[..] Package configuration: Configuring Kerberos Authentication
6.1.3.2. 配置 Samba AD
启动交互式配置(provisioning)过程:
samba-tool domain provision --use-rfc2307 --interactive
对于 realm(域领域)、domain(域)、server role(服务器角色)、DNS backend(DNS 后端)和 DNS forwarder(DNS 转发器),按回车键使用默认值。输入并确认密码。
Realm: AD.LAN.GIGABITJES.NL Domain: AD Server Role: dc DNS backend: SAMBA_INTERNAL DNS forwarder IP address: 10.10.16.1 Administrator password: $trongPas5w0rd! Retype password
该过程应耗时几秒到几分钟。
该过程应耗时几秒到几分钟。如果耗时更长(数小时),则可能是在数据库重新打包期间出现了内存不足的问题。在这种情况下,请删除该容器,增加更多 RAM(以及尽可能增加 CPU)后再重新开始。
6.1.3.3. 配置 Kerberos
将生成的配置文件覆盖到现有文件上:
cp /usr/local/samba/private/krb5.conf /etc/krb5.conf
6.1.3.4. 启动 Samba 服务
运行以下命令:
systemctl enable samba-ad-dc
systemctl start samba-ad-dc
部分必要进程可能未运行。请重启容器:
reboot
6.1.3.5. DNS(pfSense)
对于 DNS 转发,需确保针对该域的查询被指回域控制器。在 pfSense 中添加一条域覆盖(domain override):
- 打开 pfSense
- 点击 "Services"(服务)> "DNS Resolvers"(DNS 解析器)
- 向下滚动,点击 add(添加)以添加以下域覆盖。Domain(域):ad.lan.gigabitjes.nl IP Address(IP 地址):10.10.16.201 Description(描述):Active Directory
- 保存(Save)并应用更改(Apply Changes)
- Domain(域):ad.lan.gigabitjes.nl
- IP Address(IP 地址):10.10.16.201
- Description(描述):Active Directory
我们还将为反向查找区域(reverse lookup zone)添加一条域覆盖记录:
- 点击 "Services"(服务)> "DNS Resolvers"(DNS 解析器)
- 向下滚动,点击 add(添加)以添加以下域覆盖。Domain(域):16.10.10.in-addr.arpa IP Address(IP 地址):10.10.16.201 Description(描述):Active Directory - Reverse Zone Lookup(反向区域查找)
- 保存(Save)并应用更改(Apply Changes)
- Domain(域):16.10.10.in-addr.arpa
- IP Address(IP 地址):10.10.16.201
- Description(描述):Active Directory - Reverse Zone Lookup(反向区域查找)
在 pfSense 中为办公局域网(L1_0032_OFF1)的 DHCP 设置域名(Domain Name)和域搜索列表(Domain Search List)也是个好主意。
- 点击 "Services"(服务)> "DHCP Server"(DHCP 服务器)
- 点击 "L1_0032_OFF1"
- 向下滚动到 "Other DHCP Options"(其他 DHCP 选项)部分
- 在 "Domain Name"(域名)选项中输入:ad.lan.gigabitjes.nl
- 在 "Domain Search List"(域搜索列表)选项中输入:lan.gigabitjes.nl
- 保存(Save)并应用更改(Apply Changes)
该配置对于拥有不同域后缀的主机环境非常有益,能够简化跨多个子域访问资源的过程。
6.1.3.6. DNS(域控制器)
登录新域控制器的控制台,以添加反向区域(reverse zone)和指针记录(PTR)。
在示例中,我们将使用 "10.10.16.0/24" 子网,将 IPv4 地址的八位组(octet)逆序排列,且不使用第四个八位组。后缀始终为 ".in-addr.arpa."。
6.1.3.6.1. 创建反向区域:
samba-tool dns zonecreate sdc1 16.10.10.in-addr.arpa -U Administrator
结果:
Password for [AD\Administrator]: Zone 16.10.10.in-addr.arpa created successfully
6.1.3.6.2. 添加指针记录(PTR):
samba-tool dns add sdc1 16.10.10.in-addr.arpa 201 PTR sdc1.ad.lan.gigabitjes.nl -U Administrator
结果:
Password for [AD\Administrator]: Record added successfully
6.1.4. 配置 NTP
容器共享其宿主系统的时钟。因此无需在容器中运行 ntpd。
移除任何 NTP 守护进程:
apt -y remove --purge systemd-timesyncd chrony ntp
正确的时间同步非常重要。请确保 NTP 在宿主机(hypervisor)和 pfSense 防火墙上都能正常工作。最好配置相同的 NTP 源。
6.1.5. 测试新的 Active Directory 域控制器
登录新域控制器的控制台,运行测试以确保一切按预期工作。
6.1.5.1. 列出共享:
smbclient -L localhost -N
结果:
Anonymous login successful
Sharename Type Comment --------- ---- ------- sysvol Disk netlogon Disk IPC$ IPC IPC Service (Samba 4.19.3-Debian) SMB1 disabled -- no workgroup available
6.1.5.2. 验证认证:
smbclient //localhost/netlogon -UAdministrator -c 'ls'
结果:
Password for [AD\Administrator]: . D 0 Sun Jan 7 21:00:46 2024 .. D 0 Sun Jan 7 21:00:46 2024 50331648 blocks of size 1024. 49794560 blocks available
6.1.5.3. 验证 DNS
一个稳健高效的域名系统(DNS)是必不可少的。
6.1.5.3.1. 查询域中基于 TCP 的 _ldap SRV 记录:
host -t SRV _ldap._tcp.ad.lan.gigabitjes.nl.
结果:
_ldap._tcp.ad.lan.gigabitjes.nl has SRV record 0 100 389 sdc1.ad.lan.gigabitjes.nl.
除了 `host` 命令外,也可以使用 `dig` 命令。
dig SRV _ldap._tcp.ad.lan.gigabitjes.nl.
结果:
; <<>> DiG 9.18.19-1~deb12u1-Debian <<>> SRV _ldap._tcp.ad.lan.gigabitjes.nl. ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 7431 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;_ldap._tcp.ad.lan.gigabitjes.nl. IN SRV
;; ANSWER SECTION: _ldap._tcp.ad.lan.gigabitjes.nl. 312 IN SRV 0 100 389 sdc1.ad.lan.gigabitjes.nl.
;; Query time: 0 msec ;; SERVER: 10.10.16.1#53(10.10.16.1) (UDP) ;; WHEN: Mon Jan 08 20:33:02 UTC 2024 ;; MSG SIZE rcvd: 105
6.1.5.3.2. 查询域中基于 UDP 的 _kerberos SRV 资源记录:
host -t SRV _kerberos._udp.ad.lan.gigabitjes.nl.
结果:
_kerberos._udp.ad.lan.gigabitjes.nl has SRV record 0 100 88 sdc1.ad.lan.gigabitjes.nl.
6.1.5.3.3. 查询域控制器的 A 记录:
host -t A sdc1.ad.lan.gigabitjes.nl.
结果:
sdc1.ad.lan.gigabitjes.nl has address 10.10.16.201
6.1.5.3.4. 查询域控制器的 PTR 记录
host -t PTR 10.10.16.201
结果:
201.16.10.10.in-addr.arpa domain name pointer sdc1.ad.lan.gigabitjes.nl.
这如预期般正常工作,因为我们已经为反向查找区域添加了覆盖条目(6.1.3.5)。
6.1.5.3.5. 验证 Kerberos:
klist
结果:
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: [email protected] Valid starting Expires Service principal 01/07/24 21:34:31 01/08/24 07:34:31 krbtgt/ [email protected] renew until 01/08/24 21:34:24
6.1.6. 将 Samba DC 加入现有 Active Directory
即将发布的文档修订版将包含上述流程。目前暂不提供详细说明。
6.1.6.1. 部署 Samba AD
建议部署一台辅助域控制器。该过程与前文所述类似,具体步骤详见 SambaWiki 中“将 Samba DC 加入现有 Active Directory”的相关内容。
6.1.6.2. SysVol 复制
请特别关注 SysVol 复制,具体请参考 SambaWiki 中关于 SysVol 复制(DFS-R)的说明。
6.2. 文件服务器
考虑到文件管理在我们的环境中扮演着关键角色,传统的文件服务器仍然不可或缺。尽管当下趋势正转向 Microsoft 365、Google Workspace 等基于 Web 的方案,或 NextCloud、ownCloud 这类自托管替代方案,本文仍将重点放在 TrueNAS 与 Samba 之间的选择上。OpenMediaVault(OMV)也曾被纳入考虑,但由于缺乏对 Active Directory 的官方支持,它无法满足我们的需求。
为了保持简洁并契合我们精简部署的原则,Samba 成为相较 TrueNAS 的更优选。
文件服务器就绪后,我们的关注点将转向后续章节“用户与计算机”。首要步骤是将一台 Windows 计算机加入基于 Samba 的 Active Directory,并深入探讨文件共享的细节。
在前面的章节中我们使用了容器。而这里我们将为文件服务器创建一个虚拟机。接下来从 ISO 镜像安装 Debian Linux,最后安装 Samba 并将其配置为已加入域的文件服务器。
6.2.1. 创建虚拟机
运行虚拟机与运行容器虽然目的一致,但方式不同。一个显著区别在于使用 ISO 文件而非模板。让我们先获取所需的 ISO 文件。
6.2.1.1. 下载 Debian NetInst ISO
首先,找到所需 ISO 文件的下载地址(URL):
- 访问 https://www.debian.org/distrib/netinst 。
- 在 amd64 上单击右键,选择“复制链接地址”(见截图)。

接下来,将 URL 粘贴到 Proxmox 中:
- 访问本地存储(local storage)
- 进入“ISO Images”(ISO 镜像)
- 选择“Download from URL”(从 URL 下载)
- 将 URL 粘贴到 URL 字段中
- 点击“Query URL”(查询 URL)
- 最后,点击“Download”(下载)

6.2.1.2. 创建虚拟机
我们来创建虚拟机:
- 点击“Create VM”(创建虚拟机)
- 常规(General):虚拟机 ID:301 名称:file1 点击“Next”(下一步)
- 操作系统(OS):选择 ISO 镜像:debian-xx.y.z-amd64-netinst.iso 点击“Next”
- 系统(System):SCSI 控制器:VirtIO SCSI 勾选“Qemu Agent” 点击“Next”
- 磁盘(Disk):存储:storage 磁盘大小(GiB):例如 640 缓存:Write back(回写) 点击“Next”
- CPU:插槽数(Sockets):1 核心数(Cores):4 点击“Next”
- 内存(Memory):内存(MiB):2048 最小内存(MiB):2048 点击“Next”
- 网络(Network):桥接:vmbr0 VLAN 标签:16 型号:Intel E1000(不要选“virtio”,无法工作) 点击“Next”
- 确认(Confirm):检查配置 点击“Finish”(完成)
- 虚拟机 ID:301
- 名称:file1
- 点击“Next”(下一步)
- 选择 ISO 镜像:debian-xx.y.z-amd64-netinst.iso
- 点击“Next”
- SCSI 控制器:VirtIO SCSI
- 勾选“Qemu Agent”复选框
- 点击“Next”
- 存储:storage
- 磁盘大小(GiB):例如 640
- 缓存:Write back(回写)
- 点击“Next”
- 插槽数(Sockets):1
- 核心数(Cores):4
- 点击“Next”
- 内存(MiB):2048
- 最小内存(MiB):2048
- 点击“Next”
- 桥接:vmbr0
- VLAN 标签:16
- 型号:Intel E1000(不要选“virtio”,无法工作)
- 点击“Next”
- 检查配置
- 点击“Finish”(完成)

虚拟机创建过程中请耐心等待。
6.2.1.3. 从 ISO 安装 Debian
启动虚拟机:
- 从列表中选择“301 (file1)”
- 选择“Console”(控制台)
- 点击“Start Now”(立即启动)

安装过程:
以下假设您将按 Enter 键执行所列步骤。若每一步都明确说明这一点会显得赘述。请使用方向键和 Tab 键来选择选项。
- Debian 安装程序:Debian 安装程序出现后,选择“Install”(安装)
- 选择语言:选择偏好的语言,例如 English(英语)
- 选择您所在地区:选择偏好的国家/地区,例如 Other(其他)> Europe(欧洲)> Netherlands(荷兰)
- 配置区域设置:选择系统区域,例如 United States(美国)
- 配置键盘:选择键盘布局,例如 American English(美式英语)
- 配置网络:安装程序会提示自动配置失败,这是正常的,因为未启用 DHCP(在 pfSense 中)。按 Enter 继续……默认选项为“Configure network manually”(手动配置网络),按 Enter 继续……IP 地址:10.10.16.101/24 网关:10.10.16.1 名称服务器地址(注意空格):10.10.16.201 10.10.16.1
- 主机名:主机名:file1
- 域名:域名:ad.lan.gigabitjes.nl
- 设置用户和密码:输入 root 密码:**************** 重新输入 root 密码:**************** 输入新用户的全名:Maintenance User 输入该账户的用户名:main 输入新用户的密码:**************** 重新输入相同密码[..] ****************
- 分区磁盘:分区方式:Guided - use entire disk(向导式 - 使用整块磁盘) 选择磁盘分区:SCSI[..] QEMU HARDDISK 分区方案:All files in one partition(所有文件放在一个分区)[..] 概览:Finish partitioning and write changes to disk(完成分区并将更改写入磁盘) 将更改写入磁盘?是(Yes)
- 配置软件包管理器:扫描额外安装介质?否(No) 选择镜像站点,例如“Netherlands”(荷兰) Debian 归档镜像:例如“deb.debian.org”或其他可用选项 HTTP 代理信息:直接按 Enter
- 配置 popularity-contest:是否参与软件包使用统计调查?否(No)
- 软件选择:取消勾选:Debian desktop environment(Debian 桌面环境) 取消勾选:GNOME 勾选:SSH server(SSH 服务器) 保留勾选:standard system utilities(标准系统工具)
- 配置 grub-pc:是否将 GRUB 引导加载程序安装到主驱动器?是(Yes) 引导加载程序安装设备:/dev/sda (scsi-QEMU [..])
- 完成安装:请选择
(继续)以重启,按 Enter

- 安装程序会提示自动配置失败,这是正常的,因为未启用 DHCP(在 pfSense 中)。按 Enter 继续……
- 默认选项为“Configure network manually”(手动配置网络),按 Enter 继续……
- IP 地址:10.10.16.101/24
- 网关:
- 10.10.16.1
- 名称服务器地址(注意空格):10.10.16.201 10.10.16.1

- 主机名:file1
- 域名:ad.lan.gigabitjes.nl
- 输入 root 密码:****************
- 重新输入 root 密码:****************
- 输入新用户的全名:Maintenance User
- 输入该账户的用户名:main
- 输入新用户的密码:****************
- 重新输入相同密码[..] ****************
- 分区方式:Guided - use entire disk(向导式 - 使用整块磁盘)
- 选择磁盘分区:SCSI[..] QEMU HARDDISK
- 分区方案:All files in one partition(所有文件放在一个分区)[..]
- 概览:Finish partitioning and write changes to disk(完成分区并将更改写入磁盘)
- 将更改写入磁盘?是(Yes)
- 扫描额外安装介质?否(No)
- 选择镜像站点,例如“Netherlands”(荷兰)
- Debian 归档镜像:例如“deb.debian.org”或其他可用选项
- HTTP 代理信息:直接按 Enter
- 是否参与软件包使用统计调查?否(No)
- 取消勾选:Debian desktop environment(Debian 桌面环境)
- 取消勾选:GNOME
- 勾选:SSH server(SSH 服务器)
- 保留勾选:standard system utilities(标准系统工具)

- 是否将 GRUB 引导加载程序安装到主驱动器?是(Yes)
- 引导加载程序安装设备:/dev/sda (scsi-QEMU [..])
- 请选择
(继续)以重启,按 Enter
虚拟机将重启。我们继续下一节。
6.2.2. 配置 Debian
我们将以普通用户和 root 两种身份执行命令。所有以“$”开头的命令在普通用户模式下执行,所有以“#”开头的命令以 root 身份执行。
6.2.2.1. 登录
使用 SSH 登录到文件服务器。在 Linux 终端中,您可以使用以下命令轻松连接:
$ ssh
[email protected]
或者,也可以使用 PuTTY,或通过 Proxmox 中的控制台登录。
出现提示时,请接受指纹(fingerprint)。
6.2.2.2. 将用户加入 sudoers 列表
我们将把用户 main 添加到 sudoers 列表。
首先安装 `sudo`:
- $ su -
- 输入 root 密码
- # apt update
- # apt install sudo
现在我们可以将用户添加到 sudo 组:
- # adduser main sudo
- # exit; exit
通过 `exit; exit` 命令我们将注销,这会同时结束 root 和 main 的 SSH 会话。
再次登录并测试 sudo 是否生效:
- $ ssh [email protected]
- $ sudo su
- 输入用户 main 的密码以提权
6.2.2.3. 验证并修正设置
检查主机名,包括带前缀和不带前缀两种情况:
# hostname && hostname -f
结果:
file1 file1.ad.lan.gigabitjes.nl
验证 IPv4 地址:
# ip a
结果:
[..] 2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether bc:24:11:10:15:34 brd ff:ff:ff:ff:ff:ff altname enp0s18 inet 10.10.16.101 /24 brd 10.10.16.255 scope global ens18 [..]
验证 DNS 解析:
# cat /etc/resolv.conf
结果:
search ad.lan.gigabitjes.nl nameserver 10.10.16.201 nameserver 10.10.16.1
注意:第一个名称服务器 IPv4 对应域控制器。第二个名称服务器 IPv4 对应运行在防火墙上的 DNS 解析器。
验证并修正 swappiness(交换倾向):
# cat /proc/sys/vm/swappiness
结果:
60
将其修改为合理的值:
# echo 10 > /proc/sys/vm/swappiness
# sysctl -p
# cat /proc/sys/vm/swappiness
结果:
10
将设置保存到文件:
# echo "vm.swappiness=10" >> /etc/sysctl.d/80-sysctl-swappiness.conf
注意:文件 80-sysctl-swappiness.conf 将在系统启动时生效。
6.2.2.4. NTP(网络时间协议)
时间管理至关重要。默认的 NTP 服务是 systemd-timesyncd。我们来为文件服务器快速配置 systemd-timesyncd。
- 尽管 systemd-timesyncd 已经安装,运行安装命令也无妨:apt -y install systemd-timesyncd
- 接下来编辑 timesyncd.conf:nano /etc/systemd/timesyncd.conf
- 取消 NTP 和 FallbackNTP 行的注释,并将 NTP 服务器设置为 10.10.16.1。
NTP=10.10.16.1
FallbackNTP=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
- 验证配置:
timedatectl show-timesync --al
- 启用并启动 systemd-timesyncd:
timedatectl set-ntp true
- 为稳妥起见,强制启用并重启 systemd-timesyncd:
systemctl enable systemd-timesyncd
systemctl restart systemd-timesyncd
- 检查状态:
systemctl startus systemd-timesyncd
- 以及同步状态:
timedatectl timesync-status
这确保了我们的文件服务器与网络时间保持良好的同步。
6.2.3. 安装并配置 Samba 文件服务器
您可能仍在以 root 身份运行命令。输入 `exit` 返回普通用户模式:
# exit
安装所需的软件包:
$ sudo apt update && sudo apt -y install acl samba winbind libnss-winbind krb5-user
配置 Kerberos:
$ sudo mv /etc/krb5.conf /etc/krb5.conf.bak
$ sudo nano /etc/krb5.conf
添加以下行并保存更改:
[libdefaults]
default_realm = AD.LAN.GIGABITJES.NL
dns_lookup_realm = false
dns_lookup_kdc = true
配置 NSS:
$ sudo nano /etc/nsswitch.conf
修改以下行并保存更改:
passwd: files winbind
group: files winbind
hosts: files dns wins
配置 Samba:
$ sudo mv /etc/samba/smb.conf /etc/samba/smb.conf.bak
$ sudo nano /etc/samba/smb.conf
添加以下行并保存更改:
# Global parameters [global] dedicated keytab file = /etc/krb5.keytab kerberos method = secrets and keytab realm = AD.LAN.GIGABITJES.NL security = ADS server role = member server winbind refresh tickets = Yes workgroup = AD idmap config * : backend = tdb idmap config * : range = 3000-7999 idmap config ad : backend = rid idmap config ad : range = 10000 - 999999 map acl inherit = Yes vfs objects = acl_xattr
检查 Kerberos(1):
$ sudo kinit administrator
结果(输出可能有所不同):
Password for [email protected] : Warning: Your password will expire in 32 days on Sun 18 Feb 2024 10:00:50 PM CET
检查 Kerberos(2):
$ sudo klist
结果(输出可能有所不同):
Ticket cache: FILE:/tmp/krb5cc_0 Default principal: [email protected] Valid starting Expires Service principal 01/17/2024 21:37:46 01/18/2024 07:37:46 krbtgt/ [email protected] renew until 01/18/2024 21:37:42
验证 Samba 配置
$ sudo testparm
结果:
Load smb config files from /etc/samba/smb.conf Loaded services file OK. Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback)
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
# Global parameters [global] dedicated keytab file = /etc/krb5.keytab kerberos method = secrets and keytab realm = AD.LAN.GIGABITJES.NL security = ADS winbind refresh tickets = Yes workgroup = AD idmap config * : range = 3000-7999 idmap config ad : backend = rid idmap config ad : range = 10000 - 999999 idmap config * : backend = tdb map acl inherit = Yes vfs objects = acl_xattr
加入域
$ sudo /usr/bin/samba-tool domain join ad.lan.gigabitjes.nl MEMBER -U administrator
结果(输出可能有所不同):
Password for [AD\administrator]: Joined domain ad.lan.gigabitjes.nl (S-1-5-21-1971466082-2551851020-532596661)
重启服务,并确保这些服务在系统启动时自动启动:
$ sudo systemctl restart smbd nmbd winbind
$ sudo systemctl enable smbd nmbd winbind
结果:
Synchronizing state of smbd.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable smbd
Synchronizing state of nmbd.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable nmbd
Synchronizing state of winbind.service with SysV service script with /lib/systemd/systemd-sysv-install. Executing: /lib/systemd/systemd-sysv-install enable winbind
我们很高兴地宣布,文件服务器已成功加入域。
6.2.4. 设置共享
现在来设置文件共享。
首先准备一个文件夹:
$ sudo mkdir -p /srv/samba/data
$ sudo chmod -R 775
/srv/samba/data
$ sudo chown -R "AD\administrator":root /srv/samba/data
后一条命令只有在配置正确时才会生效。用户 administrator 是域成员。
编辑 smb.conf 文件以添加共享:
$ sudo nano /etc/samba/smb.conf
在文件末尾添加以下内容并保存更改:
[Data] acl_xattr:ignore system acl = Yes acl allow execute always = Yes acl group control = Yes inherit acls = Yes inherit owner = windows and unix inherit permissions = Yes path = /srv/samba/data read only = No
启用基于访问权限的共享枚举(access-based share enumeration)是一个好习惯,这样可以防止没有读或写权限的用户看到文件和文件夹。
将以下行添加到 [global] 设置中。添加到该小节末尾即可:
access based share enum = yes
现在测试更改:
sudo testparm
结果:
Load smb config files from /etc/samba/smb.conf Loaded services file OK. Weak crypto is allowed by GnuTLS (e.g. NTLM as a compatibility fallback)
Server role: ROLE_DOMAIN_MEMBER
Press enter to see a dump of your service definitions
# Global parameters [global] dedicated keytab file = /etc/krb5.keytab kerberos method = secrets and keytab realm = AD.LAN.GIGABITJES.NL security = ADS server role = member server winbind refresh tickets = Yes workgroup = AD idmap config ad : range = 10000 - 999999 idmap config ad : backend = rid idmap config * : range = 3000-7999 idmap config * : backend = tdb access based share enum = Yes map acl inherit = Yes vfs objects = acl_xattr [Data] acl allow execute always = Yes acl group control = Yes inherit acls = Yes inherit owner = windows and unix inherit permissions = Yes path = /srv/samba/data read only = No acl_xattr:ignore system acl = Yes
重启服务
$ sudo systemctl restart smbd nmbd winbind
接下来的步骤需要以管理员身份登录到已加入域的 Windows 计算机。在这一步中,我们将创建文件夹,并加入域组或域用户以方便访问。有关此过程的详细介绍将在后续章节展开。
7. 管理用户与计算机
在我们的网络中,用户和计算机都扮演着不可或缺的角色。
7.1. 管理用 Windows 虚拟机
首先,我们需要引入一台专门用于管理目的的 Windows 计算机。这台机器将专门用于执行管理任务。
作为该部署的一部分,我们将创建一台运行 Windows 11 Pro 的虚拟机。此外,您也可以灵活地将一台 Windows 计算机直接连接到交换机作为替代方案。
7.1.1. 获取安装介质
获取 Windows Pro 的安装介质非常简单。可从 https://www.microsoft.com/software-download/windows11 获取该介质。访问该网站,向下滚动并选择下载选项,具体选择“Windows 11(适用于 x64 设备的多版本 ISO)”,然后点击“Download Now”(立即下载)。接着选择您偏好的语言并点击“Confirm”(确认)。
不要直接点击“64-bit download”(64 位下载)按钮开始下载;而应采用其他方式,右键点击并选择“Copy link address”(复制链接地址)。
现在,在 Proxmox 中指定存储并进入“ISO images”(ISO 镜像)。选择“Download from URL”(从 URL 下载),将复制的 URL 粘贴到“URL”字段中,然后点击“Query URL”(查询 URL)。最后点击“Download”(下载)开始下载。
7.1.2. VirtIO 驱动
我们将使用需要驱动的虚拟设备。右键点击以下链接并选择“Download from URL”(从 URL 下载):https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
现在,在 Proxmox 中指定存储并进入“ISO images”(ISO 镜像)。选择“Download from URL”(从 URL 下载),将复制的 URL 粘贴到“URL”字段中,然后点击“Query URL”(查询 URL)。最后点击“Download”(下载)开始下载。
7.1.3. 创建虚拟机
现在在 Proxmox 中创建 Windows 虚拟机:
- 点击“Create VM”(创建虚拟机)
- 常规(General):虚拟机 ID:901 名称:wadm1 下一步(Next)
- 操作系统(OS):ISO 镜像:Win11_23H2_English_x64v2.iso 类型:Microsoft Windows 版本:11/2022 勾选“Add additional drive for VirtIO drivers”(为 VirtIO 驱动添加额外驱动器) ISO 镜像:virtio-win.iso 下一步
- 系统(System) 显卡:若想使用 Virtual Machine Viewer 则选择“SPICE”,若只想使用 Proxmox 默认控制台则选择“Default”。机型:q35 BIOS:OVMF (UEFI) EFI 存储:storage SCSI 控制器:VirtIO SCSI 勾选“Qemu Agent” TPM 存储:storage 下一步
- 磁盘(Disks) 存储:storage 磁盘大小(GiB):例如“200” 缓存:Write back(回写) 下一步
- CPU 插槽数(Sockets):例如“1” 核心数(Cores):例如“4” 下一步
- 内存(Memory) 内存(GiB):例如 8192 下一步
- 网络(Network) 桥接:vmbr0 VLAN 标签:我们不填写标签,因为希望该虚拟机运行在管理 VLAN 中 型号:VirtIO(半虚拟化) 下一步
- 确认(Confirm):检查设置并点击“Finish”(完成) 等待虚拟机创建完成
- 虚拟机 ID:901
- 名称:wadm1
- 下一步(Next)
- ISO 镜像:Win11_23H2_English_x64v2.iso
- 类型:Microsoft Windows
- 版本:11/2022
- 勾选“Add additional drive for VirtIO drivers”(为 VirtIO 驱动添加额外驱动器)
- ISO 镜像:virtio-win.iso
- 下一步
- 显卡:若想使用 Virtual Machine Viewer 则选择“SPICE”,若只想使用 Proxmox 默认控制台则选择“Default”。
- 机型:q35
- BIOS:OVMF (UEFI)
- EFI 存储:storage
- SCSI 控制器:VirtIO SCSI
- 勾选“Qemu Agent”
- TPM 存储:storage
- 下一步
- 若想使用 Virtual Machine Viewer,请选择“SPICE”。
- 若只想使用 Proxmox 默认控制台,请选择“Default”。
- 存储:storage
- 磁盘大小(GiB):例如“200”
- 缓存:Write back(回写)
- 下一步
- 插槽数(Sockets):例如“1”
- 核心数(Cores):例如“4”
- 下一步
- 内存(GiB):例如 8192
- 下一步
- 桥接:vmbr0
- VLAN 标签:我们不填写标签,因为希望该虚拟机运行在管理 VLAN 中
- 型号:VirtIO(半虚拟化)
- 下一步
- 检查设置并点击“Finish”(完成)
- 等待虚拟机创建完成
7.1.4. 安装 Windows 11 Pro
点击“Start Now”(立即启动)以启动虚拟机。迅速点击控制台屏幕,并在提示从 CD/DVD 启动时按下任意键。
如果显卡选择了“SPICE”,鼠标光标可能会失焦。为此,请点击屏幕右上角“>_ Console”旁边的小下拉箭头,然后点击“Spice”,接着在 Virtual Machine Viewer 中打开该文件。
请注意:按“ALT”+“CTRL”+“R”可将鼠标光标从 Virtual Machine Manager 中释放。
接下来按常规流程进行 Windows 安装。加载 VirtIO SCSI 控制器的存储驱动。
- 输入语言及其他偏好设置,点击“Next”(下一步)继续。
- 点击“Install now”(立即安装)。
- 当要求输入产品密钥时,点击“I don't have a product key”(我没有产品密钥)。
- 选择“Windows 11 Pro”,点击 Next。
- 接受许可协议并点击“Next”。
- 点击“Custom: Install Windows only (advanced)”(自定义:仅安装 Windows(高级))。
- 点击“Load driver”(加载驱动)以加载存储驱动,然后点击“OK”(确定)。选择“Red Hat VirtIO SCSI pass-through controller(D:\amd64\w11\vioscsi.info)”,点击“Next”。
- 点击 Next 以分配空间。
- Windows 将进行安装,完成后会自动重启。


Windows 将启动开箱体验(Out of Box Experience):
- 按“Shift”+“F10”打开命令提示符。注意:该组合键在 Proxmox 的 Web 控制台(noVNC)和 Virtual Machine Viewer 中均可使用。或者按“Win 键”+“R”,通过运行对话框运行“CMD”。
- 输入以下命令并按 Enter:oobe\BypassNRO.cmd Windows 将重启并继续开箱体验。这样可以无需联网即可设置 Windows。
- 选择国家或地区,点击“Yes”(是)。
- 选择键盘布局,点击“Yes”。
- 点击“Add layout”(添加布局)以添加第二种键盘布局,默认选项是“Skip”(跳过)。
- 点击“I don't have internet”(我没有 Internet)。
- 点击“Continue with limited setup”(使用有限设置继续)。
- 当被问及谁将使用此设备时,输入一个名称,例如“LocalAdmin”。
- 点击 Next。
- 输入密码并点击“Next”;或者点击“Next”,稍后再设置密码。
- 回答相关问题(是/否;接受,等等)。
Windows 将继续进行并提示进度。最终结果应与下方截图类似。

现在,通过从 virtio-win 光盘启动“virtio-win-guest-tools”来安装 VirtIO 驱动:
- 同意许可条款并点击“Install”(安装)。
- 点击“Yes”(是)
- 点击“Next”(下一步)
- 接受协议并点击“Next”
- 按照屏幕提示操作(基本就是不断点击下一步……)
最终结果是一个运行完美的 Windows 11 Pro 安装。
安装 VirtIO 驱动后,屏幕分辨率应有所改善,并且网络连接应当可用。
通过查看屏幕右下角的网络图标来验证网络连接。或者,打开命令提示符,使用“ipconfig /all”命令查询 IP 配置。
C:\>ipconfig /all
Windows IP Configuration
Host Name . . . . . . . . . . . . : DESKTOP-J6P9KU3
Primary Dns Suffix . . . . . . . :
Node Type . . . . . . . . . . . . : Hybrid
IP Routing Enabled. . . . . . . . : No
WINS Proxy Enabled. . . . . . . . : No
DNS Suffix Search List. . . . . . : lan.gigabitjes.nl
Ethernet adapter Ethernet:
Connection-specific DNS Suffix . : ad.lan.gigabitjes.nl
Description . . . . . . . . . . . : Red Hat VirtIO Ethernet Adapter
Physical Address. . . . . . . . . : BC-24-11-3F-BA-6F
DHCP Enabled. . . . . . . . . . . : Yes
Autoconfiguration Enabled . . . . : Yes
Link-local IPv6 Address . . . . . : fe80::3846:3c84:5c40:3d1a%20(Preferred)
IPv4 Address. . . . . . . . . . . : 172.21.1.204(Preferred)
Subnet Mask . . . . . . . . . . . : 255.255.255.0
Lease Obtained. . . . . . . . . . : Thursday, 18 January 2024 09:05:25
Lease Expires . . . . . . . . . . : Thursday, 18 January 2024 11:05:25
Default Gateway . . . . . . . . . : fe80::20d:b9ff:fe48:3c89%20
172.21.1.1
DHCP Server . . . . . . . . . . . : 172.21.1.1
DHCPv6 IAID . . . . . . . . . . . : 347874321
DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2D-3A-94-1D-BC-24-11-3F-BA-6F
DNS Servers . . . . . . . . . . . : 172.21.1.1
NetBIOS over Tcpip. . . . . . . . : Enabled
Connection-specific DNS Suffix Search List :
lan.gigabitjes.nl
7.1.5. 远程服务器管理工具(RSAT)
为了管理用户和计算机并为我们的域设置组策略,我们将使用 PowerShell 添加 Windows 功能(Capabilities)。
以管理员身份启动 PowerShell 并查找所需工具:
Get-WindowsCapability -Name RSAT* -Online | Select-Object -Property DisplayName, Name, State
安装这两个工具:
Add-WindowsCapability -Online -Name "Rsat.ActiveDirectory.DS-LDS.Tools~~~~0.0.1.0"
Add-WindowsCapability -Online -Name "Rsat.GroupPolicy.Management.Tools~~~~0.0.1.0
"
现在,将 Windows 虚拟机加入 AD(Active Directory)。
7.1.6. 加入域
确保存在一个本地管理员账户是谨慎的做法,尤其是在工作站与域之间的信任关系发生故障时。请为 LocalAdmin 用户账户设置密码。
7.1.6.1. 本地管理员账户
在虚拟机内按“CTRL”+“ALT”+“DELETE”。这可以通过 noVNC 中的屏幕按钮或 Virtual Machine Viewer 中的按钮菜单来实现。



接下来,点击“Change a password”(更改密码)。

如果尚未设置密码,直接跳过“Old password”(旧密码)。输入并确认新密码。
7.1.6.2. 将计算机加入域
按
sysdm.cpl
在“Computer Name”(计算机名)选项卡中点击“Change...”(更改……)。

输入期望的计算机名(例如 WS01)。选中“Domain”(域)单选按钮并输入域名。最后点击“OK”(确定)。

输入域管理员用户名和密码(默认用户名为“Administrator”,密码为域部署时设置的密码)。

按照屏幕提示操作。


点击“Close”(关闭)和“Restart Now”(立即重启)。

计算机重启后,点击屏幕左下角的“Other user”(其他用户)。使用域管理员账户和密码登录。

使用用户名“Administrator”登录时需要注意:在用户名前加上域的 NetBIOS 名称,以反斜杠分隔(例如“AD\Administrator”)。或者,输入用户名后接域的 FQDN,以 @ 符号分隔(例如“ [email protected] ”)。

7.1.7. 使用远程服务器管理工具(RSAT)
可以通过“Windows Tools”或“Server Manager”(服务器管理器)访问以下工具,它们都位于开始菜单中,方便快捷。
7.1.7.1. 概述
我们的重点集中在以下工具上:
- Active Directory 用户和计算机 dsa.msc
- ADSI 编辑 adsiedit.msc
- 组策略管理 gpmsc.msc

将这些工具固定到开始菜单或任务栏,或者直接拖到桌面上。
7.1.7.2. Active Directory 用户和计算机(ADUC)
“Active Directory 用户和计算机”是 Windows 操作系统中的一款管理工具,允许管理员在 Active Directory 环境中执行与用户账户、组和计算机对象相关的任务。它提供了用于管理和组织这些目录对象的图形界面,使管理员能够创建、修改和删除用户账户,重置密码,管理组成员身份,以及在组织单位(OU)内组织计算机对象。该工具对于维护 Active Directory 域的结构与安全至关重要。
使用“Active Directory 用户和计算机”时,请通过“View”(视图)>“Advanced Features”(高级功能)确保已启用“高级功能”。注意存在一个可能导致该工具初始崩溃的 Bug。请关闭并重新打开“Active Directory 用户和计算机”,然后再次启用“高级功能”。

虽然提前创建计算机账户是可选的(因为计算机账户会在加入域时自动创建),但用户账户可以通过右键菜单轻松生成。右键点击“Users”(用户),选择“New”(新建)>“User”(用户)。

为了便于组织管理,建议创建新的组织单位(OU)。例如,在我的家庭办公室中,我可能会建立一个名为“Nova”的 OU,并在其中嵌套用于用户、组和计算机的子 OU。

随后,将“WS01”移动到“Nova”下新建的“Computers”(计算机)OU 中,并将 Samba 文件服务器“FILE1”移动到“Servers”(服务器)OU 中。

一个有效的做法是在“Groups”(组)OU 中创建访问组。例如,建立“GRP_FSS_Public”以授予对文件服务器上公共文件夹的访问权限。
重要提示:切勿将域控制器移动到其他组织单位(OU)!务必将其保留在默认的“Domain Controllers”(域控制器)OU 中。Microsoft 强烈不建议将域控制器移出该标准 OU,因为这样做可能会影响正常运行,且不被推荐。

下一步是创建用户账户并组织组成员身份。


7.1.7.3. ADSI 编辑
ADSI 编辑是一款强大的工具,专为需要对 Active Directory 进行底层修改的高级用户和管理员而设计。由于它可能对系统造成影响,应当谨慎使用,并且只有深刻理解 Active Directory 结构与运行原理的人员才应进行修改。
如果您遇到重命名后的计算机显示名称在“Active Directory 用户和计算机”(ADUC)中未更新的情况,可以使用 ADSI 编辑来修正。
7.1.7.4. 组策略管理
“Group Policy Management”(组策略管理)是 Windows 的一款管理工具,用于在 Active Directory 环境中配置和管理组策略设置。它允许管理员在基于 Windows 的计算机网络上定义并强制执行安全策略、系统设置和用户配置。借助组策略管理,管理员可以创建、编辑和组织组策略对象(GPO),即一组可应用于特定用户、组或计算机账户的策略。该工具可对 Windows 操作系统的各个方面进行集中控制,从而确保组织网络内设置的一致性与安全性。

建立“Starter GPOs”(入门 GPO)文件夹,并根据需要添加组策略对象(GPO)。建议为每个策略要素分别创建独立的 GPO,而不是将所有内容都集中到“Default Domain Policy”(默认域策略)下,这种方式有助于更好地组织和管理。
虽然可以直接在组织单位(OU)内创建组策略对象(GPO),但建议先将其创建在“Group Policy Objects”(组策略对象)容器中,然后再将该 GPO 链接到目标 OU,以便进行正确的配置与管理。
此外,建议为组策略对象(GPO)采用结构化的命名规范。清晰明确的命名规范可以让管理员仅凭名称就能轻松辨别 GPO 的用途和目标(计算机还是用户)。
对于通用的驱动器映射,可考虑使用一个名为“UserDriveMappings_General”的 GPO。

链接组策略对象(GPO)是一个简单的拖放操作。虽然这种方法有效,但随着列表变长会变得不够实用。在这种情况下,建议使用右键菜单来链接 GPO,选择“Link an existing GPO...”(链接现有 GPO……)选项,以实现更高效的管理。

8. 文件共享
在前面的步骤中,我们在文件服务器上建立了 DATA 共享,并通过策略将该共享映射到驱动器盘符 Q,以提升用户便利性。然而,我们引入了一项刻意的限制:目前禁止用户创建文件和文件夹。这一限制并非技术问题,而是一种设计选择。预期的做法是手动在共享中创建主文件夹,并为用户配置必要的访问权限。
在我们的管理工作站上,访问 \file1.ad.lan.gigabitjes.nl\data 并创建一个名为“General”的文件夹。随后,右键点击新文件夹并选择“Properties”(属性)。
现在,打开“Security”(安全)选项卡并点击“Advanced”(高级)。
首要任务是“Disabling inheritance”(禁用继承),将继承的权限转换为显式权限而不删除。
接下来,从权限列表中排除“Everyone”(所有人),并替换为“GRP_FSS_Public”。将权限应用于“此文件夹仅”(This folder only),我们选择以下特定基本权限:
- 读取和执行
- 列出文件夹内容
- 读取
- 写入
- 该配置禁止用户删除此文件夹。
随后,我们再次点击“Add”(添加),将权限仅应用于子文件夹和文件。我们选择“Full control”(完全控制)并应用设置。
为了验证调整效果,我们切换到之前创建的用户。该用户可以在“General”目录中创建文件和文件夹,但无法重命名、删除或移动该文件夹。不过,该用户对文件夹内的内容拥有完全控制权。
9. 连接工作站
在前面几节中,我们使用了一台直接连接到管理 VLAN 的工作站。在连接用户的工作站时,它将被导向办公 VLAN(32)。然而,由于缺乏基本的防火墙规则,目前无法从该网络连接到域控制器。除了这些内部服务外,我们还希望与邮件服务器和 Web 服务器建立直接连接。
现在,让我们建立防火墙规则,以便工作站能够顺利加入域,使用户可以无缝开始工作。
我们将利用 VLAN 概览,以及我们的服务器 IP 地址列表和需要在防火墙规则中包含的相应端口(涉及多台服务器)。
9.1. 概览
我们将利用 VLAN 概览,以及我们的服务器 IP 地址列表和需要在防火墙规则中包含的相应端口(涉及多台服务器)。
9.1.1. VLAN 概览
9.1.2. 服务器 IP 地址
9.1.3. 管理计算机
9.1.4. 端口
文件服务器将使用 TCP 端口 135、139、445 以及 UDP 端口 137、138。
为了提升打印效率,在提供打印服务时请务必开放 TCP 端口范围 49152:65535。这能确保打印任务顺畅、及时处理,避免可能出现的延迟(30–45 秒)。
在混合环境中,请勿通过 DNS 共享打印机,尤其是在使用非 Windows 的 DHCP 服务器时。应改用打印共享服务器的 IP 地址。
要访问邮件和 Web 服务,我们需要开放以下端口。
建议将端口整理为端口别名(port aliases),然后在 pfSense 中构建防火墙规则。
9.2. 防火墙规则
有关创建防火墙别名和规则的步骤,请参阅第 3.3.1 节。
打开 pfSense 的 Web 界面,导航至“Firewall”(防火墙)>“Aliases”(别名)>“Ports”(端口)。
添加端口别名,并按上述说明添加端口:
- Ports_DC_TCP(端口,域控制器,TCP)
- Ports_DC_UDP(端口,域控制器,UDP)
- Ports_FS_TCP(端口,文件服务器,TCP)
- Ports_FS_UDP(端口,文件服务器,UDP)
- Ports_ISPC_TCP(端口,ISPConfig,TCP)
注意:您可以直接将“Port_Ingress_GRE_TCP”复制到“Ports_ISPC_TCP”。
结果:

接下来,添加以下 IP 别名:
- IP_SDCs
- IP_FILE1
- IP_ISPC_LOCAL

最后,在接口 L1_0032_OFF1 上利用这些别名创建防火墙规则:
- 允许到域控制器的 TCP 流量
- 允许到域控制器的 UDP 流量
- 允许到文件服务器 #1 的 TCP 流量
- 允许到文件服务器 #1 的 UDP 流量
- 允许到 ISPConfig 服务器的 TCP 流量

请点击此处查看办公局域网所有规则的完整截图。
10. 总结
在本文收尾之际,可以明显看出我们的网络虽然可用,但仍显得有些基础。仍有充足的改进空间:从引入第二台域控制器、探索更多交换机型号,到在 OPNsense 中复制防火墙配置、集成邮箱、优化工作站配置,以及——不应忘记——扩展我们的 Active Directory 策略。
我欢迎您宝贵的反馈意见,并计划将其纳入本文的下一次修订中。请记住,我并非独自前行:HowtoForge 社区是一个协作空间,我们可以在此相互支持。欢迎分享您的想法、留下评论或在论坛中发起讨论。下次再见!祝好,Bouke