Linux防火墙iptables完整规则:从零学会配置与排错
适用场景与前置准备
如果你刚接触服务器运维,打算用iptables保护Linux服务器安全,却不知道规则从何写起,或者听说“规则顺序很重要”但一头雾水——这篇文章就是为你准备的。
我会按零基础能直接照做的方式,把Linux防火墙iptables完整规则从概念讲到落地。
开始前,先确保你的系统已经装有iptables。
大部分Linux发行版默认包含,但某些最小化安装可能需要手动安装。
执行下面的命令检查:
which iptables
iptables --version
如果显示/usr/sbin/iptables和版本号,说明已就位。
若未安装,根据系统使用包管理器安装(例如CentOS:yum install iptables-services;
Ubuntu:apt install iptables)。
另外,操作iptables需要root权限,建议用sudo或者直接切换root。
理解iptables的核心:表、链与规则流向
iptables的规则按“表”组织,最常用的是filter表(过滤)、nat表(地址转换)和mangle表(修改数据包)。
对于防火墙策略,我们主要操作filter表。
filter表内置三条链:
- INPUT:进入本机的数据包。
- FORWARD:经过本机转发的数据包。
- OUTPUT:从本机发出的数据包。
如果一个包要进入本机,会依次匹配INPUT链上的规则。
规则顺序至关重要:第一条匹配的规则会决定动作(ACCEPT允许、DROP丢弃、REJECT拒绝等),后面的规则不再检查。
这也是新手最容易踩坑的地方。
编写第一条防火墙规则
我们先从最简单的开始:允许SSH(端口22)访问,防止把自己锁在门外。
然后设置默认策略为DROP,只放行必要流量。
1. 清空当前规则(谨慎)
iptables -F
iptables -X
iptables -Z
-F清空所有规则,-X删除用户自定义链,-Z计数器清零。
这通常用于重置环境。
2. 设置默认策略(先放行SSH,再改默认)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
iptables -A OUTPUT -j ACCEPT
iptables -A FORWARD -j DROP
三条命令含义:
- 给INPUT链追加一条规则:允许TCP目标端口22的包进入。
- 再追加一条:其他所有进入的包全部丢弃(DROP)。
- 设置OUTPUT链默认允许(方便测试)。
- 禁止转发。
3. 允许已建立的连接回复
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这行很重要:允许本机发起的连接返回的数据包进入,避免影响正常的出站请求。
让规则永久生效(持久化)
直接配置的规则重启后会丢失。
要让Linux防火墙iptables完整规则在重启后依然有效,需要保存规则并设置开机加载。
CentOS/RHEL 7+:
yum install iptables-services -y
systemctl enable iptables
service iptables save # 规则保存到 /etc/sysconfig/iptables
systemctl restart iptables
Ubuntu/Debian:
apt install iptables-persistent -y
netfilter-persistent save # 规则保存到 /etc/iptables/rules.v4
netfilter-persistent reload
保存后可以检查文件内容确认规则已记录。
避坑指南与高频问题
规则顺序不能乱:先放行必须的端口(如SSH),再设置默认DROP。
如果反了,SSH连接会立刻断开。
建议通过计划任务或cron定时恢复配置作为保险。
不要轻易修改OUTPUT链:除非你清楚出站限制需求,否则新手阶段保持OUTPUT ACCEPT。
忘记添加回环接口:有些服务依赖本机回环(lo)通信。
建议加一条:
iptables -A INPUT -i lo -j ACCEPT
使用REJECT还是DROP:REJECT会返回错误消息(如端口不可达),DROP则直接丢弃,对方会超时等待。
出于安全考虑,多数场景用DROP。
如何临时关闭iptables:
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -F
注意只是清空规则并设置允许所有,并不停止服务。
Q:规则生效后,为什么新加的规则不生效?
A:检查是否在匹配到已有规则后就结束了。使用iptables -L -n --line-numbers查看规则编号和新规则的位置,必要时用-I插入到合适顺序。
Q:如何查看当前所有规则和统计信息?
A:执行iptables -L -n -v,会显示每条规则的包计数和字节数,帮助排错。
验证效果
配置完成后,从另一台机器测试SSH连接是否正常(应该成功)。
再尝试ping本机IP(应该被拒绝,因为你没有放行ICMP)。
如果ping不通,正是预期的DROP效果。
你也可以用iptables -L -n -v确认计数器有增长,验证规则正在工作。
若连接异常,先检查SSH规则是否在DROP之前,以及ESTABLISHED规则是否已添加。
当你掌握了这些基础,就可以根据业务需求添加更多规则(如放行HTTP/HTTPS、自定义端口等)。Linux防火墙iptables完整规则的核心其实就这么几条命令,理解链、表、规则流向和持久化方法,就能应对绝大多数场景。
遇到问题时,优先回看本文的避坑部分,往往能快速定位原因。