服务器iptables防火墙规则编写指南:从入门到实战

2026-07-210 阅读
网站安全防护
服务器iptables防火墙规则编写指南:从入门到实战

新装的服务器第一件事干什么?很多人的答案是装环境。错了,应该是配防火墙。一台裸奔在公网的服务器,平均十几分钟就会被扫描到。iptables虽然老了,但它是Linux防火墙的根基,搞懂了受益无穷。

理解iptables的链和表

别被iptables的术语吓到。你只需要记住:filter表管过滤,INPUT链处理进来的流量,OUTPUT链处理出去的流量,FORWARD链处理转发的流量。日常服务器防护主要关注INPUT链。

规则匹配是自上而下的,命中一条就不再往下走。所以顺序很关键——放行规则写在前面,拒绝规则写在后面,默认策略兜底。

基础规则模板

一套够用的iptables规则大概长这样:

iptables -P INPUT DROP # 默认拒绝所有入站
iptables -P FORWARD DROP # 默认拒绝转发
iptables -P OUTPUT ACCEPT # 默认允许出站
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 放行已建立连接
iptables -A INPUT -i lo -j ACCEPT # 放行本地回环
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # 放行HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 放行HTTPS
iptables -A INPUT -p tcp --dport 58932 -j ACCEPT # 放行SSH(改过端口)

这套逻辑是白名单模式:默认拒绝所有,只放行明确需要的端口。比黑名单(默认允许,逐条拒绝)安全得多,因为你不会遗漏未知威胁。

防暴力破解和端口扫描

用recent模块限制SSH连接频率:

iptables -A INPUT -p tcp --dport 58932 -m recent --name SSH --update --seconds 60 --hitcount 5 -j DROP
iptables -A INPUT -p tcp --dport 58932 -m recent --name SSH --set -j ACCEPT

这表示同一个IP在60秒内尝试连接SSH超过5次就丢弃。简单粗暴但有效,配合改端口使用效果更好。

规则持久化

iptables规则默认重启就丢。CentOS用service iptables save,Ubuntu装iptables-persistent后用netfilter-persistent save。不管哪种方式,配完规则一定要保存,否则下次重启你就傻眼了。

建议把规则写成一个shell脚本放在/root/iptables_rules.sh,每次修改后执行一次并保存。脚本里加注释说明每条规则的用途,半年后回来看还能看懂。

iptables不是万能的,它是网络层的防护,对应用层攻击无能为力。但作为服务器第一道门,把该关的端口关好,该限的连接限住,已经能挡掉大部分自动化攻击。配合应用层WAF,纵深防御才算完整。