装机这事,听起来简单,但真要在一台600GB磁盘的物理服务器上装CentOS 7.6,还得把Bond配好,中间坑其实不少。尤其是现在网上教程要么只讲装系统,要么只讲配置Bond,很少有把这两个动作放在一条链路里说清楚的。我最近刚好又给机房一台R系列服务器重装了系统,顺手把网卡Bond也一起做了,趁着记忆还热,把整个过程和踩过的坑完整记录一下。
先说下我这台机器的具体情况:双路CPU,内存64GB,磁盘就是一块600GB的SAS盘,板载四个千兆网口,需要做两两Bond。操作系统选择CentOS 7.6(1810版本),内核3.10.0-957,装的是最小化安装加一部分运维常用组件。
1. 为什么服务器要做Bond,以及600GB磁盘的分区思路
1.1 Bond到底解决了什么问题
单块网卡的带宽和链路稳定性始终是个瓶颈。千兆网卡理论速率125MB/s,但实际跑到110MB/s以上就很吃力了,一旦网线松动、交换机端口故障或者网卡本身老化,业务直接断掉。Bond的核心价值有两个:一是链路冗余,二是带宽叠加。
CentOS 7.6默认支持bonding内核模块,不需要额外安装驱动。我在生产环境里最常用的两种模式是mode 1(active-backup)和mode 4(802.3ad)。mode 1配置简单,不需要交换机配合,故障切换时间在100ms以内,适合绝大多数业务场景;mode 4需要交换机端口做LACP聚合,能实现多链路负载均衡,但对交换机的配置要求更高,小团队维护起来容易出问题。
所以这篇文章里我用的方案是mode 1加miimon=100参数,每100毫秒检测一次链路状态,两个物理网口绑成一个逻辑网口,主网卡挂了备网卡自动顶上。
1.2 600GB磁盘的分区规划
600GB说大不大说小不小,但跟现在动辄几TB的服务器比,它确实需要精打细算。我见过不少人拿到这种规格的机器就直接全部分给根分区,系统跑了一两年之后发现日志分区被撑爆,root分区满了导致服务起不来,这种事故完全可以提前避免。
首选重新装系统时都是手工分区,方案如下:
| 挂载点 | 分区类型 | 大小 | 格式 | 说明 |
|---|---|---|---|---|
| /boot | ext4 | 1024MB | ext4 | 引导分区不需要大,1GB足了 |
| / | ext4 | 100GB | ext4 | 系统根分区,/usr、/etc、/opt都在这 |
| /home | xfs | 150GB | xfs | 如果这台机器只跑业务,给50GB也行 |
| /var/log | ext4 | 150GB | ext4 | 日志分区必须单独拆出来 |
| /data | xfs | 剩余空间 | xfs | 业务数据分区,逻辑卷管理 |
swap这块单独说一下:很多人习惯划分一个和内存一样大的swap分区,但在64GB内存的物理机上,这个做法有点浪费磁盘空间。我的习惯是给16GB swap,配合vm.swappiness=10的内核参数,让系统优先使用物理内存,只有在内存压力较大的情况下才用到swap。
/boot分区用ext4是个比较保守的选择,因为grub对xfs的引导兼容性虽然在新版本中已经没有问题,但ext4在CentOS 7上毕竟是最成熟的方案。根分区给100GB,装完系统之后正常情况下连20GB都用不到,剩下的空间是给后续安装的软件和依赖留的缓冲。
2. 安装前的准备工作和最容易忽略的两个细节
2.1 镜像选择与启动盘制作
CentOS 7.6的官方镜像文件名是CentOS-7-x86_64-Minimal-1810.iso,也可以在阿里云镜像站或者清华镜像源下载。如果服务器没有外网,用DVD镜像更保险,里面包含了常用的软件包,不用装完系统再折腾yum源。
启动盘制作这里有一个很常见的坑:直接用UltraISO写入U盘,装到一半会报错找不到安装源。这跟U盘的文件系统格式有关系,UltraISO的USB-HDD+模式有时候在部分服务器主板上识别不友好。Windows下建议用Rufus,选择“DD镜像模式”写入;Linux环境下直接用dd命令:
dd if=CentOS-7-x86_64-Minimal-1810.iso of=/dev/sdb bs=4M status=progress这句话没有任何花样,但能避免后面装系统装到一半失败重来的尴尬。
2.2 BIOS和启动模式的决定
现在的服务器大多默认UEFI启动,但CentOS 7.6在UEFI模式下的安装流程跟传统BIOS模式有些区别,磁盘分区表要用GPT格式。由于我的服务器磁盘只有600GB,而且没有超过2TB的容量限制,采用传统的BIOS加MBR分区表方案,兼容性最好,后面如果要做系统克隆或者迁移到虚拟化平台,也少一层麻烦。
进服务器BIOS需要做的设置有几项:SATA Controller Mode设为RAID或AHCI,取决于你的磁盘控制器驱动;Boot Mode设为Legacy或UEFI,二者选其一,不要开成UEFI with CSM这种混合模式,容易导致安装引导混乱。
还有个细节是IPMI带外管理口一定要提前配置好,因为后面装完系统配置Bond的时候,如果网络配置有问题,还可以通过IPMI远程控制台去修复。我这次就是先配置好IPMI的固定IP,然后通过web管理界面挂载ISO镜像安装系统,省去了跑到机房插U盘的麻烦。
3. CentOS 7.6系统安装全流程
3.1 安装引导与语言选择
从安装介质启动后,会进入GRUB引导界面,选择“Install CentOS 7”回车。这里等的时间有点久,因为内核要加载各种硬件驱动。如果你的服务器用的是比较新的阵列卡或者NVMe磁盘,可能还需要在引导参数里加nomodeset或者inst.dd加载驱动,不过我这台机器用的是LSI的SAS控制器,CentOS 7.6内核自带了驱动,直接就能识别出600GB的磁盘。
语言选择界面选English,不要选中文。这对我来说是一条铁律:系统语言用英文,日志里的错误信息全是英文的,如果用中文系统,grep关键字定位问题的时候会非常别扭。时区可以后面再设置。
3.2 手工分区步骤
进入安装主界面后,点击INSTALLATION DESTINATION,选择磁盘,然后务必选中“I will configure partitioning”单选按钮,手工分区。自动分区在这个场景下有两个问题:一是自动方案会把整个600GB都分给根分区,这不符合我们前面的规划;二是自动分区默认会创建LVM逻辑卷,对于这台机器来说没必要增加复杂度。
手工分区的操作步骤:
- 点击左下角的+号,创建
/boot,大小1024MB,文件系统类型ext4 - 再次点击+号,创建
/,大小100GB,文件系统类型ext4 - 创建
/home,大小150GB,文件系统类型xfs - 创建
/var/log,大小150GB,文件系统类型ext4 - 创建
swap,大小16384MB,文件系统类型swap - 点击+号,挂载点填
/data,大小不填,留空代表使用剩余全部空间,文件系统类型xfs
然后点击“Done”两次,接受分区方案变更。
有个注意事项:如果磁盘之前安装过其他系统,分区界面的“Unknown”或者已有分区要先删除掉再创建。操作方法很简单,选中已有分区,点左边框中间的减号,全部删干净以后重新加。
3.3 KDUMP、网络和软件包选择的细节
安装界面的KDUMP选项卡,默认是Enabled,但对于生产环境服务器,我建议关掉。原因是kdump本身会预留一部分内存(默认会保留系统内存的一部分给crash kernel),我在64GB内存的机器上安装时会顺带把它关掉,因为一旦内核崩溃,业务可能已经受损,重启往往是最快恢复手段。
NETWORK & HOSTNAME进来以后,先设置主机名,比如node01.example.local。这时先不要急着打开网卡连接,因为我们要等系统装完再手动配置Bond,如果在这里开启了DHCP自动获取IP,后面配置Bond时还得先停掉NetworkManager的接管,多绕一圈。
软件包选择上,最小化安装是首选。如果这台服务器后面要装MySQL或者编译软件,建议勾选“Development Tools”组,里面有gcc、make、git这些基础工具,省得后面联网安装。
完成以上设置之后,点击Begin Installation,等待进度条走完,设置root密码,然后重启。
3.4 首次启动后的基础环境调整
系统重启后,第一件事是进入root账户,配置网络。这个时候网卡还没有IP,需要先临时配置一个地址,方便通过SSH远程操作。直接修改/etc/sysconfig/network-scripts/ifcfg-eno1:
TYPE=Ethernet BOOTPROTO=static NAME=eno1 DEVICE=eno1 ONBOOT=yes IPADDR=192.168.10.11 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=114.114.114.114 DNS2=8.8.8.8然后重启网络服务:
systemctl restart network先用这个临时IP把基础环境配好,装完必要的工具以后,再来做Bond配置。
接下来配置yum源。CentOS官方源在2024年6月30日之后已经归档,直接用mirror.centos.org肯定不行,需要把yum源切换到Vault源或者国内的阿里云源。当然CentOS 7.6这种老版本也需要先把base源调整到vault对应的目录。我的做法是:
cd /etc/yum.repos.d/ mkdir /etc/yum.repos.d/backup mv *.repo /etc/yum.repos.d/backup/ curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo sed -i 's/mirror.aliyun.com/mirrors.aliyun.com/g' /etc/yum.repos.d/CentOS-Base.repo yum clean all && yum makecache同时建议把EPEL源也装上:
yum install -y epel-release装完之后顺手把这些基础包装上:
yum install -y vim net-tools wget lsof tcpdump bind-utils telnet这些是排查网络问题的基本工具,没有它们,Bond配完了你都没法验证效果。
4. Bond配置的两种路径:安装时配置与系统内配置
4.1 安装界面的网卡绑定:不是不能用,但问题很多
在CentOS安装过程中,网络配置页面其实提供了一个“Add Bond”按钮,可以在系统安装阶段就把Bond建好。具体操作是选择两块物理网卡,点配置右下角的“添加”,选Bond类型,填一个bond0名称,设置IP地址和bonding模式,然后回到物理网卡界面,把两块网卡设为bond0的从属设备。
但是这个方案有几个隐患:安装器生成的ifcfg-bond0文件非常简单,很多参数没有覆盖;NetworkManager在安装阶段接管了网络配置,生成的配置文件是NM的keyfile格式,跟传统的ifcfg格式混在一起,后面排查问题容易踩雷。另外一个问题是安装器强制要求Bond模式下必须有IP配置,没法先建Bond后加地址。
所以我强烈建议在安装阶段跳过网卡配置,装完之后采用传统ifcfg文件方式手工配置Bond。对于生产环境,明确可控、配置可审计比所谓的“省事”重要得多。
4.2 关闭NetworkManager,回归network.service
这可能是整个Bond配置过程中最关键也最容易被忽略的一步。
CentOS 7中NetworkManager默认是开启的,它在后台监听并管理所有的网络接口。问题是NM自己在处理Bond时有一套独立的配置方式,通过nmcli命令可以创建bond连接,但生成的配置会写到/etc/sysconfig/network-scripts/下面,以ifcfg-bond0的文件形式存在,同时NM会把物理网卡的连接也接管,导致我们手工编写的ifcfg-eno1和ifcfg-eno2失效,甚至出现重启之后bond接口幽灵存在或者网卡名变成eno16777736这种奇怪现象。
与其跟NM的配置逻辑较劲,不如彻底关闭它,回到CentOS 6时代用network.service管理的模式。关闭方法。
systemctl stop NetworkManager systemctl disable NetworkManager systemctl enable network systemctl start network不要担心这样会导致“系统不先进”,在服务器这个场景下,稳定可控压倒一切。我见过太多人卡在Bond配置半天出不来结果,最后发现是NM在作祟。直接用network.service管理,所有的配置就是纯文本的ifcfg文件,出问题一目了然。
4.3 Bond配置文件详解
首先创建Bond主接口文件/etc/sysconfig/network-scripts/ifcfg-bond0:
DEVICE=bond0 NAME=bond0 TYPE=Bond BONDING_MASTER=yes ONBOOT=yes BOOTPROTO=static IPADDR=192.168.10.11 NETMASK=255.255.255.0 GATEWAY=192.168.10.1 DNS1=114.114.114.114 DNS2=8.8.8.8 BONDING_OPTS="mode=1 miimon=100"这里的BONDING_MASTER=yes是CentOS 7.6中必须有的参数,它告诉系统这个接口是bonding主接口,没有这行,ifcfg-bond0可能不会被正确识别为bond接口,而是被当成普通网卡,启动时直接报错。
BONDING_OPTS这一行是整个Bond的核心。mode=1对应active-backup模式,miimon=100表示每100毫秒通过MII方式检测一次网卡物理链路状态。这个参数值设置在50到200之间都可以,100是一个比较中庸的选择,既能快速感知断线,又不会因为检测过于频繁导致CPU占用上升。
然后是两块物理网卡的配置。以eno1为例,/etc/sysconfig/network-scripts/ifcfg-eno1:
DEVICE=eno1 NAME=eno1 TYPE=Ethernet BOOTPROTO=none ONBOOT=yes MASTER=bond0 SLAVE=yes同样的方式配置ifcfg-eno2。这里特别注意:物理网卡上不要配置任何IP地址信息,BOOTPROTO=none,IP地址只存在于bond0主接口上。如果你不小心在物理网卡上也填了IP,会造成同一网段内IP冲突,网络时通时断。
配置完三个文件之后,重启网络服务。
systemctl restart network不要用ifup bond0来启停,因为物理网卡和bond接口有绑定关系,单独启停某个接口会导致状态不完整。正确的做法是systemctl restart network一次性全部应用。
4.4 验证Bond是否生效
重启网络服务之后,用以下几个命令确认Bond状态(先看状态再验证连通性):
cat /proc/net/bonding/bond0这个文件会显示当前Bond的详细信息,包括bonding模式、MII Polling间隔、当前激活的从属网卡。重点看Currently Active Slave这一行,它显示当前是哪块网卡在负责收发数据:
Ethernet Channel Bonding Driver: v3.7.1 (April 27, 2011) Bonding Mode: fault-tolerance (active-backup) Primary Slave: None Currently Active Slave: eno1 MII Status: up MII Polling Interval (ms): 100 Up Delay (ms): 0 Down Delay (ms): 0 Slave Interface: eno1 MII Status: up Speed: 1000 Mbps Duplex: full Slave Interface: eno2 MII Status: up Speed: 1000 Mbps Duplex: full看到MII Status: up说明链路物理状态正常,Currently Active Slave: eno1表示eno1是主用接口。
接着用ip link show master bond0确认两个从属接口是否都挂在bond0下:
ip link show master bond0输出应该包含eno1和eno2两个接口。
最后ping网关和外部DNS,确认网络连通性:
ping -c 4 192.168.10.1 ping -c 4 114.114.114.1144.5 故障切换实测
配置完Bond,一定不要跳过故障演练这一步。我见过太多人配置完就扔在那,半年之后链路真的出了问题才发现Bond根本没生效或者切换失败。
故障演练方法很简单:把当前active的物理网卡down掉(我这里active的是eno1):
ip link set dev eno1 down然后立刻查看/proc/net/bonding/bond0,正常情况下几秒钟内Currently Active Slave应该自动变为eno2。再从外部机器ping一下这台服务器,看是否有丢包:
ping -c 10 192.168.10.11如果一切正常,Bond切换过程几乎不丢包,最多丢1到2个包。然后把eno1重新启用:
ip link set dev eno1 upbalancing的规则是通过arp_ip_target或者primary参数决定主备切换策略的,mode 1下默认是"any slave can become active",也就说eno1恢复之后,不会自动切换回eno1,除非你设置了primary=eno1参数。
如果希望eno1始终是主用口,恢复后自动切回,需要在ifcfg-bond0的BONDING_OPTS中加上primary=eno1:
BONDING_OPTS="mode=1 miimon=100 primary=eno1"这个参数在网卡故障恢复时非常实用,毕竟我们希望主用链路尽量稳定在主网卡上。
5. 生产环境Bond配置必须补完的细节
5.1 防止多网卡环境下的路由混乱
如果服务器上除了bond0还有其他非绑定网卡,比如用于带外管理的网卡或者连接存储网络的网卡,要在/etc/iproute2/rt_tables中配置策略路由,否则流量可能从错误接口发出。
我的原则是:服务器上除了bond0之外,其他网卡一律不配置IP地址,除非有明确的用途。这样路由表天然干净,不存在多出口导致的路由混乱问题。如果确实有多个IP需要配置,建议给每块网卡配置METRIC权重,低数值优先。
5.2 Bond与MTU的配合问题
普通千兆网口的MTU默认是1500,如果你的内网环境启用了Jumbo Frame(巨型帧),比如交换机上配置了MTU 9000,那么bond0接口和物理网卡的MTU都要设置成一致:
MTU=9000在ifcfg-bond0和ifcfg-eno1/eno2中都要加这一行。大坑是有时候你只在bond0上配了MTU,物理网卡没配,结果iperf测试带宽时吞吐率反而下降,这个问题在排查时不太容易发现。
检查各接口MTU是否一致:
ip link show5.3 写入网络参数调优
CentOS 7.6的默认内核参数对网络性能的调优并不激进,在跑高流量业务之前,建议在/etc/sysctl.conf中追加以下参数:
net.core.somaxconn = 65535 net.core.rmem_default = 262144 net.core.wmem_default = 262144 net.core.rmem_max = 16777216 net.core.wmem_max = 16777216 net.ipv4.tcp_rmem = 4096 87380 16777216 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 30 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.ip_local_port_range = 1024 65535 net.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.bond0.rp_filter = 0rp_filter需要重点说明一下:在Bond的active-backup模式下,反向路径过滤如果保持默认的严格模式(值为1),从备用网卡进来的流量可能会被内核丢弃,导致切换后不通。这个问题在mode 1下尤其隐蔽,因为切换前测试一切正常,真正切换的时候才暴露,让人误以为是Bond切换脚本的问题。
调整完参数记得:
sysctl -p5.4 开机自启动与异常断电的恢复
ifcfg-bond0中已经写了ONBOOT=yes,理论上重启后Bond会自动拉起。但CentOS 7.6有个常见的启动顺序问题:network服务启动时,如果物理网卡链路还没来得及协商完成,bond0的建连可能会失败。
为了避免这个情况,在ifcfg-eno1和ifcfg-eno2中加上:
LINK_DELAY=0但更稳妥的办法是设置bonding的内核模块参数。创建/etc/modprobe.d/bonding.conf:
alias bond0 bonding options bonding mode=1 miimon=100 max_bonds=1这样即使ifcfg文件里的BONDING_OPTS没有被正确解析,内核层面的bonding也会以正确的模式和参数加载,相当于多了一层保护。
6. Bond配置排错:最常踩的四个坑以及排查链路
6.1 重启后bond0没起来,物理网卡没地址
这个故障的排查链路相对明确。重启之后SSH连不上,只能通过IPMI或者其他带外方式进去。
登进系统后先看status:
ip link show systemctl status network重点查几个地方:
第一,/etc/sysconfig/network-scripts/ifcfg-bond0有没有BONDING_MASTER=yes。前面说过,没有这行的后果是systemd-networkd不会把bond0识别为bonding master接口,启动时直接跳过。
第二,物理网卡配置文件里MASTER=bond0和SLAVE=yes是否都在。漏了SLAVE=yes,网卡不会把自己挂到bond0下面。
第三,看NetworkManager是不是又起来了。如果你执行了systemctl disable NetworkManager但用的是enable命令而不是mask,某些依赖NM的服务(例如NetworkManager-wait-online.service)会在启动时把它拉起来:
systemctl mask NetworkManagermask比disable更彻底,它会把服务链接到一个/dev/null设备,任何依赖它的服务都无法启动它。建议在配置Bond时直接mask。
6.2 Bond起来了但ping不通外网
Bond接口状态是UP,链路也是up,但ping网关不通。这时分几步排查:
先在服务器上ping网关IP,通了的话说明二层没问题,接着ping DNS的IP,还不通就检查路由表:
ip route正常应该有一条default via 192.168.10.1 dev bond0。如果default路由走了别的接口,查看bond0的ifcfg文件中的GATEWAY是否写对,以及有没有多余的ifcfg文件也在指定网关。
如果网关ping得通但外网ping不通,跑一下cat /etc/resolv.conf看DNS配置。CentOS 7.6的/etc/resolv.conf有时候会被NetworkManager覆盖,如果你关闭了NM,那么resolv.conf应该只受/etc/sysconfig/network-scripts/ifcfg-bond0中DNS行的控制。
6.3 拔掉网线后切换正常,但重启回来变成主备交换了
这是一个非常容易让人迷惑的现象。假设你测试的时候拔的是eno1的网线,切换正常。但重启系统之后,发现Currently Active Slave显示的是eno2,而不是我们期望的eno1。这并不是故障,只是bonding在切换后没有主从优先级的概念导致的。
如果希望恢复后始终让eno1做主用口,除了要在BONDING_OPTS中添加primary=eno1之外,还需要在主配置文件里设置:
BONDING_OPTS="mode=1 miimon=100 primary=eno1"同时注意ifcfg-eno2中不要设置任何PRIO相关参数,避免干扰主从判定。
6.4 性能没有提升,甚至比单网卡还差
很多人配置Bond的初衷是提升吞吐量,但是mode 1(active-backup)本身就不提供带宽叠加,这一点在配置之前要有清晰的认知,backup模式的唯一价值就是高可用。
如果要提升吞吐,必须切换到mode 4(802.3ad,LACP),需要交换机配合配置链路聚合,且双网卡必须连在同一个聚合端口组内。mode 4下内核用xmit_hash_policy来分发流量,常用的策略是layer3+4。在ifcfg-bond0的BONDING_OPTS里设置:
BONDING_OPTS="mode=4 miimon=100 xmit_hash_policy=layer3+4"这里再提醒一次,mdoe 4模式需要交换机端配置好LACP,不可独立工作。如果你没有权限登录交换机,老老实实用mode 1就好。
6.5 一个通用的Bond问题定位命令集锦
直接抄走,按顺序执行和检查:
# 检查bond接口是否创建、状态如何 cat /proc/net/bonding/bond0 # 列出所有网卡及IP地址 ip addr show # 查看各网卡是否有挂在bond0下 ip link show master bond0 # 查看路由表 ip route # 查看network服务状态和错误日志 systemctl status network journalctl -u network -n 50 --no-pager # 检查bonding内核模块是否加载 lsmod | grep bonding # 查看当前链路状态 ethtool eno1 ethtool eno2整个排查逻辑可以归纳为:先确认bond接口存在且状态up,再确认物理网卡拉起了链路,然后确认路由和IP配置没有冲突,最后看内核日志有没有关于bonding的错误信息。
7. Bond切换脚本与监控告警的落地经验
7.1 监测Bond状态的周期性脚本
配置完Bond之后,还需要有监控手段来确认它长期处于健康状态。写一个简单的shell脚本,配合crontab每五分钟检查一次Bond状态,异常时写入系统日志:
#!/bin/bash # /usr/local/bin/check_bond.sh BOND_STAT=$(cat /proc/net/bonding/bond0) CURRENT_ACTIVE=$(echo "$BOND_STAT" | grep "Currently Active Slave" | awk '{print $4}') if [ -z "$CURRENT_ACTIVE" ] || echo "$BOND_STAT" | grep -q "MII Status: down"; then echo "$(date '+%F %T') bond0 error" >> /var/log/bond_check.log exit 1 fi echo "$(date '+%F %T') bond0 OK active=$CURRENT_ACTIVE" >> /var/log/bond_check.log配合crontab:
*/5 * * * * /usr/local/bin/check_bond.sh这里通过/proc/net/bonding/bond0而不是ethtool来检测状态,是因为/proc文件是内核直接反馈的bond状态,可靠性最高,而ethtool查询的是网卡驱动的信息,两者在异常场景下可能有时间差。
7.2 交换机侧需要配合的事项
Bond的mode 1模式不需要交换机端的任何配置,直接把两根网线插在交换机任意两个端口即可。但如果交换机上启用了STP(Spanning Tree Protocol),建议把连接服务器的两个端口设置为PortFast/Edge Port,否则STP收敛时间会导致Bond切换时网络中断10到30秒。
如果使用mode 4,交换机侧需要把两个端口加入同一个静态聚合组或动态LACP聚合组,并且两个端口的VLAN配置、Trunk设置要完全一致。这一点很多刚接触Bond的人容易忽略:服务器侧配好了802.3ad,但交换机侧端口一个属于access模式一个属于trunk模式,Bond永远起不来。
8. 装机完成后必做的基础安全加固
Bond配置完成后,系统是可以跑业务了,但离“上线标准”还差一截。CentOS 7.6虽然是老系统,但加固动作不能少。这一步不是可选项,在将系统移交业务团队之前,我至少会做以下几件事:
修改SSH默认配置:编辑
/etc/ssh/sshd_config,将PermitRootLogin改为no,PasswordAuthentication改为no,改用公钥登录。虽然有些小团队嫌麻烦,但一台公网可达的机器开着root密码登录,就是给攻击者送分。配置firewalld或iptables:CentOS 7.6默认防火墙是firewalld,很多运维为了省事直接
systemctl stop firewalld,这个习惯非常危险。最小化安装的系统上,只放行SSH和实际业务端口。安装并配置fail2ban:把暴力破解SSH的IP直接拉黑,日志量会明显减少。
统一配置NTP时间同步:
yum install -y chrony systemctl enable chronyd systemctl start chronyd时间同步在排查网络问题时很关键,日志时间不对会让人怀疑Bond切换时间点是否正常。
9. 最后再说几个实际操作中的Tips
这套流程我在不同品牌的服务器上都跑过(Dell R740、HP DL380、浪潮NF系列),Bond的配置思路完全一致,区别主要在于网卡命名规则。Dell和HP默认网卡名可能是eno1/eno2,浪潮可能是em1/em2,配置方法完全一样,只需要把配置文件里的DEVICE字段改成实际网卡名。
另外一个实用技巧是:配置Bond之前,先执行ethtool -i eno1看驱动名。如果是ixgbe(Intel 10G网卡),在配置Bond的时候建议在/etc/modprobe.d/ixgbe.conf里加上options ixgbe allow_unsupported_sfp=1,这个参数主要解决部分兼容SFP模块不被识别的问题。对于千兆板载网卡(e1000e或igb驱动),不需要做特殊处理。
最后是关于selinux的建议。CentOS 7.6默认SELinux是enforcing模式,如果后续要跑Nginx、MySQL这类软件,文件上下文需要逐一放行,对新手来说比较折腾。我的习惯是装完系统先把SELinux设为permissive模式(而不是完全关闭),后续按业务需求逐步放行:
setenforce 0 sed -i 's/^SELINUX=enforcing/SELINUX=permissive/' /etc/selinux/configpermissive模式只警告不阻断,即能直观看到哪些访问被SELinux策略拦截了,又不影响业务上线,等业务跑稳定之后有精力再正经配置策略。
说了这么多,其实核心就一句话:系统安装和Bond配置都是基础设施里的“基本功”,基本功扎实,后面业务网络出问题的概率会小很多。尤其是Bond这种配置,改一次配置可能要等到真正故障的时候才能验证效果,提前做好物理层的故障演练显得尤为重要。我在配置完Bond之后,一定会强制自己当场做一次断线测试,确认切换正常才收工,这个习惯帮我挡掉了许多肉眼看不见的坑。