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 执行流程原理

  1. 数据包按链的顺序流转:PREROUTING → INPUT/FORWARD → OUTPUT → POSTROUTING;
  2. 规则按“从上到下”匹配,匹配成功即执行动作(ACCEPT/DROP),不再向下匹配
  3. 无匹配规则时,执行链的默认策略(ACCEPT/DROP);
  4. 拒绝规则(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的核心是“链+规则”的顺序匹配机制,数据包流转遵循固定路径:

  1. 外部数据包到达防火墙后,先进入PREROUTING链(nat表优先处理,修改目标地址/端口);
  2. 若目标地址是本机,进入INPUT链(filter表过滤,允许/拒绝入站);
  3. 若目标地址是其他主机,进入FORWARD链(转发过滤,需开启IP转发);
  4. 本机发出的数据包,先进入OUTPUT链(filter表过滤,nat表可修改源地址);
  5. 所有数据包离开防火墙前,进入POSTROUTING链(nat表修改源地址/端口,如SNAT)。

关键原则:规则“先匹配先执行”,默认策略是“最后兜底”,拒绝规则需放在允许规则前。

4.2 filter表工作原理

filter表是主机防火墙的核心,仅负责“过滤”数据包,不修改地址/端口:

  • INPUT链:过滤“进入本机”的数据包,决定外部能否访问服务器(如封IP/端口);
  • OUTPUT链:过滤“本机发出”的数据包,限制服务器访问外部(极少使用);
  • FORWARD链:过滤“流经本机”的数据包,仅当防火墙作为网关时生效(需开启IP转发)。

原理类比:filter表如同服务器的“门卫”,只检查进出人员(数据包)是否符合规则,不改变人员身份(IP/端口)。

4.3 nat表工作原理(SNAT/DNAT)

nat表核心是“地址转换”,修改数据包的源/目标IP/端口,实现网络互通:

  1. SNAT(源地址转换):用于共享上网,POSTROUTING链修改数据包的“源IP”为防火墙公网IP,让内网主机伪装成公网IP访问外网;
  2. DNAT(目标地址转换):用于端口转发/IP映射,PREROUTING链修改数据包的“目标IP/端口”,将外部请求转发到内网主机。

原理类比:SNAT如同“内网主机借防火墙的公网身份上网”,DNAT如同“快递员将寄到防火墙的包裹转发给内网主机”。

4.4 IP转发原理

Linux默认关闭IP转发(net.ipv4.ip_forward = 0),防火墙作为网关时需手动开启:

  • 开启后,内核允许数据包从一个网卡流入、另一个网卡流出(如eth0公网网卡→eth1内网网卡);
  • nat表的FORWARD链配合IP转发,实现内网数据包的转发和地址转换,是共享上网、端口转发的前提。

五、注意事项

  1. 规则顺序至关重要:拒绝规则(DROP)必须放在允许规则前,否则会被允许规则覆盖(如先允许80端口,再封IP则无效);
  2. 默认策略谨慎修改iptables -P INPUT DROP后,需先配置允许规则(如SSH/lo接口),否则会导致远程连接断开;
  3. 规则必须备份:命令行配置的规则重启后丢失,务必执行iptables-save > /etc/sysconfig/iptables保存;
  4. IP转发必须开启:nat表的共享上网、端口转发功能依赖net.ipv4.ip_forward = 1,需写入/etc/sysctl.conf永久生效;
  5. 云服务器限制:公有云(阿里云/腾讯云)的nat表功能被“NAT网关”替代,iptables仅支持filter表规则(封IP/端口);
  6. 模块加载:使用扩展功能(如multiport多端口、limit限速)时,需加载对应内核模块(如modprobe xt_multiport);
  7. 避免重复规则:配置前先清空规则(iptables -F),或查看规则序号(--line-number)删除冗余规则;
  8. REJECT与DROP区别:DROP直接丢弃数据包,无响应;REJECT拒绝并返回“connection refused”,建议对外用DROP(隐藏服务),对内用REJECT(方便排查)。

六、结尾

6.1 总结

本文核心覆盖iptables防火墙的四大核心模块,是Linux运维服务器安全与网络配置的必备技能:

  1. 基础架构:掌握4表5链的定义、流转流程,理解filter表(过滤)和nat表(转换)的核心差异;
  2. filter表配置:熟练实现封IP/端口/网段、白名单、禁止ping、限速限流,掌握规则保存/恢复;
  3. nat表配置:精通SNAT共享上网、DNAT端口转发/IP映射,适配内网网络规划场景;
  4. 生产实践:掌握白名单模式配置,结合默认策略和规则顺序,构建安全可靠的服务器防护体系。

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接口允许规则
posted @ 2026-03-12 22:16  gzjwo  阅读(13)  评论(0)    收藏  举报