从零掌握Linux iptables防火墙:原理、配置与性能调优
本文介绍了Linux防火墙工具iptables的概念与实战应用。主要包括:iptables的四表五链结构,解析filter、nat等表及INPUT、FORWARD等链的功能;常用命令,涵盖规则增删查改及ACCEPT、DROP等动作;配置示例,涉及基础防火墙设置、NAT网关实现(SNAT/DNAT)、DDoS防御(SYN/HTTP洪水防护)等场景;性能优化,包括连接跟踪调优、IP集应用和内核参数调整
一、核心概念
1.概念
iptables 是 Linux 内核集成的 Netfilter 框架的用户空间命令行工具。它允许系统管理员配置内核提供的包过滤规则集,从而控制进出系统的网络流量(数据包)。它是实现防火墙、网络地址转换(NAT)、端口转发等功能的核心组件。
2.Netfilter 框架

3.四表五链结构

4.四表
规则表的作用∶容纳各种规则链
filter表:负责过滤数据包, 确定是否放行该数据包(过滤)
raw表∶ 确定是否对该数据包进行状态跟踪 就是过滤进入主机的数据包
mangle表∶为数据包设置标记
nat表∶ 负责网络地址转换,用来修改数据包中的源、目标IP地址或端口;就是过滤进入主机的数据包,端口映射和ip映射
5.五链
规则链的作用∶容纳各种防火墙规则
表里有链,链里有规则
INPUT∶ 处理入站数据包,匹配目标IP为本机的数据包。
OUTPUT∶处理出站数据包,一般不在此锌上,做配置。
FORWARD∶ 处理转发数据包,匹配流经本机的数据包。
PREROUTING链∶ 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的工P和端口映射到路由器的外网IP和端口上。
POSTROUTING链∶ 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网工P地址上网。
二、iptables 核心语法
1.基本命令格式
iptables [-t 表名] 命令选项 [链名] [规则匹配] [目标动作]
2.常用命令选项
|
命令选项 |
作用 |
|---|---|
|
-A |
在指定链的末尾追加(--append)一条新的规则 |
|
-I |
在指定链的开头插入(--insert)一条新的规则,未指定序号时默认作为第一条规则 |
|
-D |
删除(--delete) 指定链中的某一条规则,可指定规则序号或具体内容 |
|
-L |
列出(--list) 指定链中所有的规则,若未指定链名,则列出表中的所有链 |
|
-n |
使用数字形式(--numeric) 显示输出结果,如显示IP地址而不是主机名 |
|
-t |
指定表 不指定默认是filter表 |
|
-v |
显示详细信息,包括每条规则的匹配包数量和匹配字节数 |
|
--line-numbers |
查看规则时,显示规则的序号 |
|
-p |
协议 protocal tcp/udp/icmp/all |
|
--dport |
目标端口 dest destination 指定端口 加上协议 -p tcp |
|
-s |
--source 源ip |
|
-d |
--destination 目标ip |
|
-j |
满足条件后的动作 : DROP/ACCEPT/REJECT |
|
-F flush |
清除所有规则,不会处理默认的规则 |
|
-X |
删除用户自定义的链 |
|
-Z |
链的计数器清零(数据包计数器与数据包字节计数器) |
3.常用目标动作
|
目标动作 |
作用 |
|---|---|
|
ACCEPT |
允许数据包通过(默认) |
|
DROP |
直接丢弃数据包,不给出任何回应信息 |
|
REJECT |
拒绝数据包通过,会给数据发送端一个响应信息 |
|
SNAT |
源地址转换 修改数据包的源地址 |
|
DNAT |
目标地址转换 修改数据包的目的地址 |
|
MASQUERADE |
伪装成一个非固定公网IP地址 动态源地址转换 (用于拨号网络) |
|
LOG |
在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则。LOG只是一种辅助动作,并没有真正处理 |
三、实战配置示例
1.基础防火墙配置
# 01查看防火墙规则
iptables -L # 查看filter表规则 (默认表)
iptables -t nat -L # 查看nat表规则
iptables -L -v # 查看更详细信息 (包括计数器)
iptables -L -n # 以数字形式显示IP和端口 (避免DNS解析)
iptables -L --line-numbers # 显示规则行号 (用于删除/插入)
# 02设置静默策略
iptables -P INPUT DROP # 设置INPUT链默认策略为DROP
iptables -P FORWARD DROP # 设置FORWARD链默认策略为DROP
iptables -P OUTPUT ACCEPT # 通常OUTPUT默认ACCEPT比较安全
#添加规则--- (-A 追加到链尾, -I 插入到链头或指定位置 开始---
# 03允许已建立的连接
#允许所有已建立的连接(如回包、FTP 数据连接等)通过防火墙
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 04 SSH 连接限速防护(防暴力破解)
#为每个新的 SSH 连接(TCP 22 端口)在 recent 模块中创建记录
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
#限制新连接速率(30 次/分钟),超过则丢弃后续请求
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 30 --rttl --name SSH -j DROP
#允许未触发限速规则的外部访问本机的22端口(SSH服务)
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
# 05 允许本地回环
#允许本地进程间通过环回接口(lo)通信
iptables -I INPUT 1 -i lo -j ACCEPT
# 06 允许内网网段转发
#允许来自192.168.1.0/24网段的流量通过本机转发(路由功能)
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
# 07 允许 HTTP/HTTPS 访问
#允许外部通过 TCP 80 端口访问本机的 HTTP 服务(如 Web 服务器)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
#允许外部通过 TCP 443 端口访问本机的 HTTPS 服务(加密的 Web 流量)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 08 ICMP 限速防护(防 Ping 洪水攻击)
#限制外部 Ping 请求的速率,防止 ICMP 洪水攻击
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT
#直接丢弃超出速率限制的 Ping 请求
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
#添加规则-----结束-----
# 09 清空规则
iptables -F # 清空filter表所有规则
iptables -t nat -F # 清空nat表所有规则
iptables -F INPUT # 清空INPUT链所有规则
iptables -X MYCHAIN # 删除名为MYCHAIN的空自定义链 (必须先清空链内规则)
iptables -Z # 将所有规则的数据包/字节计数器归零
#清空规则 → 删除空链 → 重置计数,使防火墙回到初始空白状态
iptables -F && iptables -X && iptables -Z
2.NAT网关配置
# 01 启用 IP 转发
#允许 Linux 系统作为路由器转发 IPv4 数据包。
sysctl -w net.ipv4.ip_forward=1
# 02 SNAT(共享上网)
#将内网 (192.168.0.0/24) 的流量通过公网接口 (eth0) 共享上网
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# 03 DNAT(端口映射)
#HTTP 端口映射 将公网 eth0 的 80 端口流量转发到内网服务器 192.168.0.100:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.100:80
#SSH 端口映射 将公网 eth0 的 2222 端口映射到内网 192.168.0.100:22(SSH)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2222 -j DNAT --to-destination 192.168.0.100:22
3.防DDoS配置
# 01 SYN洪水防御
# 创建自定义链 SYN_FLOOD
iptables -N SYN_FLOOD
# 将所有 TCP SYN 包(新建连接请求)跳转到 SYN_FLOOD 链
iptables -A INPUT -p tcp --syn -j SYN_FLOOD
# 限制 SYN 包速率:每秒 10 个,突发容量 20 个
iptables -A SYN_FLOOD -m limit --limit 10/s --limit-burst 20 -j RETURN
# 记录超限的 SYN 包(日志路径通常为 /var/log/messages 或 syslog)
iptables -A SYN_FLOOD -j LOG --log-prefix "SYN FLOOD: "
# 丢弃超限的 SYN 包
iptables -A SYN_FLOOD -j DROP
作用说明:
速率限制:
--limit 10/s:允许每秒最多 10 个 SYN 包。
--limit-burst 20:允许瞬时突发 20 个 SYN 包(令牌桶机制)。
符合速率的包会 RETURN 到默认流程,超限的包进入后续规则。
日志与丢弃:超限的 SYN 包会被记录到系统日志(标记为 SYN FLOOD:),然后丢弃。
防御原理:通过限制 SYN 包速率,防止攻击者用大量伪造 SYN 包耗尽服务器连接资源。
# 02 HTTP洪水防御
# 创建自定义链 HTTP_FLOOD
iptables -N HTTP_FLOOD
# 将所有访问 80 端口的流量跳转到 HTTP_FLOOD 链
iptables -A INPUT -p tcp --dport 80 -j HTTP_FLOOD
# 基于源 IP 限制请求速率:每秒 100 请求,突发 300 请求
iptables -A HTTP_FLOOD -m hashlimit \
--hashlimit 100/sec \
--hashlimit-burst 300 \
--hashlimit-mode srcip \
--hashlimit-name http \
-j RETURN
# 丢弃超限的请求
iptables -A HTTP_FLOOD -j DROP
作用说明:
速率限制:
--hashlimit 100/sec:每个源 IP 每秒最多 100 个 HTTP 请求。
--hashlimit-burst 300:允许瞬时突发 300 个请求。
--hashlimit-mode srcip:以源 IP 为统计单位(防止单一 IP 攻击)。
--hashlimit-name http:统计数据存储在 /proc/net/ipt_hashlimit/http。
丢弃超限请求:超速的请求直接被丢弃,避免服务器资源被耗尽。
防御场景:适用于防御 CC(Challenge Collapsar)攻击或 HTTP 洪水攻击。
4.规则备份恢复
#iptables-save 命令保存 备份
iptables-save > /etc/sysconfig/iptables
#恢复
iptables-restore < /root/iptables.backup
四、性能调优指南
1.连接跟踪优化
# 查看当前状态
cat /proc/net/nf_conntrack
# 调整连接跟踪表大小
sysctl -w net.netfilter.nf_conntrack_max=524288
sysctl -w net.nf_conntrack_max=524288
# 减少跟踪时间
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400 # TCP 已建立连接超时(秒)
sysctl -w net.netfilter.nf_conntrack_udp_timeout=60 # UDP 连接超时
sysctl -w net.netfilter.nf_conntrack_icmp_timeout=30 # ICMP 连接超时
# 启用连接跟踪哈希
sysctl -w net.netfilter.nf_conntrack_buckets=65536
2.规则优化原则
01 最常用规则放前面
# 优化前
iptables -A INPUT -p tcp --dport 10000:20000 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 优化后 (SSH规则前移)
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000:20000 -j DROP
02 使用IP集处理大量IP
#创建 ipset 集合
ipset create blacklist hash:ip timeout 86400
#添加 IP 到集合
ipset add blacklist 192.168.1.100
#通过 iptables 引用 ipset
iptables -A INPUT -m set --match-set blacklist src -j DROP
#封禁恶意ip
ipset create attackers hash:ip timeout 36000
ipset add attackers 203.0.113.7
iptables -A INPUT -m set --match-set attackers src -j DROP
#放行白名单
ipset create whitelist hash:ip
ipset add whitelist 192.168.1.200
iptables -A INPUT -m set ! --match-set whitelist src -j DROP # 非白名单一律丢弃
#动态管理集合
ipset del blacklist 192.168.1.100 # 解除封禁
ipset list blacklist # 查看集合内容
ipset flush blacklist # 清空集合(保留结构)
ipset destroy blacklist # 删除整个集合
3.内核参数调优
# 提高网络性能
sysctl -w net.core.netdev_max_backlog=100000
sysctl -w net.core.somaxconn=65535
sysctl -w net.ipv4.tcp_max_syn_backlog=65536
# SYN Cookies防御
sysctl -w net.ipv4.tcp_syncookies=1
# 时间戳优化
sysctl -w net.ipv4.tcp_timestamps=1
sysctl -w net.ipv4.tcp_tw_reuse=1
sysctl -w net.ipv4.tcp_tw_recycle=0 # 在NAT环境中禁用
iptables 是 Linux 网络安全的基石。理解其表、链、规则、状态检测和默认策略的运作机制至关重要。通过精心配置规则,你可以有效地控制进出系统的网络流量,保护系统免受未经授权的访问和攻击。始终牢记“默认拒绝”原则,谨慎操作,并在生产环境修改前充分测试规则。
更多推荐
所有评论(0)