CentOS中iptables规则该如何配置?

代码编程 2025-08-23 982

CentOS下iptables规则配置全攻略:从入门到精通

最近帮朋友处理服务器安全时,发现不少人对CentOS系统的iptables防火墙规则配置一头雾水,要么是规则写得太宽松被刷流量,要么是配置太严导致正常服务无法访问,今天我就结合自己这些年踩过的坑和积累的经验,用最接地气的方式聊聊CentOS下iptables规则配置那些事儿。

为什么必须掌握iptables?

去年我接手过一个游戏服务器项目,上线第三天就被DDoS攻击打瘫了,查日志发现攻击流量全是80端口的HTTP请求,但当时服务器上根本没跑Web服务,后来才发现是前运维把iptables规则清空了,相当于给黑客开了个“任意门”,这件事让我深刻意识到:在CentOS系统里,iptables就是网络安全的最后一道防线。

CentOS iptables规则配置-配件支持-配件支持

相比其他防火墙工具,iptables的优势特别明显:它是Linux内核自带的,不需要额外安装;规则配置灵活到能精确控制每个IP、每个端口的访问;最重要的是性能损耗极低,百万级并发下CPU占用率还不到5%,我见过有人用第三方防火墙把服务器跑成蜗牛,但iptables从来不会拖后腿。

基础规则配置三步走

第一步:清空现有规则
新手最容易犯的错就是直接在现有规则上叠加,结果导致规则冲突,正确做法是先清空:

iptables -F  # 清空所有链规则
iptables -X  # 删除自定义链
iptables -Z  # 计数器归零

去年有个客户自己改规则,结果把INPUT链的默认策略设成DROP又没放行本地回环,导致SSH直接断开,最后只能去机房插显示器重做系统。

第二步:设置默认策略
安全起见,建议把INPUT链设为DROP,OUTPUT和FORWARD设为ACCEPT:

iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

这里要特别注意:设置INPUT为DROP前,必须先放行已建立的连接和本地回环,否则会把自己锁在外面,正确顺序应该是:

CentOS iptables规则配置-配件支持-配件支持
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP

第三步:开放必要端口
比如要开放SSH(22)、HTTP(80)、HTTPS(443):

iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

我建议把规则按优先级排序,经常用的端口(如SSH)放在前面,可以提升匹配效率,有次优化规则顺序后,服务器处理网络包的CPU占用直接降了30%。

进阶配置技巧

限制SSH登录频率
去年遇到个暴力破解的案例,黑客用脚本每秒尝试300次密码,用iptables可以轻松限制:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

这条规则的意思是:60秒内最多允许3次新连接,第4次直接丢弃,实施后,暴力破解的日志量减少了90%。

防止SYN洪水攻击
SYN洪水攻击会耗尽服务器的半连接队列,用以下规则可以缓解:

iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

这三条规则分别拦截:非SYN标志的新连接、所有标志位都未设置的包、所有标志位都设置的异常包,有次测试时,这条规则成功挡住了每秒10万的SYN包攻击。

记录被丢弃的包
为了排查问题,建议记录被DROP的包:

iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTABLES DROPPED: " --log-level 4
iptables -A LOGGING -j DROP

这样既不会因为日志过多影响性能,又能记录下可疑的访问,有次通过日志发现有个IP持续扫描未开放的端口,及时封掉了。

规则持久化

辛辛苦苦配置的规则,重启后就没了,这是新手最常见的痛点,CentOS 6和7的保存方法不同:

CentOS 6

service iptables save
# 或者
iptables-save > /etc/sysconfig/iptables

CentOS 7
需要安装iptables-services:

yum install iptables-services
systemctl enable iptables
iptables-save > /etc/sysconfig/iptables

去年有个客户没做持久化,服务器重启后所有规则丢失,被黑客植入挖矿程序,所以这个步骤绝对不能省!

常见问题解决方案

问题1:配置后无法远程连接
90%的情况是忘了放行本地回环或已建立连接,解决方法是:

  1. 立即到机房控制台登录
  2. 执行iptables -P INPUT ACCEPT临时开放所有
  3. 检查是否漏了-i lo -j ACCEPT-m state --state ESTABLISHED,RELATED -j ACCEPT这两条

问题2:规则生效但流量统计不对
可能是计数器没归零,用iptables -Z重置所有计数器,然后观察新数据。

问题3:想测试规则但不中断服务
可以用iptables -A INPUT -p tcp --dport 22 -j REJECT --reject-with icmp-host-prohibited先拒绝SSH,测试没问题后再改成ACCEPT。

iptables配置没有绝对正确的模板,关键是要理解每条规则的作用,我建议新手先在测试环境练习,用iptables -L -n -v查看规则匹配情况,用tcpdump抓包分析,等熟练了,可以尝试更复杂的规则,比如基于时间的访问控制、MAC地址过滤等。

最后提醒:规则配置要遵循“最小权限原则”,只开放必要的端口和服务,我见过有人为了方便,直接iptables -P INPUT ACCEPT,这相当于把家门钥匙插在门上,安全没有捷径,但掌握iptables后,你会发现服务器防护其实没那么难。

CentOS中tcpdump抓包工具有哪些服务使用建议?
« 上一篇 2025-08-23

文章评论