前言
防火墙是网络安全中非常重要的设备,是一种将内部网络和外部网络隔离开的技术。简单来说,防火墙技术就是访问控制技术,由规则和动作组成。
目录
1. Linux 包过滤防火墙
1 .1 概述
iptables: 指的是管理Linux防火墙的命令程序,主要是针对网络层的,对象是IP数据包,这也是为什么叫做包过滤。
1 .2 四表五链结构
iptables的结构可以概括为四表五链。
表中存放的是链,链中存放的是规则。
1 . 2 .1 规则表
表分为四类:
规则表 | 作用 | 说明 |
---|---|---|
raw | 流量跟踪 | 确定是否对该数据包进行状态跟踪 |
mangle | 流量修改 | 为数据包设置标记,负责对数据包进行修改和追踪 |
nat | 地址转换 | 修改数据包中的源、目标IP地址或端口 |
filter | 过滤、筛选 | 确定是否放行该数据包 |
1 . 2 .2 规则链
对数据包进行过滤和处理,链中存放着各种防护墙规则。
规则链 | 作用 | 说明 |
---|---|---|
INPUT | 处理入站数据包 | 数据访问的时候限制规则编写的位置 |
PREROUTING | 在进行路由选择前出处理数据包 | |
FORWARD | 处理转发数据包 | 是否允许数据进行转发 |
POSTROUTING | 在进行路由选择后处理数据包 | |
OUTPUT | 处理出站数据包 | 数据包向外方式所写的规则限制 |
1 . 2 .3 表链结构关系图
1 . 2 .4 匹配流程
表之间的顺序:raw -> mangle -> nat -> filter。
链路之间的顺序:
- 入站:PREROUTING INPUT
- 出站:OUTPUT POSTROUTING
- 转发:PREROUTING FORWARD POSTROUTING
1 .3 iptables 命令
1 . 3 .1 语法结构
iptables [-t 表名] 选项 [数字] 链名 [匹配条件] [-j 控制类型]
核心思路: iptables操作哪张表、哪条链,符合什么流量,执行什么动作。
注意事项:
- 不指定表名时,默认指filter表
- 不指定链名时,默认指表内所有链
- 必须设置匹配条件,除非设置链的默认策略
- 选项、链名、控制类型使用大写,其他用小写
- 不指定序号时,默认第一条规则
- 如果匹配到了规则,立即执行动作,结束匹配
- 如果没有匹配到规则,执行默认动作
1 . 3 .2 常见控制类型
控制类型 | 说明 |
---|---|
ACCEPT | 允许通过 |
DROP | 丢弃 |
REJECT | 解决通过,必要时会给提示 |
LOG | 记录日志信息,然后传给下一条规则进行匹配 |
1 . 3 .3 选项
类别 | 选项 | 说明 |
---|---|---|
1. 添加新规则 | -A | 在链的末尾追加一条规则 |
-I | 在链的开头(或者指定序列号)插入一条规则 | |
2. 查看规则表 | -L | 列出所有的规则条目 |
-n | 以数字形式显示地址、端口等信息 | |
-v | 以更详细的方式显示规则信息 | |
-line-numbers | 查看规则时,显示规则的序号 | |
3. 删除、清空规则 | -D | 删除链内只当序号(或内容)的一条规则 |
-F | 清空所有的规则 | |
4. 设置默认策略 | -P | 为指定的链设置默认规则 |
例子:
# 规则添加
# 插入一条规则,允许访问192.168.1.120
iptables -I INPUT -s 192.168.1.120 -j ACCEPT
# 追加一条规则,解决访问192.168.1.120
iptables -A INPUT -s 192.168.1.120 -j REJECT
# 查询信息
# 查看指定nat表,默认不加 -t 就是指filter表
iptables -t nat -L
# 查看指定raw表
iptables -t raw -L
# 列出INPUT链的详细信息
iptables -vL INPUT
# 规则删除
# 删除第2条规则
iptables -D INPUT 2
# 设置默认规则
# 将nat表的INPUT来拿的默认策略设置为ACCEPT
iptables -t nat -P INPUT ACCEPT
1 . 3 .4 匹配条件
匹配条件分为三种:通用匹配、隐含匹配和显示匹配。
1)通用匹配
独立使用,可以直接使用。
匹配方式 | 参数 |
---|---|
协议匹配 | -p 协议名 {all | tcp | udp | icmp} |
地址匹配 | -s 源地址 -d 目的地址 |
接口匹配 | -i 入站网卡 -o 出站网卡 |
例子:
# 允许所有的TCP协议进入
iptables -A INPUT -p tcp -j ACCEPT
# 开启ssh 22端口
iptables -A INPUT -p tcp --dport ACCEPT
2)隐含匹配
要求以特定的协议匹配为前提。
匹配方式 | 选项 |
---|---|
端口匹配 | –sport 源端口 –dport 目的端口 |
TCP匹配 | –tcp-flags 检查范围 被设置的标记 |
ICMP匹配 | –icmp-type ICMP类型 |
例子:
# 允许外部主机ping内部主机
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
3)显示匹配
要求以"-m 扩展模块"的形式指出类型。
匹配方式 | 选项 |
---|---|
多端口匹配 | -m multiport --sport 源端口列表 -m multiport --drort 目的端口列表 |
IP 范围匹配 | -m iprange --src-range IP范围 |
MAC 地址匹配 | -m mac --mac-source MAC地址 |
连接状态匹配 | -m state --state 连接状态 |
例子:
# 允许22、80端口进入并开启ssh协议
iptables -I INPUT -p ssh -m multiport --dport 22,80 -j ACCEPT
1 . 3 .5 规则备份还原
导出备份规则:
iptables-save > /opt/iprules_all.txt
导入还原备份规则:
iptables-restore < /opt/iprules_all.txt