CentOS中iptables规则该如何配置?
CentOS下iptables规则配置全攻略:从入门到精通
最近帮朋友处理服务器安全时,发现不少人对CentOS系统的iptables防火墙规则配置一头雾水,要么是规则写得太宽松被刷流量,要么是配置太严导致正常服务无法访问,今天我就结合自己这些年踩过的坑和积累的经验,用最接地气的方式聊聊CentOS下iptables规则配置那些事儿。
为什么必须掌握iptables?
去年我接手过一个游戏服务器项目,上线第三天就被DDoS攻击打瘫了,查日志发现攻击流量全是80端口的HTTP请求,但当时服务器上根本没跑Web服务,后来才发现是前运维把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前,必须先放行已建立的连接和本地回环,否则会把自己锁在外面,正确顺序应该是:

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%的情况是忘了放行本地回环或已建立连接,解决方法是:
- 立即到机房控制台登录
- 执行
iptables -P INPUT ACCEPT
临时开放所有 - 检查是否漏了
-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后,你会发现服务器防护其实没那么难。
文章评论