Linux iptables防火墙全攻略实战详解
Linux iptables防火墙全攻略 实战详解
一、概述
本文全面覆盖Linux iptables防火墙的核心知识点与实操场景,包括4表5链基础架构、filter表安全防护(封IP/端口/网段)、nat表网络配置(共享上网/端口转发/IP映射)、规则管理(备份/恢复/限制并发)等核心功能。内容兼顾理论与实战,既适合Linux运维新手入门学习防火墙配置,也适合资深运维人员复习巩固生产环境常用技巧,可直接用于服务器安全防护、内网网络规划等实际工作场景。
二、核心知识点
2.1 防火墙种类及选型
| 类型 | 代表产品/工具 | 核心特点 | 适用场景 |
|---|---|---|---|
| 硬件防火墙 | 深信服、绿盟、奇安信、Cisco | 性能强、防护全面,部署于企业入口 | 大型企业、高并发场景 |
| 软件防火墙 | iptables(Linux内核级) | 内置Linux系统,轻量高效,4层防护 | 服务器单机防护、内网网关 |
| firewalld(CentOS7)、nftables(CentOS8) | 动态规则,操作更便捷 | CentOS7+系统默认防护 | |
| ufw(Ubuntu) | 简化配置,适合Ubuntu桌面/服务器 | Ubuntu系统环境 | |
| 云防火墙 | 阿里云安全组、NAT网关、WAF | 云端托管,无需本地部署 | 公有云服务器(AWS/阿里云/腾讯云) |
2.2 关键名词解释
| 名词 | 定义 | 类比场景 |
|---|---|---|
| 表(Table) | 功能分类容器,iptables核心为4表,按功能划分(过滤、NAT、修改数据包等) | 大楼里的不同功能房间 |
| 链(Chain) | 规则的存储容器,对应数据包流转路径,共5条默认链 | 房间里的货架 |
| 规则(Policy) | 具体的防护/转发策略,包含匹配条件(IP/端口/协议)和动作(ACCEPT/DROP) | 货架上的物品摆放规则 |
| Netfilter | Linux内核中的网络过滤框架,iptables是其用户态管理工具 | 防火墙的“内核引擎” |
2.3 iptables 4表5链核心架构
2.3.1 4表功能划分(核心为filter+nat表)
| 表名 | 核心功能 | 常用链 | 优先级 |
|---|---|---|---|
| filter | 数据包过滤(封IP/端口/网段、白名单),默认表,主机防火墙核心 | INPUT、OUTPUT、FORWARD | ⭐️⭐️⭐️⭐️⭐️ |
| nat | 网络地址转换(共享上网、端口转发、IP映射) | PREROUTING、POSTROUTING、OUTPUT | ⭐️⭐️⭐️⭐️⭐️ |
| raw | 关闭数据包追踪,提升性能(运维极少使用) | PREROUTING、OUTPUT | ⭐️ |
| mangle | 修改数据包标记/TTL(特殊场景使用) | 所有链 | ⭐️ |
2.3.2 5链数据流转路径
| 链名 | 数据包流转场景 | 关联表 |
|---|---|---|
| INPUT | 目标地址为本机的数据包(外部访问服务器) | filter、nat |
| OUTPUT | 源地址为本机的数据包(服务器访问外部) | filter、nat |
| FORWARD | 流经本机的数据包(转发给其他服务器) | filter、nat |
| PREROUTING | 数据包到达本机前(修改目标地址/端口,用于端口转发) | nat、raw、mangle |
| POSTROUTING | 数据包离开本机前(修改源地址/端口,用于共享上网) | nat、mangle |
2.4 iptables 执行流程原理
- 数据包按链的顺序流转:PREROUTING → INPUT/FORWARD → OUTPUT → POSTROUTING;
- 规则按“从上到下”匹配,匹配成功即执行动作(ACCEPT/DROP),不再向下匹配;
- 无匹配规则时,执行链的默认策略(ACCEPT/DROP);
- 拒绝规则(DROP)需放在允许规则前,否则会被允许规则覆盖。
2.5 核心命令参数分类
| 参数类型 | 关键参数 | 含义说明 |
|---|---|---|
| 表操作 | -t | 指定操作的表(默认filter表,如-t nat操作nat表) |
| 规则操作 | -A | 追加规则到链末尾(允许类规则常用) |
| -I | 插入规则到链开头(拒绝类规则常用,如-I INPUT 1插入到第1条) |
|
| -D | 删除规则(按序号-D INPUT 1或按条件-D INPUT -s 10.0.0.1 -j DROP) |
|
| -F | 清空所有规则(需先备份) | |
| -X | 删除自定义链 | |
| -Z | 清零链的数据包/字节计数器 | |
| 规则匹配 | -s | 指定源IP/网段(如-s 10.0.0.0/24) |
| -d | 指定目标IP/网段 | |
| -p | 指定协议(tcp/udp/icmp,如-p tcp) |
|
| --dport | 指定目标端口(如--dport 80) |
|
| --sport | 指定源端口 | |
| -i | 指定入站网卡(如-i eth0) |
|
| -o | 指定出站网卡 | |
| -m | 加载扩展模块(multiport多端口、limit限速、state连接状态) | |
| 动作指定 | -j | 匹配后的动作(ACCEPT允许、DROP丢弃、REJECT拒绝并返回信息、SNAT/DNAT地址转换) |
| 规则查看 | -L | 列出规则(-nL不反向解析IP/端口,-nL --line-number显示规则序号) |
| -v | 详细显示(包含数据包/字节计数) |
三、步骤/命令
3.1 ⭐️ 环境准备(必做)
操作场景:安装iptables服务,关闭firewalld,加载核心模块,开启IP转发。
# 1. 安装iptables服务(CentOS7)
yum install -y iptables-services &>/dev/null
# 2. 关闭并禁用firewalld(避免冲突)
systemctl stop firewalld
systemctl disable firewalld
# 3. 启动iptables并设置开机自启
systemctl start iptables
systemctl enable iptables
# 4. 加载iptables核心模块(filter/nat/连接追踪)
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ipt_state
# 5. 开启内核IP转发(nat表共享上网/转发必备)
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p &>/dev/null
# 6. 验证环境(查看默认规则)
iptables -nL
效果验证:输出filter表默认规则(INPUT链允许22端口、RELATED/ESTABLISHED连接),无报错即环境就绪。
3.2 ⭐️ filter表核心规则配置(安全防护)
3.2.1 封单个IP(禁止10.0.0.188访问服务器)
# 插入规则到INPUT链开头,拒绝源IP 10.0.0.188
iptables -I INPUT -s 10.0.0.188 -j DROP
# 验证规则(查看序号和内容)
iptables -nL --line-number
效果验证:规则列表第1条显示DROP tcp -- 10.0.0.188 0.0.0.0/0,从10.0.0.188访问服务器失败。
3.2.2 封指定端口(禁止访问80端口)
# 拒绝所有IP访问80端口(HTTP服务)
iptables -I INPUT -p tcp --dport 80 -j DROP
# 验证规则
iptables -nL -t filter | grep 80
效果验证:外部访问服务器80端口超时,规则列表显示DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80。
3.2.3 禁止网段访问(禁止10.0.0.0/24访问8888端口)
# 加载multiport模块(可选,单端口可省略),拒绝10.0.0.0/24网段访问8888端口
iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
# 测试:从10.0.0.7访问8888端口
nc -zv 服务器IP 8888
效果验证:10.0.0.0/24网段内主机访问8888端口提示“connection refused”,其他网段正常。
3.2.4 白名单配置(仅允许172.16.1.0/24网段访问)
# 方法1:修改默认策略为DROP,仅允许指定网段
iptables -P INPUT DROP # 默认拒绝所有入站连接
iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT # 允许白名单网段
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 额外允许SSH端口(可选)
# 方法2:排除非白名单网段(默认策略ACCEPT)
iptables -I INPUT ! -s 172.16.1.0/24 -j DROP
# 验证:白名单网段访问正常,其他网段拒绝
ping 服务器IP
效果验证:172.16.1.0/24网段可ping通服务器,其他网段ping超时。
3.2.5 禁止ping(屏蔽ICMP协议)
# 方法1:iptables规则禁止ICMP类型8(ping请求)
iptables -I INPUT -p icmp --icmp-type 8 -j DROP
# 方法2:内核参数禁止ping(永久生效)
echo 'net.ipv4.icmp_echo_ignore_all = 1' >> /etc/sysctl.conf
sysctl -p
# 验证:外部ping服务器无响应
ping 服务器IP
效果验证:执行ping 服务器IP显示“100% packet loss”,服务器无ICMP响应。
3.2.6 限制并发与速率(每分钟最多10个ICMP数据包)
# 加载limit模块,限制ICMP协议速率:10个/分钟,突发5个
iptables -I INPUT -p icmp -m limit --limit 10/min --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP # 默认拒绝其他ICMP请求
# 验证:从客户端持续ping,前5个快速响应,后续每6秒1个响应
ping 服务器IP
效果验证:ping命令输出中,前5个icmp_seq连续,后续icmp_seq间隔约6秒,符合速率限制。
3.2.7 ⭐️ 规则保存与恢复(防止重启丢失)
# 保存规则到默认配置文件(永久生效)
iptables-save > /etc/sysconfig/iptables
# 恢复规则(如误删规则后)
iptables-restore < /etc/sysconfig/iptables
# 重启iptables服务(自动读取配置文件)
systemctl restart iptables
# 验证:重启后查看规则,配置不丢失
iptables -nL
效果验证:服务器重启后,执行iptables -nL仍能看到之前配置的规则,无丢失。
3.3 ⭐️ nat表核心配置(网络转发)
3.3.1 共享上网(172.16.1.0/24网段通过公网IP 10.0.0.61上网)
# 1. 配置SNAT(源地址转换),公网IP固定时
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
# 2. 公网IP不固定时(动态伪装)
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE
# 3. 后端主机配置(网关指向防火墙内网IP 172.16.1.61)
# 编辑后端主机网卡配置(如web01)
cat > /etc/sysconfig/network-scripts/ifcfg-eth1 <<EOF
TYPE=Ethernet
IPADDR=172.16.1.7
PREFIX=24
GATEWAY=172.16.1.61
DNS1=223.5.5.5
ONBOOT=yes
EOF
systemctl restart network
# 4. 验证:后端主机ping外网
ping baidu.com
效果验证:后端主机(172.16.1.7)可正常ping通baidu.com,ip r显示默认网关为172.16.1.61。
3.3.2 端口转发(访问10.0.0.61:9000转发到172.16.1.7:22)
# 配置DNAT(目标地址转换),PREROUTING链修改目标端口
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
# 验证规则
iptables -nL -t nat | grep PREROUTING
# 测试:外部通过9000端口SSH连接后端主机
ssh [email protected] -p 9000
效果验证:执行ssh [email protected] -p 9000可成功登录172.16.1.7主机,端口转发生效。
3.3.3 IP映射(访问10.0.0.62映射到172.16.1.7)
# 给防火墙网卡添加虚拟IP 10.0.0.62
ip addr add 10.0.0.62/24 dev eth0 label eth0:0
# 配置DNAT,所有访问10.0.0.62的流量转发到172.16.1.7
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
# 验证:访问10.0.0.62:80等同于访问172.16.1.7:80
curl 10.0.0.62
效果验证:curl 10.0.0.62返回172.16.1.7主机上的web服务内容(需后端部署web服务)。
3.4 生产环境实战配置(白名单模式)
# 1. 清空现有规则
iptables -F
iptables -X
iptables -Z
# 2. 允许本机lo接口(本地通信必备)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# 3. 允许SSH(22)、Web(80/443)端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
# 4. 允许已建立连接的后续流量
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 5. 允许内网网段(10.0.0.0/24)全访问
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
# 6. 设置默认策略(入站拒绝,出站允许)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 7. 保存规则
iptables-save > /etc/sysconfig/iptables
# 验证最终规则
iptables -nL --line-number
效果验证:服务器仅开放22/80/443端口,内网网段可全访问,外部非法访问被拒绝,符合生产安全要求。
四、原理说明
4.1 iptables 执行流程底层原理
iptables的核心是“链+规则”的顺序匹配机制,数据包流转遵循固定路径:
- 外部数据包到达防火墙后,先进入PREROUTING链(nat表优先处理,修改目标地址/端口);
- 若目标地址是本机,进入INPUT链(filter表过滤,允许/拒绝入站);
- 若目标地址是其他主机,进入FORWARD链(转发过滤,需开启IP转发);
- 本机发出的数据包,先进入OUTPUT链(filter表过滤,nat表可修改源地址);
- 所有数据包离开防火墙前,进入POSTROUTING链(nat表修改源地址/端口,如SNAT)。
关键原则:规则“先匹配先执行”,默认策略是“最后兜底”,拒绝规则需放在允许规则前。
4.2 filter表工作原理
filter表是主机防火墙的核心,仅负责“过滤”数据包,不修改地址/端口:
- INPUT链:过滤“进入本机”的数据包,决定外部能否访问服务器(如封IP/端口);
- OUTPUT链:过滤“本机发出”的数据包,限制服务器访问外部(极少使用);
- FORWARD链:过滤“流经本机”的数据包,仅当防火墙作为网关时生效(需开启IP转发)。
原理类比:filter表如同服务器的“门卫”,只检查进出人员(数据包)是否符合规则,不改变人员身份(IP/端口)。
4.3 nat表工作原理(SNAT/DNAT)
nat表核心是“地址转换”,修改数据包的源/目标IP/端口,实现网络互通:
- SNAT(源地址转换):用于共享上网,POSTROUTING链修改数据包的“源IP”为防火墙公网IP,让内网主机伪装成公网IP访问外网;
- DNAT(目标地址转换):用于端口转发/IP映射,PREROUTING链修改数据包的“目标IP/端口”,将外部请求转发到内网主机。
原理类比:SNAT如同“内网主机借防火墙的公网身份上网”,DNAT如同“快递员将寄到防火墙的包裹转发给内网主机”。
4.4 IP转发原理
Linux默认关闭IP转发(net.ipv4.ip_forward = 0),防火墙作为网关时需手动开启:
- 开启后,内核允许数据包从一个网卡流入、另一个网卡流出(如eth0公网网卡→eth1内网网卡);
- nat表的FORWARD链配合IP转发,实现内网数据包的转发和地址转换,是共享上网、端口转发的前提。
五、注意事项
- 规则顺序至关重要:拒绝规则(DROP)必须放在允许规则前,否则会被允许规则覆盖(如先允许80端口,再封IP则无效);
- 默认策略谨慎修改:
iptables -P INPUT DROP后,需先配置允许规则(如SSH/lo接口),否则会导致远程连接断开; - 规则必须备份:命令行配置的规则重启后丢失,务必执行
iptables-save > /etc/sysconfig/iptables保存; - IP转发必须开启:nat表的共享上网、端口转发功能依赖
net.ipv4.ip_forward = 1,需写入/etc/sysctl.conf永久生效; - 云服务器限制:公有云(阿里云/腾讯云)的nat表功能被“NAT网关”替代,iptables仅支持filter表规则(封IP/端口);
- 模块加载:使用扩展功能(如multiport多端口、limit限速)时,需加载对应内核模块(如
modprobe xt_multiport); - 避免重复规则:配置前先清空规则(
iptables -F),或查看规则序号(--line-number)删除冗余规则; - REJECT与DROP区别:DROP直接丢弃数据包,无响应;REJECT拒绝并返回“connection refused”,建议对外用DROP(隐藏服务),对内用REJECT(方便排查)。
六、结尾
6.1 总结
本文核心覆盖iptables防火墙的四大核心模块,是Linux运维服务器安全与网络配置的必备技能:
- 基础架构:掌握4表5链的定义、流转流程,理解filter表(过滤)和nat表(转换)的核心差异;
- filter表配置:熟练实现封IP/端口/网段、白名单、禁止ping、限速限流,掌握规则保存/恢复;
- nat表配置:精通SNAT共享上网、DNAT端口转发/IP映射,适配内网网络规划场景;
- 生产实践:掌握白名单模式配置,结合默认策略和规则顺序,构建安全可靠的服务器防护体系。
6.2 避坑指南(坑点+解决方案)
| 坑点 | 解决方案 |
|---|---|
| 规则配置后不生效 | 1. 检查规则顺序(拒绝规则是否在前面);2. 验证表是否正确(如nat表需加-t nat);3. 查看是否加载扩展模块(如multiport) |
| 共享上网失败 | 1. 确认开启IP转发(sysctl net.ipv4.ip_forward返回1);2. 检查SNAT规则的源网段和公网IP;3. 后端主机网关指向防火墙内网IP |
| 端口转发无法访问 | 1. 检查PREROUTING链的DNAT规则;2. 确认防火墙FORWARD链默认策略为ACCEPT;3. 后端主机防火墙放行目标端口 |
| 重启后规则丢失 | 1. 执行iptables-save > /etc/sysconfig/iptables保存;2. 启用iptables服务开机自启(systemctl enable iptables) |
| 配置默认DROP后远程断开 | 1. 紧急情况:本地登录服务器添加SSH允许规则(iptables -A INPUT -p tcp --dport 22 -j ACCEPT);2. 预防:配置DROP前先备份规则,先添加关键允许规则 |
| 云服务器nat表规则无效 | 1. 公有云不支持iptables nat表,改用云厂商“NAT网关”;2. 仅用iptables filter表配置封IP/端口,配合云安全组 |
| 限速规则不生效 | 1. 确认加载limit模块(modprobe xt_limit);2. 检查规则顺序(限速规则需在允许规则前);3. 验证--limit和--limit-burst参数格式 |
| lo接口通信失败 | 1. 添加允许lo接口规则(iptables -A INPUT -i lo -j ACCEPT);2. 避免默认DROP策略覆盖lo接口允许规则 |

浙公网安备 33010602011771号