CentOS服务器部署上线后,很多运维人员习惯先跑一遍基线脚本、装个防火墙就认为安全了,但实际业务跑起来后,真正的问题往往出在策略颗粒度不够、默认配置未收敛、以及长期不审计这几个环节。网络安全的精细化优化不是一次性动作,而是围绕“谁能连、连到哪、用什么协议、失败怎么办”这四个维度持续做减法。下面直接拆解具体可落地的优化方法。

先收紧SSH访问面,别把登录入口暴露给全网

SSH是CentOS服务器最常被扫描的入口,默认22端口加上密码登录,几乎每天都会吃到大量爆破尝试。第一件事是修改默认端口,但要注意不能只改端口就完事,因为端口扫描成本极低。更有效的是结合防火墙白名单,只允许办公网出口IP或跳板机IP访问SSH端口。如果团队没有固定公网IP,就必须强制密钥登录并禁用密码。

修改SSH配置的核心参数如下:

Port 2222
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2
AllowUsers deploy opsuser

改完后执行 systemctl restart sshd 生效。注意先确认密钥能正常登录再断开当前会话,否则容易把自己锁在服务器外面。另外,AllowUsers 比 DenyUsers 更安全,默认拒绝所有、显式放行最小账号集合,这是精细化策略的基本原则。

用firewalld做区域隔离,而不是只开端口

CentOS 7及以上默认使用firewalld,很多运维只执行 firewall-cmd --add-port 就完事,这样所有来源都能访问该端口。精细化做法是把网络接口划分到不同zone,对公网接口只开放业务必须的端口,对内部管理接口才开放SSH和监控端口。

典型配置如下:

# 查看当前默认zone
firewall-cmd --get-default-zone

# 将公网网卡绑定到public zone
firewall-cmd --zone=public --change-interface=eth0 --permanent

# 只开放80和443
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --zone=public --add-service=https --permanent

# 内部网卡绑定到internal zone
firewall-cmd --zone=internal --change-interface=eth1 --permanent

# 内部zone开放SSH和监控端口
firewall-cmd --zone=internal --add-service=ssh --permanent
firewall-cmd --zone=internal --add-port=9100/tcp --permanent

firewall-cmd --reload

这样即使内部服务配置失误监听了公网网卡,防火墙层面也会直接拦截,不会因为应用层配置错误就把敏感端口暴露出去。同时建议关闭firewalld的ICMP重定向和源路由功能,减少网络层攻击面。

内核参数调优,对抗SYN Flood和连接耗尽

CentOS默认内核参数偏向通用场景,对高并发和攻击流量的容忍度不够精细。在 /etc/sysctl.conf 中加入以下参数并执行 sysctl -p 生效:

net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.ip_local_port_range = 1024 65535
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
net.core.somaxconn = 8192
net.core.netdev_max_backlog = 8192

syncookies开启后能有效缓解SYN半连接攻击,降低synack_retries和syn_retries可以减少攻击时内核重试造成的资源占用。tcp_tw_reuse在NAT和负载均衡场景下能显著提升连接复用率,但要注意它只对客户端出方向连接安全,服务器被动接受连接时不要开启tcp_tw_recycle,这个参数在NAT环境下会造成连接被错误丢弃。

用iptables兜底,做连接数限制和异常包过滤

firewalld底层也是调用iptables,但有些精细规则需要直接写iptables。比如限制单个IP对SSH端口的并发连接数,防止单IP占满连接表:

iptables -A INPUT -p tcp --dport 2222 -m connlimit --connlimit-above 3 -j REJECT

再比如丢弃无效状态包和异常TCP标志组合:

iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

这些规则能过滤掉大部分扫描器和畸形包工具。注意iptables规则在重启后会丢失,需要配合iptables-save保存,或者写成systemd service在开机时加载。生产环境建议把规则集中管理,避免firewalld和iptables规则互相覆盖。

限制出站流量,防止服务器变成肉鸡后的横向渗透

大多数安全策略只关注入站,但服务器一旦被拿下,攻击者往往会利用出站连接下载恶意工具或对内网进行横向扫描。精细化策略必须对出站做白名单控制。用firewalld的direct规则或iptables实现:

# 默认允许DNS查询
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT

# 允许HTTP/HTTPS出站,用于系统更新和业务API调用
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

# 允许NTP时间同步
iptables -A OUTPUT -p udp --dport 123 -j ACCEPT

# 允许到内网网段的必要通信
iptables -A OUTPUT -d 10.0.0.0/8 -j ACCEPT
iptables -A OUTPUT -d 172.16.0.0/12 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.0/16 -j ACCEPT

# 默认拒绝其他出站
iptables -P OUTPUT DROP

这个策略会直接阻断反弹shell、挖矿木马连接矿池、以及大部分C2通信。但要注意业务是否有访问外部数据库、消息队列或第三方API的需求,必须提前梳理清楚出站目标,否则上线后会出现诡异的连接失败问题。

关闭不必要的系统服务和网络文件系统

CentOS默认安装会带一些用不到的服务,比如postfix、chronyd之外的rpcbind、avahi-daemon等。rpcbind是NFS相关服务,如果服务器不挂载NFS存储,直接关闭:

systemctl stop rpcbind
systemctl disable rpcbind
systemctl stop rpcbind.socket
systemctl disable rpcbind.socket

avahi-daemon是零配置网络发现服务,服务器环境完全不需要:

systemctl stop avahi-daemon
systemctl disable avahi-daemon

还有cups打印服务、bluetooth服务等,用 systemctl list-unit-files --type=service --state=enabled 检查所有开机自启服务,逐个确认是否业务必需。每多一个监听端口的服务,就多一个攻击面。

日志审计和登录告警,让安全事件可追溯

策略再精细,没有日志和告警也是盲人摸象。CentOS默认的rsyslog只记录基础日志,建议增加对SSH登录成功和失败的独立记录,并配置邮件或Webhook告警。在 /etc/rsyslog.conf 中增加:

authpriv.* /var/log/secure

然后配合logwatch或自写脚本定期分析 /var/log/secure 中的Failed password记录,超过阈值就触发告警。更实时的方案是用fail2ban,它不仅能自动封禁爆破IP,还能自定义action发送告警:

yum install epel-release -y
yum install fail2ban -y
systemctl enable fail2ban
systemctl start fail2ban

在 /etc/fail2ban/jail.local 中配置SSH防护:

[sshd]
enabled = true
port = 2222
maxretry = 3
bantime = 3600
findtime = 600

这样10分钟内失败3次就封禁1小时,能大幅降低爆破成功率。同时建议开启auditd对关键文件变更做审计,特别是 /etc/passwd、/etc/shadow、/etc/sudoers 的修改记录。

定期做端口扫描和策略复盘

精细化优化不是配置完就结束,业务变更、系统升级、新服务上线都可能引入新的暴露面。建议每周用nmap从外部扫描一次服务器:

nmap -sS -sV -p- --open 服务器公网IP

对比防火墙策略和实际监听端口,发现不一致立即排查。同时每季度复盘一次防火墙规则,删除不再使用的端口放行,更新IP白名单。很多安全事件都是因为临时开了一条规则后来忘记删除导致的。

CentOS服务器网络安全策略的精细化,核心在于把“默认允许”改成“默认拒绝”,把“粗粒度端口放行”改成“来源、协议、连接数、出站方向多维控制”。这些配置看起来繁琐,但一旦形成标准化模板,新服务器上线时直接套用即可,长期收益远大于初始投入。