iptables 包过滤和网络地址转换
概述
- 防火墙就是访问控制技术,由规则和动作组成
- 工作在网络层
iptables 启停
-
启停
systemctl start firewalld.service systemctl restart firewalld.service systemctl stop firewalld.service
netfilter
- netfilter 位于Linux 内核中的包过滤功能体系,称为Linux 防火墙的“内核态”。
- iptables 位于/sbin/iptables,用来管理防火墙规则的工具,称为Linux 防火墙的“用户态”。
- 以上两种称呼都可以标识Linux 防火墙,同时可以通过服务名firewalld.service 来管理防火墙。
查看 iptablles 规则
iptables -nvL
数据包五元组
- 源 ip、目的 ip、源 port、目的 port、协议(tcp、udp、icpm……)
iptables 匹配逻辑
- 不指定表名时,默认指 filter 表;
- 不指定链名时,默认值表内所有链;
- 除非设置链的默认策略,否则必须指定匹配条件;
- 选项、链名、控制类型(动作)使用大写字母,其余均为小写;
- 不指定序号的时,默认第一条规则(首链);
- 从上到下,以此匹配;
- 如果匹配到了规则,立即执行动作(控制类型),结束匹配;
- 如果没有匹配到规则,则执行默认动作。
iptables 四表五链
规则表
表的作用就是容纳各种规则链,根据不同的功能,表有如下类别:
规则表名称 | 作用 | 说明 |
---|---|---|
raw | 流量跟踪 | 确定是否对该数据包进行状态跟踪 |
mangle | 流量“整容” | 为数据包设置标记 |
nat | 地址转换 | 修改数据包中的源、目标IP 地址或端口 |
filter | 过滤,筛选 | 确定是否放行该数据包 |
规则链
规则链的作用就是对数据包进行过滤或处理,链中可以容纳各种防护墙规则,根据处理数据包的不同时机,规则链有如下分类:
规则链名称 | 作用 | 说明 |
---|---|---|
INPUT | 处理入站数据包 | 数据访问本机时候所限制规则的编写位置 |
PREROUTING | 在进行路由选择前处理数据包 | |
FORWARD | 处理转发数据包 | 是否允许数据经过我进行转发 |
POSTROUTING | 在进行路由选择后处理数据包 | |
OUTPUT | 处理出站数据包 | 数据包向外发所写的规则限制(一般不写规则) |
匹配流程
规则表之间的顺序:raw-> mangle-> nat-> filter。
规则链之间的顺序。
- 入站:PREROUTING INPUT
- 出站:OUTPUT POSTROUTING
- 转发:PREROUTING FORWARD POSTROUTING
规则链内匹配的顺序:
- 按顺序依次检查,匹配即停止
- 若找不到相匹配的规则,则按该链的默认策略处理
匹配流程示意图:
匹配条件
通用匹配
独立使用,可以直接使用,不依赖与其他条件或扩展,包括网络协议、IP 地址、网络接口等条件。
常见通用匹配条件:
匹配条件 | 参数 | 可选参数 |
---|---|---|
协议匹配 | -p 协议名 | {all| tcp| udp| icmp} |
地址匹配 | -s 源地址 -d 目的地址 | 全部 ip 0.0.0.0/0 特定 ip 192.168.1.100/32 |
接口匹配 | -i 入站网卡 -o 出站网卡 |
示例:
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT # ! 标识条件取反
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -I INPUT -s 10.20.30.0/24 -j DROP
iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP # eth1 外网接口
iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
隐含匹配
要求以特定的协议匹配作为前提,包括端口、TCP 标记、ICMP 类型的条件。
常用隐含匹配条件:
匹配方式 | 选项 | 说明 |
---|---|---|
端口匹配 | –sport 源端口 --dport 目的端口 | |
TCP 标记类型 | –tcp-flags 检查范围 被设置的标记 | |
ICMP 类型 | –icmp-type ICMP 类型 | {8|0|3} 8 请求 0 回应 3 不可达 |
显式匹配
要求以“-m 扩展模块” 的形式明确指出类型,包括多端口、MAC 地址、IP 范围、数据包状态等等条件。
常用显式匹配条件:
匹配方式 | 选项 | 说明 |
---|---|---|
多端口匹配 | -m multiport --sport 源端口列表 -m multiport --dport 目的端口列表 | |
IP 范围匹配 | -m iprange --src-range IP 范围 | |
MAC 地址匹配 | -m mac --mac-source MAC 地址 | |
连接状态匹配 | -m state --state 连接状态 |
动作(控制类型)
控制类型 | 动作说明 |
---|---|
ACCEPT | 允许通过。 |
DROP | 直接丢弃,不给出任何回应。 |
REJECT | 拒绝通过,必要时给出提示。 |
LOG | 记录日志信息,然后传给下一条规则继续匹配。 |
基本语法
语法构成
-
核心思想:
iptables 操作哪个张表,哪个链,符合什么流量,执行什么动作
iptables -t 表名 选项 [数字] 链名 [匹配条件] [-j 控制类型]。
-
管理选项
-
例 iptables 的 SNAT 转换规则
iptables -t nat -I POSTROUTING -p all -s 0.0.0.0/0 -o ens32 -j SNAT --to-source 10.4.7.130 -t # table -I # Insert -P # protocol -s # source ip -o # output 出接口网卡 -j # 控制类型
查看规则列表
iptables -nvL
# 列出所有表和链上的规则
iptables -t filter -nvL
# 列出 filter 表中的规则
iptables -nvL --line-numbers
# 在输出中显示规则的行号,方便查找和管理规则
watch -n1 iptables -t filter -nvL --line-numbers
# 动态监控 filter 表 -n1 表示一秒刷新一次
删除/清空规则
iptables -t filter -D INPUT 1
# 删除第一条规则(新插入的)
iptables -F
# 清空 filter 表中的所有规则
iptables -t nat -F
# 清空 nat 表中的所有规则
iptables -t mangle -F
# 清空 mangle 表中的所有规则
iptables -t raw -F
# 清空 raw 表中的所有规则
导入/还原
-
导入
iptables-save > /opt/iprules_all.txt head /opt/iprules_all.txt
-
还原(启动后)
iptables-restore < /opt/iprules_all.txt
添加新规则
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
iptables -t filter -I INPUT -p icmp -j ACCEPT
练习
禁止 ping 网关
-
设置防火墙规则前
连通性测试
-
GW 设置规则
iptables -t filter -I INPUT -p icmp -s 0.0.0.0/0 -j REJECT
连通性测试
只让 server ping 网关
-
删除刚刚建立的规则
iptables -t filter -D INPUT 1
-
建立规则,禁止 server(172.16.1.100) ping 网关
GW 设置规则
iptables -t filter -I INPUT -p icmp -s 172.16.1.100/32 -j REJECT
-
建立规则后,server 无法 ping 通网关
Client 仍可以 ping 通 GW
开放dns 服务
-
开启防火墙后,无法使用 DNS 解析功能
-
防火墙新建规则开放 DNS 解析
iptables -t filter -I INPUT -p udp -s 0.0.0.0/0 --dport 53 -j ACCEPT
验证
查看防火墙配置
iptables -t filter -nvL --line-numbers
防火墙规则备份
-
导出防火墙规则
iptables-save > /opt/iprules_all.txt
重启防火墙
-
重启
systemctl restart firewalld.service
-
重启后之前的规则失效
-
server ping GW 可以 ping
-
dns 无法解析
-
防火墙规则导入还原
-
导入还原规则
iptables-restore < /opt/iprules_all.txt
-
验证
-
server ping GW 无法 ping
-
dns 可以解析
-