内网模拟企业网站:基础环境准备与虚拟机搭建

为了更好地模拟企业内网真实生产环境,我计划搭建一套高可用主从复制数据库集群,用于后续的内网渗透、数据库安全、以及高可用架构学习实践

本系列共计划包含以下文章(当前为基础环境搭建):

- 第一篇:基础环境准备与虚拟机搭建(本文)

- 第二篇:MySQL主从复制 + 高可用集群部署

本篇主要完成三台虚拟机的创建、基础系统配置等工作,真正的主从集群搭建将放在下一篇文章进行:点我前往 内网模拟企业网站:高可用主从复制集群搭建(系列一)

实验环境说明

虚拟化平台:

  • VMware® Workstation Pro 25H2

虚拟机规划:

  • 操作系统:CentOS 7(Minimal)
  • 数量:3台(1 Master + 2 Slave)
  • 网络模式:桥接

我的内网拓扑图如下(其实层还有防火墙的配置,这里我并没有标记出来而已):

阶段 1:系统环境准备

本阶段目标:

  • 三台机器设置正确主机名。
  • 三台机器通过 /etc/hosts 识别彼此。
  • 按你的实验要求关闭 SELinux。
  • 三台机器开放 3306/tcp
  • 三台机器使用 chrony 校准时间。
  • 最终通过主机名互相 ping 成功

1. 设置三台机器的主机名

1.1 在 Master 上执行

【10.210.10.10 - Master】

hostnamectl set-hostname db-master
hostnamectl

目的: 将主库服务器标识为 db-master,后续查看日志、配置复制和排查故障时不会混淆机器

预期关键输出:

Static hostname: db-master
1.2 在 Slave1 上执行

【10.210.10.15 - Slave1】

hostnamectl set-hostname db-slave1
hostnamectl

预期关键输出:

Static hostname: db-slave1

另一台的服务器也是如此,我这里就不进行演示了(就是把上面的内容改成db-slave2)

2. 配置三台机器的 /etc/hosts

修改目的

/etc/hosts 用于在没有内网 DNS 服务器的情况下,手动建立“主机名 → IP 地址”的对应关系

完成后:

  • db-master 会解析到 10.210.10.10
  • db-slave1 会解析到 10.210.10.15
  • db-slave2 会解析到 10.210.10.20

三台机器都必须写入完全相同的三条映射关系

2.1 在 Master 上执行

【10.210.10.10 - Master】

cp -a /etc/hosts /etc/hosts.bak.stage1

grep -qE '^10\.210\.10\.10[[:space:]]+db-master([[:space:]]|$)' /etc/hosts || echo '10.210.10.10 db-master' >> /etc/hosts
grep -qE '^10\.210\.10\.15[[:space:]]+db-slave1([[:space:]]|$)' /etc/hosts || echo '10.210.10.15 db-slave1' >> /etc/hosts
grep -qE '^10\.210\.10\.20[[:space:]]+db-slave2([[:space:]]|$)' /etc/hosts || echo '10.210.10.20 db-slave2' >> /etc/hosts

cat /etc/hosts
2.2 在 Slave1 上执行

【10.210.10.15 - Slave1】

cp -a /etc/hosts /etc/hosts.bak.stage1

grep -qE '^10\.210\.10\.10[[:space:]]+db-master([[:space:]]|$)' /etc/hosts || echo '10.210.10.10 db-master' >> /etc/hosts
grep -qE '^10\.210\.10\.15[[:space:]]+db-slave1([[:space:]]|$)' /etc/hosts || echo '10.210.10.15 db-slave1' >> /etc/hosts
grep -qE '^10\.210\.10\.20[[:space:]]+db-slave2([[:space:]]|$)' /etc/hosts || echo '10.210.10.20 db-slave2' >> /etc/hosts

cat /etc/hosts
2.3 在 Slave2 上执行

【10.210.10.20 - Slave2】

cp -a /etc/hosts /etc/hosts.bak.stage1

grep -qE '^10\.210\.10\.10[[:space:]]+db-master([[:space:]]|$)' /etc/hosts || echo '10.210.10.10 db-master' >> /etc/hosts
grep -qE '^10\.210\.10\.15[[:space:]]+db-slave1([[:space:]]|$)' /etc/hosts || echo '10.210.10.15 db-slave1' >> /etc/hosts
grep -qE '^10\.210\.10\.20[[:space:]]+db-slave2([[:space:]]|$)' /etc/hosts || echo '10.210.10.20 db-slave2' >> /etc/hosts

cat /etc/hosts
2.4 验证主机名解析

三台机器上分别执行下面命令

getent hosts db-master db-slave1 db-slave2

三台机器都应看到类似结果:

10.210.10.10 db-master
10.210.10.15 db-slave1
10.210.10.20 db-slave2

如果有显示ipv6相关信息,那么请输入以下命令,禁用ipv6

echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /etc/sysctl.conf
sysctl -p

3. 关闭 SELinux

修改目的

按你的实验要求,当前主从复制演示环境中将 SELinux 关闭,以避免后续 MariaDB 配置、网络监听或代理服务实验阶段受到额外安全策略影响

说明:在生产环境中,更规范的做法通常是保留 SELinux 并配置对应策略;本项目作为内网实验环境,按你的方案执行关闭

  • setenforce 0:让当前运行状态立即进入非强制模式
  • 修改 /etc/selinux/config:保证系统重启后仍保持关闭
3.1 在三台机器上分别执行
getenforce

if [ "$(getenforce)" = "Enforcing" ]; then
    setenforce 0
fi

cp -a /etc/selinux/config /etc/selinux/config.bak.stage1
sed -ri 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

getenforce
grep '^SELINUX=' /etc/selinux/config

当前系统尚未重启时,预期输出可能是:

Permissive
SELINUX=disabled

含义是:当前已经不拦截,重启后会彻底显示为 Disabled

4. 安装并配置 firewalld,开放 3306 端口

CentOS 7 官方镜像源已经在2024年停止维护,mirrorlist.centos.org 域名已经失效,需要切换到阿里云的归档镜像

sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-Base.repo
sed -i 's|#baseurl=http://mirror.centos.org|baseurl=https://mirrors.aliyun.com|g' /etc/yum.repos.d/CentOS-Base.repo
yum clean all
yum makecache
4.1 在三台机器安装 firewalld

依次在三台机器执行

yum install -y firewalld
4.2 启动 firewalld 并设置开机自启

依次在三台机器执行

systemctl enable --now firewalld
systemctl is-enabled firewalld
systemctl is-active firewalld
4.3 开放 MariaDB 的 3306/TCP 端口

依次在三台机器执行

firewall-cmd --permanent --add-port=3306/tcp
firewall-cmd --reload
firewall-cmd --query-port=3306/tcp
firewall-cmd --list-ports

预期每台机器都至少看到:

yes
3306/tcp

5. 安装并启动 chrony 时间同步服务

修改目的

主从复制依赖日志事件顺序和故障排查时间线。三台数据库服务器时间一致,能够避免日志时间混乱,也便于后续定位复制延迟

CentOS/RHEL 7 中,chrony 是标准的 NTP 时间同步实现,服务名称为 chronyd

这里暂时不修改 /etc/chrony.conf,先使用默认可用时间源完成同步;如果你的网络无法访问默认时间源,再根据实际结果调整配置

5.1 安装 chrony

依次在三台机器执行

yum install -y chrony
5.2 启动 chronyd 并设置开机自启

依次在三台机器执行

systemctl enable --now chronyd
systemctl is-enabled chronyd
systemctl is-active chronyd
chronyc makestep

三台机器的服务状态都应为:

enabled
active
5.3 验证时间同步状态

依次在三台机器执行

date -u
timedatectl
chronyc tracking
chronyc sources -v

重点观察:

System clock synchronized: yes
NTP enabled: yes

以及 chronyc tracking 中不要长期显示:

Leap status     : Not synchronised

chronyc sources -v 中通常会有一行时间源前面显示 ^*,表示当前选中的同步源

如果你和我一样,没有显示,那么请输入以下命令

三台都执行(这里我使用东京时区,也可以输入上海时区):

timedatectl set-timezone Asia/Tokyo
#或者
timedatectl set-timezone Asia/Shanghai

然后修复 NTP:

sed -i 's/^server /#server /g' /etc/chrony.conf
cat >> /etc/chrony.conf << 'EOF'
server ntp.aliyun.com iburst
server ntp1.aliyun.com iburst
server cn.pool.ntp.org iburst
EOF
systemctl restart chronyd

等30秒后验证:

chronyc sources -v
timedatectl

6. 重启三台机器,确认永久配置生效

由于你要求 SELinux 永久关闭,必须通过一次重启验证 /etc/selinux/config 的配置确实生效

建议按顺序逐台重启,确认能重新 SSH 登录后再重启下一台

先重启 Master,然后再依次重启Slave1,Slave2

命令如下:

reboot

重新 SSH 连接 Master 后执行:

hostname
getenforce
systemctl is-active firewalld
systemctl is-active chronyd
firewall-cmd --query-port=3306/tcp

预期结果:

db-master
Disabled
active
active
yes

所有机器重启完成之后,再进行最终的验证(如下图所示)

最终验证:三台机器互相通过主机名通信

【10.210.10.10 - Master】

ping -c 4 db-slave1
ping -c 4 db-slave2

【10.210.10.15 - Slave1】

ping -c 4 db-master
ping -c 4 db-slave2

【10.210.10.20 - Slave2】

ping -c 4 db-master
ping -c 4 db-slave1

每条 ping 命令都应看到通路即可

只有阶段 1 的验证全部通过后,我们再进入

阶段 2:配置 MariaDB 官方仓库并安装 MariaDB 10.5:点我前往

剩余内容正在更新中

Ciallo~(∠・ω< )⌒☆