端口扫描是攻击者发起网络攻击前的常见探测行为,攻击者通过扫描服务器开放的端口,判断运行的服务类型,进而寻找可利用的漏洞。CentOS系统作为主流的服务器操作系统,需要通过多层防护策略来阻止这类扫描行为,减少被入侵的概率。
使用firewalld配置基础端口防护
firewalld是CentOS 7及以上版本默认的动态防火墙管理工具,支持区域划分和规则动态更新,适合快速配置端口访问限制。首先确认firewalld服务运行状态:
# 查看firewalld服务状态 systemctl status firewalld # 如果未运行则启动服务并设置开机自启 systemctl start firewalld systemctl enable firewalld
接下来可以配置仅开放必要的服务端口,其余端口默认拒绝访问,同时限制单个IP的短时间连接次数,避免被扫描工具高频探测:
# 开放SSH服务端口(默认22,建议修改为非默认端口) firewall-cmd --permanent --add-service=ssh # 开放HTTP服务端口 firewall-cmd --permanent --add-service=http # 开放HTTPS服务端口 firewall-cmd --permanent --add-service=https # 配置单个IP每分钟最多发起10次新连接,超过则拒绝 firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="0.0.0.0/0" limit value="10/m" accept' # 重载规则使配置生效 firewall-cmd --reload
使用iptables实现更精细的扫描拦截
如果需要更底层的规则控制,可以使用iptables配置防护规则,iptables能直接操作内核的netfilter框架,拦截效果更稳定。首先停止firewalld服务避免规则冲突:
systemctl stop firewalld systemctl disable firewalld # 安装iptables服务 yum install -y iptables-services # 启动iptables并设置开机自启 systemctl start iptables systemctl enable iptables
配置iptables规则拦截常见的端口扫描行为,比如SYN扫描、NULL扫描、XMAS扫描等:
# 清空现有规则 iptables -F # 设置默认策略:输入链拒绝,输出链允许,转发链拒绝 iptables -P INPUT DROP iptables -P OUTPUT ACCEPT iptables -P FORWARD DROP # 允许本地回环接口通信 iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关连接通过 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 开放SSH端口(替换为实际使用的SSH端口) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 开放HTTP和HTTPS端口 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 拦截SYN扫描(SYN包且FIN和ACK位未设置) iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN -m limit --limit 10/s -j ACCEPT iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK SYN -j DROP # 拦截NULL扫描(所有标志位都为0的TCP包) iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # 拦截XMAS扫描(FIN、URG、PSH标志位同时置1的TCP包) iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP # 保存规则 service iptables save
部署fail2ban自动封禁扫描IP
fail2ban是一款入侵防护工具,能监控日志文件,发现多次异常访问的IP后自动将其加入防火墙封禁列表,适合应对持续的端口扫描行为。首先安装fail2ban:
yum install -y epel-release yum install -y fail2ban
创建fail2ban的端口扫描防护配置文件,监控SSH和系统日志中的异常连接记录:
# 创建自定义防护规则配置文件
cat > /etc/fail2ban/jail.d/port-scan.conf << EOF
[port-scan]
enabled = true
# 监控的日志文件,根据实际服务调整
logpath = /var/log/secure
# 匹配短时间内的多次连接尝试
filter = port-scan
# 封禁IP的时长,单位秒,这里设置为1小时
bantime = 3600
# 检测时间窗口,单位秒
findtime = 600
# 窗口内超过5次异常则封禁
maxretry = 5
# 使用的封禁动作,对应iptables规则
banaction = iptables-multiport
EOF
# 创建对应的过滤规则文件
cat > /etc/fail2ban/filter.d/port-scan.conf << EOF
[Definition]
failregex = ^.*Failed password for .* from <HOST> port d+ ssh2$
^.*Connection closed by authenticating user .* <HOST> port d+ [preauth]$
ignoreregex =
EOF
启动fail2ban服务并验证规则生效:
# 启动服务并设置开机自启 systemctl start fail2ban systemctl enable fail2ban # 查看当前封禁的IP列表 fail2ban-client status port-scan
优化内核参数增强防护能力
调整CentOS的内核参数可以从系统层面减少端口扫描的响应特征,降低被识别的概率。编辑sysctl配置文件:
# 编辑内核参数配置文件 vi /etc/sysctl.conf
在文件末尾添加以下配置:
# 关闭ICMP重定向接受 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 # 关闭源路由包接受 net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 # 开启SYN Cookie防护SYN洪水攻击 net.ipv4.tcp_syncookies = 1 # 减少TCP连接超时时间 net.ipv4.tcp_fin_timeout = 30 # 关闭TCP时间戳,避免被扫描工具获取系统运行时间 net.ipv4.tcp_timestamps = 0
执行命令使内核参数生效:
sysctl -p
防护策略验证与注意事项
配置完成后可以使用nmap工具在外部机器测试防护效果,执行nmap -sS 目标服务器IP查看扫描结果,正常情况下未开放的端口应显示为filtered状态,无法获取端口实际状态。需要注意以下几点:
- 不要完全封禁所有端口,务必保留SSH等管理端口的访问权限,避免自己无法登录服务器
- 如果使用云服务器,还需要配合云服务商的安全组规则,双层防护效果更好
- 定期查看防火墙和fail2ban的日志,及时调整规则阈值,避免误封正常访问的IP
- 建议将SSH端口修改为非默认端口,减少被自动化扫描工具命中的概率