目录
(1)添加新的规则(链的末尾可使用“-p 协议名”作匹配条件)
(2)查看规则列表(可结合“-L”,“--line-numbers”)
一、 Linux 防火墙基础
1. 防火墙基础概念
(1)防火墙的概述与作用
定义:防火墙是位于网络边界的 安全屏障,通过预定义规则控制进出网络的流量。
核心功能:
访问控制:允许或拒绝特定流量(如 IP、端口、协议)。
网络地址转换(NAT):隐藏内部网络结构,实现 IP/端口映射。
流量监控:记录网络活动,检测异常行为(如 DDoS 攻击)。
防御攻击:阻止恶意流量(如 SYN Flood、ICMP 洪水)。
(2)防火墙的结构与匹配流程
┌───────────────┐ 输入流量 →│ 规则匹配引擎 │→ 输出流量 └───────┬───────┘ ↓ [日志记录/警报]
数据包 → 匹配规则 → 执行动作(ACCEPT/DROP/REJECT) ↑ 规则数据库(表+链+规则)
匹配流程:
协议分析 → 规则匹配 → 执行动作(允许/拒绝/日志)
(3)防火墙的类别与各个防火墙的区别
iptables:传统防火墙工具,用于管理Linux防火墙的命令程序,基于 Netfilter 框架,通过规则表(Tables)和规则链(Chains)管理流量。是“用户态”(User Space ,用户空间)的防火墙管理体;通常在/sbin/iptables 目录下。
nftables:iptables 的替代品,在Linux内核中实现包过滤防火墙的内部结构,语法更简洁,性能更优,逐步成为主流。是“内核态”(Kernel Space ,内核空间)不以程序或文件形式存在的防火墙功能体系。
firewalld:动态防火墙管理工具(Red Hat 系默认),支持区域(Zones)和运行时/永久配置。
类型对比
工具 | 特点 | 适用场景 | |
---|---|---|---|
iptables | 基于 Netfilter 框架,直接管理规则表/链,语法复杂但灵活。 | 精细化控制、复杂网络环境 | |
nftables | iptables 的替代品,统一语法、性能更优,支持多规则合并。 | 新系统、追求高效管理的场景 | |
firewalld | 动态防火墙管理工具,支持运行时/永久配置,抽象为“服务”和“区域”。 | 快速配置(如开放 Web 服务) |
2. iptables 的表、链结构
iptables 的作用是为了过滤机制的实现提供规则
(1)规则表
表名 | 功能 | 常见操作 |
---|---|---|
filter | 数据包过滤(默认表)确定是否放行数据包 | 允许/拒绝流量(ACCEPT/DROP) |
nat | 网络地址转换(NAT)修改数据包中的源、目标 IP 地址或端口。 | 端口转发、IP 伪装(MASQUERADE) |
mangle | 修改数据包头部(如 TTL(生存周期)、TOS(服务类型))为数据包设置标记 | 标记数据包(MARK) |
raw | 决定是否对数据包进行状态跟踪 | 标记不追踪的数据包(NOTRACK) |
(2)规则链
每个表包含多个链,链是规则的集合,决定数据包的处理路径:
链名 | 所属表 | 触发场景 |
---|---|---|
POSTROUTING | mangle, nat | 数据包离开网卡前(SNAT 修改源地址) |
PREROUTING | raw, mangle, nat | 数据包进入网卡后、路由决策前(DNAT 修改目标地址) |
INPUT | filter | 数据包目标是本机地址应用(入站) |
OUTPUT | filter | 本机向外发出的数据包(出站) |
FORWARD | filter | 数据包需要转发到其他主机(路由开启时生效) |
链路由图:
外部数据 → PREROUTING → 路由判断 → 目标是否本机?
↓ ↙ ↘
INPUT链 FORWARD链 OUTPUT链
↓ ↓ ↓
本机进程 转发处理 POSTROUTING → 外发
3. 数据包过滤的匹配流程
匹配流程:
数据包依次经过不同 表(raw
→ mangle
→ nat
→ filter
)。
在表中按 链 的顺序处理(如 PREROUTING
→ INPUT
)。
链内规则按 从上到下 顺序匹配,命中则执行动作(ACCEPT/DROP)。
(1)规则表之间的顺序
数据包依次经过 raw → mangle → nat → filter 表的处理:
raw 表PREROUTING链:决定是否跳过连接追踪(如标记
NOTRACK
)。mangle 表PREROUTING链:修改数据包头部(如调整 TTL)。
nat 表PREROUTING链:执行地址转换(如 DNAT 端口映射)。
filter 表INPUT链:最终决定是否允许数据包通过。
(2)规则链之间的顺序
数据包根据方向触发不同链:
入站流量(如访问本机 Web 服务):
网卡 → PREROUTING(raw/mangle/nat) → 路由决策 → INPUT(filter) → 本地应用
转发流量(如路由器转发数据):
网卡 → PREROUTING → 路由决策 → FORWARD(filter) → POSTROUTING → 出站网卡
出站流量(如本机访问外网):
本地应用 → OUTPUT(filter) → POSTROUTING(mangle/nat) → 出站网卡
入站流量处理流程
1. 网卡接收数据包 ↓ 2. raw 表的 PREROUTING 链 ↓ 3. mangle 表的 PREROUTING 链 ↓ 4. nat 表的 PREROUTING 链(DNAT) ↓ 5. 路由决策(目标是否为本机?) ↓ 6. 是 → filter 表的 INPUT 链(决定是否允许进入本机) ↓ 7. 本地应用接收
出站流量处理流程
1. 本地应用发送数据包 ↓ 2. filter 表的 OUTPUT 链(决定是否允许出站) ↓ 3. mangle 表的 POSTROUTING 链 ↓ 4. nat 表的 POSTROUTING 链(SNAT/MASQUERADE) ↓ 5. 数据包从网卡发出
(3)规则链内部各条防火墙规则之间的顺序
执行原则:
从上到下逐条匹配
首次匹配后停止(ACCEPT/DROP/REJECT)
未匹配则执行链的默认策略(通过
iptables -P
设置)
总结速记表
核心概念 | 要点 |
---|---|
防火墙作用 | 访问控制、NAT、流量监控、防御攻击 |
表与链的关系 | 表按功能分类,链按流量方向划分 |
匹配流程顺序 | raw → mangle → nat → filter(表顺序);PREROUTING → INPUT/FORWARD → POSTROUTING(链顺序) |
安全最佳实践 | 默认拒绝(-P DROP )、细化规则优先、定期审计规则 |
二、编写防火墙规则
1. iptables 的基础设置
(1)iptables 安装
yum -y install iptables iptables-services ##注意有些系统装过iptables,直接下一步启动就好
(2)启动防火墙并设置开机自启动
systemctl stop firewalld ##关闭默认的 防火墙(firewalld),避免产生影响
systemctl disable firewalld
systemctl start iptables.service ##启动iptables 防火墙
systemctl enable iptables.service
2. 基本语法、数据包控制类型
(1)基本语法
iptables [-t 表名] 命令选项 [链名] [规则条件] [-j 控制类型 ]
参数解析:
-t
:指定操作表(不指定,默认为filter表)命令选项:
-A
(追加)/-I
(插入)/-D
(删除)/-L
(查看)等-j
:指定数据包处理动作(ACCEPT/DROP等)-p : 指定协议
(2)控制类型
控制类型 | 功能描述 | 典型场景 |
---|---|---|
ACCEPT | 允许通过 | 开放SSH端口(22) |
DROP | 静默丢弃 | 防御端口扫描 |
REJECT | 拒绝并返回错误 | 明确拒绝HTTP请求(返回RST) |
LOG | 记录日志(不阻断流量)/var/log/messages | 调试防火墙规则 |
SNAT | 源地址转换 | 内网机器访问外网 |
DNAT | 目标地址转换 | 外网访问内网服务器 |
MASQUERADE | 动态源地址转换 | 拨号上网等动态IP环境 |
3. 添加·、查看、删除规则等基本规则
管理选项:
类别 | 选项 | 用途 |
---|---|---|
增加 | -A | 追加到最后一行 |
-I | 插入到第一行(或指定序号) | |
查看 | -L | 列出所有规则 |
-n | 以数字形式显示 | |
-v | 详细信息 | |
--line(--line-numbers) | 显示序号 | |
删除 | -D | 删除一条(指定序号或内容) |
-F | 清空所有 | |
修改 | -R | 替换某条规则 |
设置默认 | -P | 设置默认规则 |
(1)添加新的规则(链的末尾可使用“-p 协议名”作匹配条件)
# 允许特定IP访问SSH
iptables -A INPUT -s 192.168.1.100 -p tcp --dport 22 -j ACCEPT
# 插入规则到链首(优先级最高)
iptables -I INPUT 1 -p icmp -j DROP # 禁止所有ping
# 设置端口转发(需开启ip_forward)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.0.0.2:80
(2)查看规则列表(可结合“-L”,“--line-numbers”)
# 查看filter表规则(默认表)
iptables -L -n --line-numbers -v
# 查看nat表规则
iptables -t nat -L -n
# 输出解析:
# num pkts bytes target prot opt in out source destination
# 1 200 12000 ACCEPT tcp -- * * 192.168.1.100 0.0.0.0/0 tcp dpt:22
(3)删除、清空规则
# 按编号删除
iptables -D INPUT 2 # 删除INPUT链第2条规则
# 按条件删除
iptables -D INPUT -s 192.168.1.100 -j ACCEPT
# 清空所有规则
iptables -F # 清空当前表 默认filter表
iptables -t nat -F # 清空nat表
(4)设置默认策略
# 设置INPUT链默认拒绝所有入站
iptables -P INPUT DROP
# 设置OUTPUT链默认允许所有出站
iptables -P OUTPUT ACCEPT
# 注意:默认策略应在具体规则前设置!
三、规则的匹配条件(分为三大类)
匹配条件是什么?有什么用?
1. 通用匹配(常规匹配,可直接使用)
(1)协议匹配
结合“ -p 协议名 ”的形式指定,用来检查数据包所使用的网络协议(--protocol),可用协议类型在/etc/procotols 文件。
iptables -I INPUT -p icmp -j DROP //丢弃通过 icmp 协议访问防火墙本机的数据包
iptables -A FORWARD ! -p icmp -j ACCEPT //允许转发经过防火墙的除 icmp 协议之外的数据包
(2)地址匹配
结合“-s 源地址” 或 “-d 目标地址 ”的形式指定,用来检查数据包的源地址(--source)或目标地址(--destination)。
##拒接转发源地址192.168.1.11的数据,允许转发源地址位于192.168.7.0/24网段的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.7.0/24 -j ACCEPT
#遭到小规模扫描和攻击时(例如10.20.30.0/24),封锁IP地址
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -I FORWARD -s 10.20.30.0/24 -j DROP
(3)网络接口匹配
结合“-i 接口名” 和 “-o 接口名 ”的形式指定,用于检查数据包从防火墙的哪一个接口进入或发出,分别对应入站网卡(--in-interface)、出站网卡(--out-interface)
##要丢弃从外网接口访问防火墙本机且源地址为私有地址的数据包
iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i ens33 -s 172.16.0.0/16 -j DROP
iptables -A INPUT -i ens33 -s 192.168.0.0/16 DROP
2. 隐含匹配(指定的协议匹配为前提条件,无法单独使用)
(1)端口匹配
结合“--sport 源端口” 或 “--dport 目标端口” 的形式,针对的协议为 TCP 或 UDP,用来检查数据包的源端口或目标端口。单个端口号或以冒号“ : ”分隔,但多个端口不采用。
##允许为网段192.168.4.0/24 转发 DNS 查询数据包
iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.4.0/24 -p udp --sport 53 -j ACCEPT
(2)ICMP 类型匹配
结合“--icmp-type ICMP” 的形式,用于检查ICMP数据包的类型(--icmp-type).
##禁止从其他主机ping本机,但是允许本机ping其他本机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP
3. 显式匹配(要求额外的内核模块提供支持,必须“-m 模块名称”形式调用)
(1)多端口匹配
结合“-m multiport --dports 端口列表”、“-m multiport --sports 端口列表”的形式,用于检查数据包的源端口、目标端口、多个端口以逗号进行分隔。
iptables -A INPUT -p tcp -m multiport --dport 25,80,110,143 -j ACCEPT
(2)IP范围匹配
结合“-m iprange --src-range IP 范围”、“-m iprange --dst-range IP范围”的形式,用于检查数据包的源地址、目标地址。
iptables -A FORWARD -p tcp -m iprange --src-range192.168.4.21-192.168.4.28 -j DROP
(3)MAC 地址匹配
结合“-m mac --mac-source MAC地址”的形式,用于检查数据包的源MAC地址。
iptables -A INPUT -m mac --mac-source MAC地址 -j DROP
(4)状态匹配
结合“-m state --state 连接状态”的形式,基于iptables 的状态跟踪机制用来检查数据包的连接状态(State)。
##禁止转发与正常TCP连接无关的非--syn请求数据包
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
##只开放本机Web服务(80端口),但对发给本机的TCP应答数据包放行
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP