零基础从头教学Linux(Day 33)
Linux防火墙-Iptables
Iptables 防火墙指南
一、 Iptables 概述
Iptables 是一个用户空间工具,用于配置 Linux 内核级防火墙。它采用表、链和规则的层级结构,能够根据不同需求进行灵活配置。
主要特点:
- 作为内核级防火墙,具备高效、稳定、安全的特性
- 表链规则结构灵活,适应各种网络环境和应用场景
- 相比其他防火墙工具更易学易用,扩展性强
二、 Iptables 组成
Iptables 由表(table)、链(chain)和规则(rule)三个核心组件构成。
表(Table)
表是规则集合,包含若干链和相关规则。常用五种表:
表名 | 功能 | 包含链 |
---|---|---|
raw | 决定是否进行状态跟踪 | OUTPUT, PREROUTING |
mangle | 修改数据包内容,用于流量整形 | INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING |
nat | 网络地址转换,修改源/目标IP或端口 | OUTPUT, PREROUTING, POSTROUTING |
filter | 数据包过滤,决定是否放行 | INPUT, FORWARD, OUTPUT |
表优先级顺序:raw > mangle > nat > filter
链(Chain)
链是相关联的规则集合:
链名 | 功能 |
---|---|
INPUT | 处理目的地址为本机的入站数据包 |
OUTPUT | 处理本机发出的出站数据包 |
FORWARD | 处理需要转发的数据包 |
PREROUTING | 路由选择前处理,如DNAT |
POSTROUTING | 路由选择后处理,如SNAT |
数据包处理流程
入站流程: PREROUTING链(raw→mangle→nat)→路由选择→INPUT链(mangle→filter)→应用程序
转发流程: PREROUTING链→路由选择→FORWARD链→POSTROUTING链
出站流程: 应用程序→路由选择→OUTPUT链(raw→mangle→nat→filter)→POSTROUTING链(mangle→nat)
规则匹配策略
- 自上而下顺序匹配
- 匹配到规则即停止
- 根据规则动作(ACCEPT/DROP/REJECT等)处理数据包
三、 Iptables 配置
基本语法
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
注意:
- 链名必须大写
- 控制类型必须大写
常用管理选项
选项 | 作用 |
---|---|
-A | 链末追加规则 |
-I | 链首插入规则(默认)或指定位置插入 |
-R | 替换指定规则 |
-P | 设置链的默认策略 |
-D | 删除指定规则 |
-F | 清空链中所有规则 |
-L | 列出规则 |
-n | 数字形式显示 |
-v | 显示详细信息 |
--line-numbers | 显示规则序号 |
常用控制类型
类型 | 作用 |
---|---|
ACCEPT | 允许通过 |
DROP | 静默丢弃 |
REJECT | 拒绝并返回响应 |
SNAT | 源地址转换 |
DNAT | 目的地址转换 |
MASQUERADE | 动态IP伪装 |
LOG | 记录日志 |
常用匹配条件
条件 | 说明 |
---|---|
-p | 协议类型 |
-s | 源地址 |
-d | 目的地址 |
-i | 入站网卡 |
-o | 出站网卡 |
--sport | 源端口 |
--dport | 目的端口 |
配置示例
添加规则
# 拒绝ICMP
iptables -t filter -A INPUT -p icmp -j REJECT# 允许SSH(22端口)
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT# 指定位置插入规则
iptables -t filter -I INPUT 2 -p tcp --dport 22 -j ACCEPT
查看规则
# 查看filter表所有规则
iptables -t filter -L# 数字形式显示详细信息
iptables -t filter -nvL# 显示INPUT链规则及序号
iptables -t filter -nvL INPUT --line-numbers
删除规则
# 按序号删除
iptables -D INPUT 3# 按内容删除
iptables -D INPUT -p icmp -j REJECT
清空规则
# 清空OUTPUT链
iptables -F OUTPUT# 清空所有规则
iptables -F
修改规则
# 修改已有规则
iptables -t filter -R INPUT 1 -p icmp -j ACCEPT# 修改默认策略
iptables -P FORWARD DROP
四、 规则匹配
1. 通用匹配
可直接使用,不依赖其他条件:
类型 | 选项 |
---|---|
协议匹配 | -p 协议名 |
地址匹配 | -s 源地址 -d 目的地址 |
接口匹配 | -i 入站网卡 -o 出站网卡 |
示例:
# 接受非ICMP协议数据包
iptables -A INPUT ! -p icmp -j ACCEPT# 丢弃特定主机数据包
iptables -A INPUT -s 192.168.116.20 -j DROP# 拒绝网段从指定网卡进入
iptables -I INPUT -i ens33 -s 192.168.110.0/24 -j REJECT
2. 隐含匹配
需配合特定协议使用,如端口、TCP标记、ICMP类型等。
注意事项:
--sport
和--dport
必须与-p
参数指定的协议配合使用
端口匹配类型
参数 | 作用 |
---|---|
--sport 1000 | 匹配源端口为1000的数据包 |
--sport 1000:3000 | 匹配源端口在1000-3000范围内的数据包 |
--dport :3000 | 匹配目标端口≤3000的数据包 |
--dport 1000: | 匹配目标端口≥1000的数据包 |
应用示例:
# 允许TCP 20和21端口通过(FTP数据包)
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT# 丢弃192.168.11.0网段转发的TCP 24000-24500端口数据
iptables -I FORWARD -d 192.168.11.0/24 -p tcp --dport 24000:24500 -j DROP
TCP标记匹配
需配合-p tcp
使用,指定TCP标记(SYN/ACK/RST/URG/PSH/FIN)
# 允许SYN请求包,拒绝其他
iptables -A INPUT -p tcp --tcp-flags SYN,RST,ACK SYN -j ACCEPT# 拒绝22端口的SYN包
iptables -I INPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT# 拒绝输出22端口的SYN/ACK包
iptables -I OUTPUT -p tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
ICMP类型匹配
需配合-p icmp
使用,指定ICMP类型(可通过iptables -p icmp -h
查看)
类型 | 代码 | 含义 |
---|---|---|
Echo-Request | 8 | 请求 |
Echo-Reply | 0 | 回显 |
Destination-Unreachable | 3 | 目标不可达 |
# 丢弃ICMP请求包(禁止ping本机)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP# 丢弃ICMP回显包(禁止本机ping通他人)
iptables -A INPUT -p icmp --icmp-type 0 -j DROP# 允许显示目标不可达
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
3. 显式匹配
需使用-m
参数指定扩展模块类型,包括多端口、MAC地址、IP范围等。
多端口匹配
# 允许TCP 20,21,22,53端口
iptables -A INPUT -p tcp -m multiport --dport 20,21,22,53 -j ACCEPT# 允许UDP 53,67,68端口
iptables -A INPUT -p udp -m multiport --dport 53,67,68 -j ACCEPT
IP范围匹配
# 禁止转发源IP为192.168.10.100-200的UDP数据
iptables -A FORWARD -p udp -m iprange --src-range 192.168.10.100-192.168.10.200 -j DROP# 禁止发送目的IP为192.168.10.100-200的UDP数据
iptables -A INPUT -p udp -m iprange --dst-range 192.168.10.100-192.168.10.200 -j DROP
MAC地址匹配
iptables -A INPUT -m mac --mac-source 00:0C:29:XX:XX:XX -j DROP
状态匹配
常见连接状态:
- NEW:首次连接请求
- ESTABLISHED:已建立连接
- RELATED:相关连接
- INVALID:无效包
# 允许新建22端口连接
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT# 允许已建立和相关连接通过
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT# 设置默认策略为DROP(创建白名单)
iptables -P INPUT DROP
五、NAT地址转换配置
1. SNAT配置
应用场景:局域网共享公网IP访问Internet
配置示例:
# 固定公网IP转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to 10.0.0.100# IP范围转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens33 -j SNAT --to-source 10.0.0.1-10.0.0.10# 动态IP转换
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
2. DNAT配置
应用场景:公网访问内网服务器
配置示例:
iptables -t nat -A PREROUTING -i ens33 -d 10.0.0.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2
六、策略备份与恢复
# 备份策略
iptables-save > /opt/iptables.bak# 恢复策略
iptables-restore < /opt/iptables.bak# 重启服务
systemctl restart iptables
##查看配置文件中的默认策略
[root@localhost opt]#cat /etc/sysconfig/iptables-config
##使用iptables -nL查看修改过的策略
[root@localhost opt]#iptables -nL
##对自定义的iptables策略做备份(将命令导入一个备份文件iptables.bak)
[root@localhost opt]# iptables-save > /opt/iptables.bak
[root@localhost opt]# cd /opt
[root@localhost opt]# cat iptables.bak
##重启服务(用作模拟未保留修改的策略),再查看发现策略又恢复成了配置文件中的默认策略
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL
##将备份文件中的策略恢复到配置文件中,再重启服务就还原成功了
[root@localhost opt]# iptables-restore < /opt/iptables.bak
[root@localhost opt]# systemctl restart iptables.service
[root@localhost opt]# iptables -nL